luat_cmux.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. /**
  2. LuatOS cmux
  3. */
  4. #include "lua.h"
  5. #include "luat_base.h"
  6. #include "luat_msgbus.h"
  7. #include "luat_mem.h"
  8. #include "stdlib.h"
  9. #define LUAT_LOG_TAG "cmux"
  10. #include "luat_log.h"
  11. #ifdef LUAT_USE_MCU
  12. #include "luat_mcu.h"
  13. #endif
  14. #include "luat_shell.h"
  15. #include "luat_str.h"
  16. #include "luat_cmux.h"
  17. luat_cmux_t cmux_ctx;
  18. extern luat_shell_t shell_ctx;
  19. static const uint8_t cmux_crctable[256] = {
  20. 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75,
  21. 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
  22. 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69,
  23. 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
  24. 0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D,
  25. 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
  26. 0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51,
  27. 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
  28. 0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05,
  29. 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
  30. 0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19,
  31. 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
  32. 0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D,
  33. 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
  34. 0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21,
  35. 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
  36. 0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95,
  37. 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
  38. 0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89,
  39. 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
  40. 0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD,
  41. 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
  42. 0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1,
  43. 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
  44. 0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5,
  45. 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
  46. 0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9,
  47. 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
  48. 0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD,
  49. 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
  50. 0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1,
  51. 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF};
  52. static uint8_t cmux_frame_check(const uint8_t *input, int length){
  53. uint8_t fcs = 0xFF;
  54. int i;
  55. for (i = 0; i < length; i++){
  56. fcs = cmux_crctable[fcs ^ input[i]];
  57. }
  58. return (0xFF - fcs);
  59. }
  60. static void uih_main_manage(unsigned char*buff,size_t len){
  61. }
  62. static void uih_shell_manage(unsigned char*buff,size_t len){
  63. char send_buff[128] = {0};
  64. char *data = (char *)luat_heap_malloc(buff[3]>>1);
  65. memcpy(data, buff+4, buff[3]>>1);
  66. if (shell_ctx.echo_enable)
  67. {
  68. sprintf_(send_buff, "%s\r\n", data);
  69. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,send_buff, strlen(send_buff));
  70. memset(send_buff, 0, 128);
  71. }
  72. if (memcmp("AT\r", data, 3) == 0){
  73. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  74. }else if (memcmp("ATI", data, 3) == 0){
  75. #ifdef LUAT_BSP_VERSION
  76. sprintf_(send_buff, "LuatOS-SoC_%s_%s\r\n", LUAT_BSP_VERSION, luat_os_bsp());
  77. #else
  78. sprintf_(send_buff, "LuatOS-SoC_%s_%s\r\n", luat_version_str(), luat_os_bsp());
  79. #endif
  80. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,send_buff, strlen(send_buff));
  81. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  82. }else if (memcmp("AT+LUAFLASHSIZE?", data, 16) == 0){
  83. #ifdef FLASH_FS_REGION_SIZE
  84. sprintf_(send_buff, "+LUAFLASHSIZE: 0X%x\r\n",FLASH_FS_REGION_SIZE);
  85. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,send_buff, strlen(send_buff));
  86. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  87. #endif
  88. }else if (memcmp("AT+LUACHECKSUM=", data, 15) == 0){
  89. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"+LUAFLASHSIZE: 0\r\n", 18);
  90. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  91. }else if (memcmp("AT+RESET", data, 8) == 0){
  92. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  93. luat_os_reboot(0);
  94. }else if (memcmp("ATE0\r", data, 5) == 0 || memcmp("ate1\r", data, 5) == 0) {
  95. shell_ctx.echo_enable = 0;
  96. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  97. }
  98. // 回显开启
  99. else if (memcmp("ATE1\r", data, 5) == 0 || memcmp("ate1\r", data, 5) == 0) {
  100. shell_ctx.echo_enable = 1;
  101. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UIH & ~ CMUX_CONTROL_PF,"OK\r\n", 4);
  102. }
  103. luat_heap_free(data);
  104. }
  105. static void uih_dbg_manage(unsigned char*buff,size_t len){
  106. // char *data = (char *)luat_heap_malloc(len-3);
  107. // memset(data, 0, len-3); // 确保填充为0
  108. // memcpy(data, buff+4, len-4);
  109. char data[128] = {0};
  110. if(cmux_ctx.dbg_state == 1)
  111. memcpy(data, buff+4, len-4);
  112. else
  113. memcpy(data, buff, len);
  114. if (strcmp("dbg",strtok(data, " ")) == 0){
  115. char *command = strtok(NULL, " ");
  116. if (memcmp("start", command, 5) == 0){
  117. luat_dbg_set_hook_state(2);
  118. }else if(memcmp("continue",command,8) == 0){
  119. luat_dbg_set_hook_state(2);
  120. }else if(memcmp("next",command,4) == 0 || memcmp("step",command,4) == 0){
  121. luat_dbg_set_hook_state(4);
  122. }else if(memcmp("stepIn",command,6) == 0 || memcmp("stepin",command,6) == 0){
  123. luat_dbg_set_hook_state(5);
  124. }else if(memcmp("stepOut",command,7) == 0 || memcmp("stepout",command,7) == 0){
  125. luat_dbg_set_hook_state(6);
  126. }else if(memcmp("bt",command,2) == 0){
  127. char *params = strtok(NULL, " ");
  128. if (params != NULL){
  129. luat_dbg_set_runcb(luat_dbg_backtrace, (void*)atoi(params));
  130. }else{
  131. luat_dbg_set_runcb(luat_dbg_backtrace, (void*)-1);
  132. }
  133. }else if(memcmp("vars",command,4) == 0){
  134. char *params = strtok(NULL, " ");
  135. if (params != NULL){
  136. luat_dbg_set_runcb(luat_dbg_vars, (void*)atoi(params));
  137. }else{
  138. luat_dbg_set_runcb(luat_dbg_vars, (void*)0);
  139. }
  140. }else if(memcmp("gvars",command,5) == 0){
  141. luat_dbg_gvars((void*)0);
  142. }else if(memcmp("jvars",command,5) == 0){
  143. luat_dbg_jvars(strtok(NULL, " "));
  144. }else if(memcmp("break",command,5) == 0){
  145. char *sub_command = strtok(NULL, " ");
  146. if (memcmp("clr",sub_command,3) == 0){
  147. luat_dbg_breakpoint_clear(strtok(NULL, " "));
  148. }else if (memcmp("add",sub_command,3) == 0){
  149. luat_dbg_breakpoint_add(strtok(NULL, " "),atoi(strtok(NULL, " ")));
  150. }else if (memcmp("del",sub_command,3) == 0){
  151. char *params = strtok(NULL, " ");
  152. if (params != NULL){
  153. luat_dbg_breakpoint_clear(params);
  154. }else{
  155. luat_dbg_breakpoint_clear(NULL);
  156. }
  157. }
  158. }else {
  159. }
  160. }
  161. // luat_heap_free(data);
  162. }
  163. #ifdef LUAT_USE_YMODEM
  164. #include "luat_ymodem.h"
  165. // static int ymodem_state = 0;
  166. static void* ymodem_handler = NULL;
  167. #endif
  168. static void uih_download_manage(unsigned char*buff,size_t len){
  169. #ifdef LUAT_USE_YMODEM
  170. uint8_t ack, flag, file_ok, all_done;
  171. if (ymodem_handler == NULL) {
  172. ymodem_handler = luat_ymodem_create_handler("/", NULL);
  173. }
  174. luat_ymodem_receive(ymodem_handler, buff, len, &ack, &flag, &file_ok, &all_done);
  175. if (all_done) {
  176. //luat_ymodem_release
  177. }
  178. #endif
  179. }
  180. LUAT_WEAK void luat_cmux_log_set(uint8_t state) {
  181. }
  182. static void cmux_frame_manage(unsigned char*buff,size_t len){
  183. // for (size_t i = 0; i < 10; i++){
  184. // LLOGD("buff[%d]:%02X",i,buff[i]);
  185. // }
  186. if (CMUX_ADDRESS_DLC(buff)==LUAT_CMUX_CH_MAIN){
  187. if (CMUX_CONTROL_ISSABM(buff)){
  188. cmux_ctx.main_state = 1;
  189. luat_cmux_write(LUAT_CMUX_CH_MAIN, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  190. }else if(CMUX_CONTROL_ISDISC(buff)){
  191. cmux_ctx.state = 0;
  192. cmux_ctx.main_state = 0;
  193. cmux_ctx.log_state = 0;
  194. cmux_ctx.dbg_state = 0;
  195. cmux_ctx.download_state = 0;
  196. luat_cmux_write(LUAT_CMUX_CH_MAIN, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  197. }else if(CMUX_CONTROL_ISUIH(buff) && cmux_ctx.main_state == 1){
  198. uih_main_manage(buff,len);
  199. }
  200. }else if (CMUX_ADDRESS_DLC(buff)==LUAT_CMUX_CH_SHELL){
  201. if (CMUX_CONTROL_ISSABM(buff)){
  202. cmux_ctx.shell_state = 1;
  203. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  204. }else if(CMUX_CONTROL_ISDISC(buff)){
  205. cmux_ctx.shell_state = 0;
  206. luat_cmux_write(LUAT_CMUX_CH_SHELL, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  207. }else if(CMUX_CONTROL_ISUIH(buff) && cmux_ctx.shell_state == 1){
  208. uih_shell_manage(buff,len);
  209. }
  210. }else if (CMUX_ADDRESS_DLC(buff)==LUAT_CMUX_CH_LOG){
  211. if (CMUX_CONTROL_ISSABM(buff)){
  212. cmux_ctx.log_state = 1;
  213. luat_cmux_log_set(cmux_ctx.log_state);
  214. luat_cmux_write(LUAT_CMUX_CH_LOG, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  215. }else if(CMUX_CONTROL_ISDISC(buff)){
  216. cmux_ctx.log_state = 0;
  217. luat_cmux_log_set(cmux_ctx.log_state);
  218. luat_cmux_write(LUAT_CMUX_CH_LOG, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  219. }
  220. }else if (CMUX_ADDRESS_DLC(buff)==LUAT_CMUX_CH_DBG){
  221. if (CMUX_CONTROL_ISSABM(buff)){
  222. cmux_ctx.dbg_state = 1;
  223. luat_cmux_write(LUAT_CMUX_CH_DBG, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  224. }else if(CMUX_CONTROL_ISDISC(buff)){
  225. cmux_ctx.dbg_state = 0;
  226. luat_cmux_write(LUAT_CMUX_CH_DBG, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  227. }else if(CMUX_CONTROL_ISUIH(buff) && cmux_ctx.dbg_state == 1){
  228. uih_dbg_manage(buff,len);
  229. }
  230. }else if (CMUX_ADDRESS_DLC(buff)==LUAT_CMUX_CH_DOWNLOAD){
  231. if (CMUX_CONTROL_ISSABM(buff)){
  232. cmux_ctx.download_state = 1;
  233. luat_cmux_write(LUAT_CMUX_CH_DOWNLOAD, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  234. }else if(CMUX_CONTROL_ISDISC(buff)){
  235. cmux_ctx.download_state = 0;
  236. luat_cmux_write(LUAT_CMUX_CH_DOWNLOAD, CMUX_FRAME_UA | CMUX_CONTROL_PF,NULL, 0);
  237. }else if(CMUX_CONTROL_ISUIH(buff) && cmux_ctx.download_state == 1){
  238. uih_download_manage(buff,len);
  239. }
  240. }
  241. }
  242. void luat_cmux_write(int port, uint8_t control,char* buff, size_t len) {
  243. char prefix[5] = {CMUX_HEAD_FLAG_BASIC, CMUX_ADDRESS_EA | CMUX_ADDRESS_CR, 0, 0, 0};
  244. char postfix[2] = {0xFF, CMUX_HEAD_FLAG_BASIC};
  245. int prefix_length = 4;
  246. prefix[0] = CMUX_HEAD_FLAG_BASIC;
  247. prefix[1] = prefix[1] | ((CMUX_DHCL_MASK & port) << 2);
  248. prefix[2] = control;
  249. if (len > CMUX_DATA_MASK){
  250. prefix_length = 5;
  251. prefix[3] = ((CMUX_DATA_MASK & len) << 1);
  252. prefix[4] = (CMUX_HIGH_DATA_MASK & len) >> 7;
  253. }else{
  254. prefix[3] = 1 | (len << 1);
  255. }
  256. luat_shell_write(prefix, prefix_length);
  257. postfix[0] = cmux_frame_check((const uint8_t*)(prefix+1), prefix_length - 1);
  258. if (len > 0)luat_shell_write(buff, len);
  259. luat_shell_write(postfix, 2);
  260. }
  261. //0 成功解析 1 解析头 -1 解析错误丢弃
  262. static int luat_cmux_parse(unsigned char* cmux_buff, int* start, int* end, int cmux_buff_offset){
  263. // LLOGD("luat_cmux_parse start %d",*start);
  264. int length_needed = 5; /* channel, type, length, fcs, flag */
  265. if (cmux_buff[*start]==CMUX_HEAD_FLAG_BASIC&&cmux_buff[*start+1]==CMUX_HEAD_FLAG_BASIC){
  266. if (cmux_buff[*start+2]>>2!=LUAT_CMUX_CH_MAIN && cmux_buff[*start+2]>>2!=LUAT_CMUX_CH_SHELL && cmux_buff[*start+2]>>2!=LUAT_CMUX_CH_LOG && cmux_buff[*start+2]>>2!=LUAT_CMUX_CH_DBG && cmux_buff[*start+2]>>2!=LUAT_CMUX_CH_DOWNLOAD ){
  267. (*start)++;
  268. }
  269. }
  270. if(cmux_buff[*start]==CMUX_HEAD_FLAG_BASIC ){
  271. uint8_t len = (cmux_buff[*start+3]& 254) >> 1;
  272. // if ((cmux_buff[*start+3] & 1) == 0){
  273. // INC_BUF_POINTER(buffer,data);
  274. // frame->data_length += (*data*128);
  275. // fcs = cmux_crctable[fcs^*data];
  276. // length_needed++;
  277. // LOG_D("len_need: %d, frame_data_len: %d.", length_needed, frame->data_length);
  278. // }
  279. len += length_needed;
  280. // for (size_t i = 0; i < 15; i++){
  281. // LLOGD("buff[%d]:%02X",i,cmux_buff[i]);
  282. // }
  283. // LLOGD("luat_cmux_parse start %d",*start);
  284. // LLOGD("cmux_buff[*start+len] %02X",cmux_buff[*start+len]);
  285. if(*start+len<cmux_buff_offset){
  286. if(cmux_buff[*start+len]==CMUX_HEAD_FLAG_BASIC && cmux_frame_check(cmux_buff+*start+1,3) == cmux_buff[*start+len-1]){
  287. *end = *start+len;
  288. // LLOGD("luat_cmux_parse OK");
  289. return 0;
  290. }else{
  291. return -1;
  292. }
  293. }
  294. // LLOGD("luat_cmux_parse start %d",*start);
  295. return 1;
  296. }
  297. return -1;
  298. }
  299. static unsigned char *cmux_buff;
  300. static int cmux_buff_offset = 0;
  301. void luat_cmux_read(unsigned char* buff,size_t len){
  302. // for (size_t i = 0; i < len; i++){
  303. // LLOGD("uart_buff[%d]:0x%02X",i,buff[i]);
  304. // }
  305. if (cmux_buff == NULL) {
  306. cmux_buff = luat_heap_malloc(CMUX_BUFFER_SIZE);
  307. if (cmux_buff == NULL) {
  308. luat_shell_write("cmux buff malloc FAIL!!", 23);
  309. return;
  310. }
  311. }
  312. int start,end;
  313. if (cmux_buff_offset + len >= CMUX_BUFFER_SIZE) {
  314. luat_shell_write("cmux overflow!!!",16);
  315. cmux_buff_offset = 0;
  316. return;
  317. }
  318. memcpy(cmux_buff + cmux_buff_offset, buff, len);
  319. cmux_buff_offset = cmux_buff_offset + len;
  320. cmux_buff[cmux_buff_offset] = 0x00;
  321. // int offset = 0;
  322. next_parse:
  323. start = 0;
  324. end = 0;
  325. // LLOGD("cmux_buff_offset %d",cmux_buff_offset);
  326. while (start < cmux_buff_offset) {
  327. // 解析
  328. int ret = luat_cmux_parse(cmux_buff, &start, &end, cmux_buff_offset);
  329. // int ret = 0; // 因为没有luat_cmux_parse
  330. // end = cmux_buff_offset;//
  331. if (ret == 0) {
  332. // 读取ok, 是完整的一帧, 让luat_cmux_exec按帧格式进行执行
  333. // 把luat_cmux_read2 当exec用
  334. // luat_cmux_read2(cmux_buff + start, end+1 - start);
  335. // unsigned char* sendcmux_frame_buf = (unsigned char*)luat_heap_malloc(end+1-start-2);
  336. // memmove(sendcmux_frame_buf, cmux_buff + start, end+1-start-2);
  337. // cmux_frame_manage(sendcmux_frame_buf,end+1-start-2);
  338. // luat_heap_free(sendcmux_frame_buf);
  339. cmux_frame_manage(cmux_buff + start,end+1-start-2);
  340. // LLOGD("end %d cmux_buff_offset %d",end,cmux_buff_offset);
  341. if (end+1<cmux_buff_offset){
  342. char* transfer_buff = (char*)luat_heap_malloc(cmux_buff_offset-end);
  343. memmove(transfer_buff, cmux_buff + end+1, cmux_buff_offset-end);
  344. memset(cmux_buff,0,CMUX_BUFFER_SIZE);
  345. memmove(cmux_buff, transfer_buff, cmux_buff_offset-end);
  346. cmux_buff_offset = cmux_buff_offset-end;
  347. luat_heap_free(transfer_buff);
  348. // for (size_t i = 0; i < cmux_buff_offset; i++){
  349. // LLOGD("uart_buff[%d]:0x%02X",i,cmux_buff[i]);
  350. // }
  351. goto next_parse;
  352. // return;
  353. }
  354. break;
  355. }
  356. else if (ret == 1) {
  357. // LLOGD("luat_cmux_parse start %d cmux_buff_offset %d",start,cmux_buff_offset);
  358. // // 缺数据
  359. // if (start!=0){
  360. // char* transfer_buff;
  361. // memmove(transfer_buff, cmux_buff + start, cmux_buff_offset-start+1);
  362. // memset(cmux_buff,0,CMUX_BUFFER_SIZE);
  363. // memmove(cmux_buff, transfer_buff, cmux_buff_offset-start+1);
  364. // LLOGD("cmux_buff %02X %02X",cmux_buff[0],cmux_buff[1]);
  365. // cmux_buff_offset = cmux_buff_offset-start+1;
  366. // }
  367. return;
  368. }
  369. else {
  370. //解析错误丢弃
  371. start++;
  372. }
  373. // LLOGD("luat_cmux_read start %d",start);
  374. // 等luat_cmux_read2改完再按情况跳出
  375. // break;
  376. }
  377. memset(cmux_buff,0,CMUX_BUFFER_SIZE);
  378. cmux_buff_offset = 0;
  379. }