luat_shell_air101.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "luat_shell.h"
  2. #include "wm_include.h"
  3. #define LUAT_LOG_TAG "luat.shell"
  4. #include "luat_log.h"
  5. #include "wm_uart.h"
  6. static int drv = -1;
  7. #define CONSOLE_BUF_SIZE 512
  8. extern struct tls_uart_port uart_port[TLS_UART_MAX];
  9. typedef struct console_st
  10. {
  11. size_t rx_data_len;
  12. char rx_buf[CONSOLE_BUF_SIZE]; /*uart rx*/
  13. } console;
  14. static console ShellConsole;
  15. int luat_sendchar(int port,int ch){
  16. if (port == 0){
  17. if(ch == '\n'){
  18. while (tls_reg_read32(HR_UART0_FIFO_STATUS) & 0x3F);
  19. tls_reg_write32(HR_UART0_TX_WIN, '\r');
  20. }
  21. while(tls_reg_read32(HR_UART0_FIFO_STATUS) & 0x3F);
  22. tls_reg_write32(HR_UART0_TX_WIN, (char)ch);
  23. }else if (port == 1){
  24. if(ch == '\n'){
  25. while (tls_reg_read32(HR_UART1_FIFO_STATUS) & 0x3F);
  26. tls_reg_write32(HR_UART1_TX_WIN, '\r');
  27. }
  28. while(tls_reg_read32(HR_UART1_FIFO_STATUS) & 0x3F);
  29. tls_reg_write32(HR_UART1_TX_WIN, (char)ch);
  30. }else if (port == 2){
  31. if(ch == '\n'){
  32. while (tls_reg_read32(HR_UART2_FIFO_STATUS) & 0x3F);
  33. tls_reg_write32(HR_UART2_TX_WIN, '\r');
  34. }
  35. while(tls_reg_read32(HR_UART2_FIFO_STATUS) & 0x3F);
  36. tls_reg_write32(HR_UART2_TX_WIN, (char)ch);
  37. }else if (port == 3){
  38. if(ch == '\n'){
  39. while (tls_reg_read32(HR_UART3_FIFO_STATUS) & 0x3F);
  40. tls_reg_write32(HR_UART3_TX_WIN, '\r');
  41. }
  42. while(tls_reg_read32(HR_UART3_FIFO_STATUS) & 0x3F);
  43. tls_reg_write32(HR_UART3_TX_WIN, (char)ch);
  44. }else if (port == 4){
  45. if(ch == '\n'){
  46. while (tls_reg_read32(HR_UART4_FIFO_STATUS) & 0x3F);
  47. tls_reg_write32(HR_UART4_TX_WIN, '\r');
  48. }
  49. while(tls_reg_read32(HR_UART4_FIFO_STATUS) & 0x3F);
  50. tls_reg_write32(HR_UART4_TX_WIN, (char)ch);
  51. }
  52. return ch;
  53. }
  54. void luat_shell_write(char* buff, size_t len) {
  55. int i=0;
  56. if (drv > -1 && len >= 0) {
  57. while (i<len){
  58. luat_sendchar(drv,buff[i++]);
  59. };
  60. }
  61. }
  62. char* luat_shell_read(size_t *len) {
  63. if(ShellConsole.rx_data_len == 0)
  64. {
  65. *len = 0;
  66. return NULL;
  67. }
  68. if (ShellConsole.rx_data_len > CONSOLE_BUF_SIZE)
  69. ShellConsole.rx_data_len = CONSOLE_BUF_SIZE;
  70. int ret = tls_uart_read(drv, ShellConsole.rx_buf, ShellConsole.rx_data_len);
  71. *len = ret;
  72. return ShellConsole.rx_buf;
  73. }
  74. void luat_shell_notify_recv(void) {
  75. ShellConsole.rx_data_len = 0;
  76. }
  77. int16_t demo_console_rx(uint16_t len, void* user_data){
  78. int uartid = (int)user_data;
  79. if(uartid >= 100)
  80. {
  81. ShellConsole.rx_data_len = CIRC_CNT(uart_port[0].recv.head, uart_port[0].recv.tail, TLS_UART_RX_BUF_SIZE);
  82. luat_shell_notify_read();
  83. }
  84. return 0;
  85. }
  86. void luat_shell_poweron(int _drv) {
  87. drv = _drv;
  88. memset(ShellConsole.rx_buf, 0, CONSOLE_BUF_SIZE + 1);
  89. tls_uart_rx_callback_register(drv,(int16_t(*)(uint16_t, void*))demo_console_rx, NULL);
  90. luat_shell_notify_recv();
  91. }