wireless_client.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include "include.h"
  2. #include "wireless_client.h"
  3. #include "wireless_init.h"
  4. #include "usb_audio.h"
  5. #include "usb_hid.h"
  6. #include "usb_vendor.h"
  7. #include "utils_ring_buffer.h"
  8. #define TRACE_EN 1
  9. #define TRACE_RATE_EN 0
  10. #define TRACE_RATE_PERIOD 400 // Unit: connection interval
  11. #define CFG_CONN_INTV 2 // Unit: 1.25ms
  12. #define CFG_CONN_LAT 1 // Unit: connection interval
  13. #define CFG_CONN_TO 20 // Unit: 10ms
  14. #if TRACE_EN
  15. #define TRACE(...) my_printf("[WIRELESS] ");\
  16. my_printf(__VA_ARGS__)
  17. #define TRACE_R(...) my_print_r(__VA_ARGS__);
  18. #else
  19. #define TRACE(...)
  20. #define TRACE_R(...)
  21. #endif // TRACE_EN
  22. #define SWDIAG(func, filed, value)
  23. #define DBG_FLOW_CTRL_EN 0
  24. static struct {
  25. uint16_t con_handle;
  26. bool is_bond;
  27. wireless_addr_info_typedef bond_addr_info;
  28. } wireless_cb AT(.ram_text.wireless.sta);
  29. static const uint8_t adv_match_seq[4] = {0x03, 0xff, 0x42, 0x06};
  30. /* Expect set to 2 + payload_length(transmit: e.g USB Vendor is 63) */
  31. static uint8_t transmit_buffer[1 + 2 + 63];
  32. #if TRACE_RATE_EN
  33. static uint32_t statistic_frame_count;
  34. static uint32_t statistic_hid_pkts_count;
  35. #endif
  36. /* The max number of caches uploads from transport layer cannot be modify curr Ver. */
  37. static struct {
  38. uint8_t * tbl[5];
  39. uint8_t siz[5];
  40. uint8_t widx;
  41. uint8_t ridx;
  42. uint8_t cnt;
  43. bt_timer_mem_t fc_timer_intance;
  44. bt_timer_handle_t fc_timer_handle;
  45. } wireless_rxbuf_cb AT(.ram_text.wireless.xfer);
  46. #define WIRELESS_RXBUF_RELEASE_TIMEOUT 50 /* ms */
  47. #define wireless_rxbuf_is_empty() (wireless_rxbuf_cb.cnt == 0)
  48. #define wireless_rxbuf_r_advance() {wireless_rxbuf_cb.ridx=(wireless_rxbuf_cb.ridx+1)%5;wireless_rxbuf_cb.cnt--;}
  49. #define wireless_rxbuf_r_head_buf() (wireless_rxbuf_cb.tbl[wireless_rxbuf_cb.ridx])
  50. #define wireless_rxbuf_r_head_siz() (wireless_rxbuf_cb.siz[wireless_rxbuf_cb.ridx])
  51. #define wireless_rxbuf_w_advance() {wireless_rxbuf_cb.widx=(wireless_rxbuf_cb.widx+1)%5;wireless_rxbuf_cb.cnt++;}
  52. #define wireless_rxbuf_w_head_buf() (wireless_rxbuf_cb.tbl[wireless_rxbuf_cb.widx])
  53. #define wireless_rxbuf_w_head_siz() (wireless_rxbuf_cb.siz[wireless_rxbuf_cb.widx])
  54. #define wireless_conn_is_exist() (wireless_cb.con_handle != 0)
  55. AT(.com_text.wireless.transmit)
  56. static void wireless_packet_process(uint8_t *buf, uint32_t size)
  57. {
  58. u8 head = buf[WIRELESS_HEAD_POS];
  59. u8 pos = WIRELESS_PAYLOAD_POS;
  60. u8 *hid_data = NULL;
  61. u8 *mic_data = NULL;
  62. u8 *cmd_data = NULL, cmd_len = 0, cmd_type;
  63. /* Unpack data */
  64. if (head & WIRELESS_HEADER_HID_BIT) {
  65. hid_data = &buf[pos];
  66. pos += WIRELESS_DATA_LENGTH_HID;
  67. #if TRACE_RATE_EN
  68. if (statistic_frame_count > 0 && statistic_frame_count <= TRACE_RATE_PERIOD) {
  69. statistic_hid_pkts_count++;
  70. }
  71. #endif
  72. }
  73. if (head & WIRELESS_HEADER_AUDIO_BIT) {
  74. mic_data = &buf[pos];
  75. pos += WIRELESS_DATA_LENGTH_AUDIO;
  76. }
  77. if (head & WIRELESS_HEADER_CTRL_BIT) {
  78. cmd_data = &buf[pos];
  79. cmd_type = cmd_data[WIRELESS_CMD_DATA_TYPE_POS];
  80. cmd_len = cmd_data[WIRELESS_CMD_DATA_LENGTH_POS];
  81. pos += 2 + cmd_len;
  82. }
  83. /* Check length valid */
  84. if (pos != size) {
  85. TRACE("data length err: %d %d\n", pos, size);
  86. return;
  87. }
  88. /* Process */
  89. #if USB_HID_EN
  90. if (hid_data && sys_cb.usb_is_active) {
  91. usb_hid_buffer_push(hid_data, WIRELESS_DATA_LENGTH_HID);
  92. thread_driver_msg_post(THREAD_DRIVER_MSG_HID_IN);
  93. }
  94. #else
  95. (void)hid_data;
  96. #endif
  97. #if USB_MIC_EN
  98. if (mic_data && sys_cb.usb_is_active) {
  99. SWDIAG(RECV, IO, ENTER);
  100. uda_mic_buffer_prepare(mic_data, WIRELESS_DATA_LENGTH_AUDIO);
  101. thread_driver_msg_post(THREAD_DRIVER_MSG_UAC_DEC);
  102. SWDIAG(RECV, IO, EXIT);
  103. }
  104. #else
  105. (void)mic_data;
  106. #endif
  107. if (cmd_data) {
  108. TRACE("receive cmd - type:0x%02x data[%d]:\n", cmd_type, cmd_len);
  109. TRACE_R(&cmd_data[WIRELESS_CMD_DATA_VALUE_POS], cmd_len);
  110. switch (cmd_type) {
  111. default:
  112. break;
  113. }
  114. }
  115. }
  116. /*
  117. AT(.com_text.wireless.transmit)
  118. NO_INLINE static void wireless_packet_rxbuf_check(void)
  119. {
  120. #if DBG_FLOW_CTRL_EN
  121. uint8_t *packet = wireless_rxbuf_r_head_buf();
  122. uint8_t size = wireless_rxbuf_r_head_siz();
  123. if (wireless_rxbuf_is_empty()) {
  124. return;
  125. }
  126. if (!wireless_conn_is_exist()) {
  127. while (!wireless_rxbuf_is_empty()) {
  128. wireless_rxbuf_release(packet);
  129. wireless_rxbuf_r_advance();
  130. packet = wireless_rxbuf_r_head_buf();
  131. }
  132. return;
  133. }
  134. if ((packet[WIRELESS_HEAD_POS] & WIRELESS_HEADER_HID_BIT)
  135. #if USB_HID_EN
  136. && (!usb_hid_buffer_push_check())
  137. #endif // USB_HID_EN
  138. )
  139. {
  140. return;
  141. }
  142. bt_alarm_timer_stop(wireless_rxbuf_cb.fc_timer_handle);
  143. wireless_packet_process(packet, size);
  144. GLOBAL_INT_DISABLE();
  145. wireless_rxbuf_release(packet);
  146. wireless_rxbuf_r_advance();
  147. GLOBAL_INT_RESTORE();
  148. if (!wireless_rxbuf_is_empty()) {
  149. bt_alarm_timer_start(wireless_rxbuf_cb.fc_timer_handle);
  150. }
  151. #endif
  152. }
  153. */
  154. AT(.text.wireless.transmit)
  155. static void wireless_packet_rxbuf_timeout_callback(bt_timer_handle_t handle)
  156. {
  157. if (!wireless_rxbuf_is_empty()) {
  158. do
  159. {
  160. wireless_rxbuf_release(wireless_rxbuf_r_head_buf());
  161. wireless_rxbuf_r_advance();
  162. }
  163. while (!wireless_conn_is_exist() && !wireless_rxbuf_is_empty());
  164. if (!wireless_rxbuf_is_empty()) {
  165. bt_alarm_timer_start(wireless_rxbuf_cb.fc_timer_handle);
  166. }
  167. }
  168. }
  169. AT(.com_text.dbg.statistic)
  170. void wireless_frame_start_hook(void)
  171. {
  172. #if TRACE_RATE_EN
  173. if (statistic_frame_count <= TRACE_RATE_PERIOD) {
  174. statistic_frame_count++;
  175. }
  176. #endif
  177. }
  178. static void wireless_event_packet_handler(uint8_t event_type, uint8_t *packet, uint8_t size)
  179. {
  180. switch (event_type) {
  181. case WIRELESS_EVENT_CONNECTED:
  182. TRACE("[master]connected - con_handle: 0x%04x\n", GET_LE16(&packet[0]));
  183. wireless_cb.con_handle = GET_LE16(&packet[0]);
  184. memcpy((u8 *)&wireless_cb.bond_addr_info, &packet[2], 7);
  185. /* Record link info */
  186. bsp_wireless_link_info_write(&wireless_cb.bond_addr_info);
  187. wireless_cb.is_bond = true;
  188. /* Trigger event that notify peer the mic and usb status */
  189. thread_driver_msg_post(THREAD_DRIVER_MSG_UAC_MIC_CTRL);
  190. thread_driver_msg_post(THREAD_DRIVER_MSG_USB_IND);
  191. wireless_frame_start_hook_register(wireless_cb.con_handle, wireless_frame_start_hook);
  192. break;
  193. case WIRELESS_EVENT_DISCONNECTED:
  194. TRACE("[master]disconnected - con_handle: 0x%04x reason: 0x%02x\n", GET_LE16(&packet[0]), packet[2]);
  195. wireless_cb.con_handle = 0;
  196. wireless_scan_ctrl(true);
  197. break;
  198. case WIRELESS_EVENT_ADV_REPORT: {
  199. wireless_adv_report_t *adv_msg = (wireless_adv_report_t *)&packet[0];
  200. wireless_adv_slice_t *adv_sli = (wireless_adv_slice_t *)adv_msg->report;
  201. bool found = false;
  202. TRACE("adv report - type: 0x%02x addr: ", adv_msg->addr_type);
  203. TRACE_R(adv_msg->addr, 6);
  204. do {
  205. if (wireless_cb.is_bond) {
  206. if (0 == memcmp(adv_msg->addr, wireless_cb.bond_addr_info.addr, 6)) {
  207. /* It's the last connected device */
  208. found = true;
  209. break;
  210. }
  211. // No break: connects to the last device or any non-directional broadcast device.
  212. }
  213. /* Try to find the specified seq in undir adv data */
  214. while (((u8 *)adv_sli - adv_msg->report) < adv_msg->report_len) {
  215. if (0 == memcmp(adv_sli, adv_match_seq, 4)) {
  216. found = true;
  217. break;
  218. }
  219. adv_sli = (wireless_adv_slice_t *)(adv_sli->data + adv_sli->length - 1);
  220. }
  221. } while (0);
  222. if (found) {
  223. wireless_scan_ctrl(false);
  224. wireless_connect_by_addr(adv_msg->addr, adv_msg->addr_type, CFG_CONN_INTV, CFG_CONN_LAT, CFG_CONN_TO);
  225. }
  226. break;
  227. }
  228. default:
  229. break;
  230. }
  231. }
  232. AT(.com_text.wireless.transmit)
  233. static void wireless_receive_handler(uint16_t con_handle, uint8_t *packet, uint8_t size)
  234. {
  235. #if DBG_FLOW_CTRL_EN
  236. if (con_handle == wireless_cb.con_handle) {
  237. if (wireless_rxbuf_is_empty()) {
  238. bt_alarm_timer_start(wireless_rxbuf_cb.fc_timer_handle);
  239. } else {
  240. /* ASSERT: fc timer already start */
  241. }
  242. wireless_rxbuf_cb.tbl[wireless_rxbuf_cb.widx] = packet;
  243. wireless_rxbuf_cb.siz[wireless_rxbuf_cb.widx] = size;
  244. wireless_rxbuf_w_advance();
  245. } else {
  246. wireless_rxbuf_release(packet);
  247. }
  248. #else
  249. if (con_handle == wireless_cb.con_handle) {
  250. wireless_packet_process(packet, size);
  251. }
  252. wireless_rxbuf_release(packet);
  253. #endif
  254. }
  255. void wireless_client_init(void)
  256. {
  257. TRACE("master init\n");
  258. memset(&wireless_cb, 0x00, sizeof(wireless_cb));
  259. memset(&wireless_rxbuf_cb, 0x00, sizeof(wireless_rxbuf_cb));
  260. wireless_cb.is_bond = bsp_wireless_link_info_read(&wireless_cb.bond_addr_info);
  261. bt_alarm_timer_mem_extend(&wireless_rxbuf_cb.fc_timer_intance, sizeof(wireless_rxbuf_cb.fc_timer_intance));
  262. bt_alarm_timer_acquire(&wireless_rxbuf_cb.fc_timer_handle, WIRELESS_RXBUF_RELEASE_TIMEOUT, 0, wireless_packet_rxbuf_timeout_callback);
  263. wireless_event_handler_register(wireless_event_packet_handler);
  264. wireless_receive_handler_register(wireless_receive_handler);
  265. }
  266. /*
  267. void ble_app_proc(void)
  268. {
  269. #if TRACE_RATE_EN
  270. if (statistic_frame_count > TRACE_RATE_PERIOD) {
  271. TRACE("rate: %dhids/%dFrames\n", statistic_hid_pkts_count, TRACE_RATE_PERIOD);
  272. statistic_hid_pkts_count = 0;
  273. statistic_frame_count = 0;
  274. }
  275. #endif
  276. wireless_packet_rxbuf_check();
  277. }
  278. */
  279. /* Single packet, no compose with HID or AUDIO */
  280. void wireless_send_ctrl_cmd(uint8_t type, uint8_t length, uint8_t *value)
  281. {
  282. u8 *cmd_data = &transmit_buffer[WIRELESS_PAYLOAD_POS];
  283. u8 packet_len = 1 + 2 + length;
  284. u32 tick, timeout = 500;
  285. u8 mtu = 0;
  286. wireless_mtu_get(wireless_cb.con_handle, &mtu);
  287. if (packet_len > mtu || packet_len > sizeof(transmit_buffer)) {
  288. return;
  289. }
  290. cmd_data[WIRELESS_CMD_DATA_TYPE_POS] = type;
  291. cmd_data[WIRELESS_CMD_DATA_LENGTH_POS] = length;
  292. if (length && value) {
  293. memcpy(&cmd_data[WIRELESS_CMD_DATA_VALUE_POS], value, length);
  294. }
  295. transmit_buffer[WIRELESS_HEAD_POS] = WIRELESS_HEADER_CTRL_BIT;
  296. tick = tick_get();
  297. while (wireless_send_for_con(wireless_cb.con_handle, transmit_buffer, packet_len)) {
  298. if (tick_check_expire(tick, timeout)) {
  299. break;
  300. }
  301. delay_5ms(1);
  302. }
  303. }