luat_zlink_wlan.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #include <string.h>
  2. #include "wm_irq.h"
  3. #include "tls_sys.h"
  4. #include "wm_regs.h"
  5. #include "wm_type_def.h"
  6. #include "wm_timer.h"
  7. #include "wm_irq.h"
  8. #include "wm_params.h"
  9. #include "wm_hostspi.h"
  10. #include "wm_flash.h"
  11. #include "wm_fls_gd25qxx.h"
  12. #include "wm_internal_flash.h"
  13. #include "wm_efuse.h"
  14. #include "wm_debug.h"
  15. #include "wm_netif.h"
  16. #include "wm_at_ri_init.h"
  17. #include "wm_config.h"
  18. #include "wm_osal.h"
  19. #include "wm_http_client.h"
  20. #include "wm_cpu.h"
  21. #include "wm_webserver.h"
  22. #include "wm_io.h"
  23. #include "wm_mem.h"
  24. #include "wm_wl_task.h"
  25. #include "wm_wl_timers.h"
  26. #ifdef TLS_CONFIG_HARD_CRYPTO
  27. #include "wm_crypto_hard.h"
  28. #endif
  29. #include "wm_gpio_afsel.h"
  30. #include "wm_pmu.h"
  31. #include "wm_ram_config.h"
  32. #include "wm_uart.h"
  33. #include "luat_conf_bsp.h"
  34. #include "wm_watchdog.h"
  35. #include "wm_wifi.h"
  36. #if TLS_CONFIG_ONLY_FACTORY_ATCMD
  37. #include "../../src/app/factorycmd/factory_atcmd.h"
  38. #endif
  39. #include "wm_flash_map.h"
  40. #include "wm_wifi.h"
  41. #include "luat_base.h"
  42. #include "luat_msgbus.h"
  43. #include "luat_timer.h"
  44. #include "luat_gpio.h"
  45. #include "luat_uart.h"
  46. #include "luat_spi.h"
  47. #include "luat_malloc.h"
  48. #include "luat_uart.h"
  49. #include "luat_zlink.h"
  50. #include "crc.h"
  51. #define LUAT_LOG_TAG "zlink.wlan"
  52. #include "luat_log.h"
  53. uint32_t zlink_pkgid = 0;
  54. extern u8* tls_wifi_buffer_acquire(int total_len);
  55. extern void tls_wifi_buffer_release(bool is_apsta, u8* buffer);
  56. static void zlink_wifi_status_change(uint8_t status) {
  57. LLOGD("wifi status change to %d", status);
  58. }
  59. static int zlink_net_rx_data_cb(const u8 *bssid, u8 *buf, u32 buf_len) {
  60. // LLOGD("net recv %d bytes", buf_len);
  61. // if (buf_len == 60)
  62. // return 0;
  63. printf("net recv %d bytes\n", buf_len);
  64. // u8 mac_source[6];
  65. // u8 mac_dest[6];
  66. // memcpy(mac_source, buf + 6, 6);
  67. // memcpy(mac_dest, buf, 6);
  68. // printf("OUT %02x:%02x:%02x:%02x:%02x:%02x -> %02x:%02x:%02x:%02x:%02x:%02x %u len %u\n",
  69. // mac_source[0], mac_source[1], mac_source[2], mac_source[3], mac_source[4], mac_source[5],
  70. // mac_dest[0], mac_dest[1], mac_dest[2], mac_dest[3], mac_dest[4], mac_dest[5],
  71. // buf[12], buf_len);
  72. uint32_t checksum = calcCRC32(buf, buf_len);
  73. // printf("CRC %08X\n", checksum);
  74. luat_zlink_pkg_t zd = {0};
  75. memcpy(zd.magic, "ZLNK", 4);
  76. zd.pkgid[0] = zlink_pkgid >> 24;
  77. zd.pkgid[1] = zlink_pkgid >> 16;
  78. zd.pkgid[2] = zlink_pkgid >> 8;
  79. zd.pkgid[3] = zlink_pkgid & 0xFF;
  80. zlink_pkgid ++;
  81. zd.cmd0 = 2; // mac包
  82. zd.cmd1 = 1; // 发送
  83. u16 len = buf_len + 4;
  84. zd.len[0] = len >> 8;
  85. zd.len[1] = len & 0xFF;
  86. luat_uart_write(1, &zd, sizeof(luat_zlink_pkg_t));
  87. luat_uart_write(1, "\0\0", 2);
  88. luat_uart_write(1, buf, buf_len);
  89. return 0;
  90. }
  91. //串口数量,编号从0开始
  92. #define MAX_DEVICE_COUNT TLS_UART_MAX
  93. //存放串口设备句柄
  94. static uint8_t serials_buff_len[MAX_DEVICE_COUNT] ={TLS_UART_RX_BUF_SIZE};
  95. extern struct tls_uart_port uart_port[TLS_UART_MAX];
  96. #define BUFF_SIZE (4096)
  97. static u8 uart_buff[BUFF_SIZE];
  98. static uint16_t buff_offset;
  99. static s16 uart_input_cb(u16 len, void* userdata) {
  100. // printf("uart_input_cb %d\n", len);
  101. // if(CIRC_CNT(uart_port[1].recv.head, uart_port[1].recv.tail, TLS_UART_RX_BUF_SIZE)
  102. // < (serials_buff_len[1] - 200))
  103. // return 0;
  104. // if (len == 0)
  105. // return 0;
  106. // if (buff_offset + len > BUFF_SIZE) {
  107. // buff_offset = 0;
  108. // }
  109. len = luat_uart_read(1, uart_buff + buff_offset, BUFF_SIZE - buff_offset);
  110. if (len < 0) {
  111. printf("luat_uart_read %d\n", len);
  112. return 0;
  113. }
  114. if (len == 0) {
  115. return 0;
  116. }
  117. buff_offset += len;
  118. if (buff_offset < 12) {
  119. // printf("数据还不够 %d\n", len);
  120. return 0;
  121. }
  122. luat_zlink_pkg_t* zd = (luat_zlink_pkg_t*)uart_buff;
  123. if (memcmp(zd->magic, "ZLNK", 4) != 0) {
  124. printf("数据包开头不是ZINK\n");
  125. buff_offset = 0;
  126. return 0;
  127. }
  128. u16 zlen = (zd->len[0] << 8) | zd->len[1];
  129. if (buff_offset >= zlen + 12) {
  130. printf("完整的zlink数据包来了\n");
  131. if (zd->cmd0 == 2 && zd->cmd1 == 1) {
  132. // wifi mac包
  133. printf("mac包 %d\n", zlen - 4);
  134. u8* ptr = tls_wifi_buffer_acquire(zlen - 4);
  135. if (ptr) {
  136. printf("发送到wifi\n");
  137. memcpy(ptr, uart_buff + 16, zlen - 4);
  138. tls_wifi_buffer_release(false, ptr);
  139. }
  140. else {
  141. printf("wifi buffer full?\n");
  142. }
  143. }
  144. buff_offset -= zlen + 12;
  145. }
  146. else {
  147. // printf("数据包不完整,等待数据\n");
  148. }
  149. return 0;
  150. }
  151. void luat_zlink_wlan_init(void) {
  152. // tls_uart_options_t opt = {0};
  153. // opt.baudrate = UART_BAUDRATE_B115200;
  154. // opt.charlength = TLS_UART_CHSIZE_8BIT;
  155. // opt.flow_ctrl = TLS_UART_FLOW_CTRL_NONE;
  156. // opt.paritytype = TLS_UART_PMODE_DISABLED;
  157. // opt.stopbits = TLS_UART_ONE_STOPBITS;
  158. // tls_uart_port_init(1, &opt, 0);
  159. luat_uart_t conf = {0};
  160. conf.id = 1;
  161. conf.baud_rate = 115200;
  162. conf.data_bits = 8;
  163. conf.stop_bits = 1;
  164. conf.parity = LUAT_PARITY_NONE;
  165. luat_uart_setup(&conf);
  166. tls_uart_rx_callback_register(1, uart_input_cb, NULL);
  167. tls_wifi_status_change_cb_register(zlink_wifi_status_change);
  168. tls_ethernet_data_rx_callback(zlink_net_rx_data_cb);
  169. }