qtest.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. #include "include.h"
  2. #if QTEST_EN
  3. enum{
  4. QTEST_STA_INBOX,
  5. QTEST_STA_OUTBOX,
  6. QTEST_STA_DCIN,
  7. };
  8. typedef struct {
  9. u8 *bd_addr;
  10. u8 *link_key;
  11. u8 channel;
  12. u8 rsvd[3];
  13. } tws_link_info_t;
  14. qtest_cb_t qtest_cb;
  15. u8 qtest_get_mode(void);
  16. void qtest_send_msg2tbox(u8 *buf,u16 len);
  17. u8 qtest_get_heart_pkt_delay(void);
  18. void qtest_dec_heart_pkt_delay(void);
  19. u8* qtest_get_txbuf(void);
  20. void qtest_beforehand_process(void);
  21. u8* qtest_get_txbuf(void)
  22. {
  23. return qtest_cb.other_usage_txbuf;
  24. }
  25. u8 qtest_check_tws_master_addr(u8* bt_addr)
  26. {
  27. u8 ms_role = bt_tws_get_tws_role();
  28. if(!ms_role) {
  29. bt_get_local_bd_addr(bt_addr);
  30. }
  31. return ms_role;
  32. }
  33. AT(.com_text.qtest)
  34. void qtest_set_flag_cb(u8 flag)
  35. {
  36. qtest_cb.flag = flag;
  37. qtest_cb.sta = 1;
  38. }
  39. static bool qtest_vusb_dma_en(void)
  40. {
  41. if ((TEST_INTF_SEL == INTF_HUART) || qtest_get_mode()) {
  42. return true;
  43. }
  44. return false;
  45. }
  46. void qtest_send_msg_cb(u8 *buf, u16 len)
  47. {
  48. if(qtest_vusb_dma_en()) {
  49. huart_tx(buf,len);
  50. } else {
  51. for(u8 i =0;i<len;i++){
  52. uart1_putchar(buf[i]);
  53. }
  54. }
  55. }
  56. //删除TWS配对信息
  57. AT(.text.qtest.info)
  58. void qtest_delete_tws_link_info_cb(void)
  59. {
  60. bt_clr_master_addr();
  61. bt_nor_delete_link_info();
  62. bt_tws_delete_link_info_with_tag(BT_INFO_TAG_QTEST, (uint32_t)__builtin_return_address(0));
  63. #if TRACE_EN
  64. printf("qtest_delete\n");
  65. #endif
  66. }
  67. //保存新的TWS配对信息到flash
  68. AT(.text.qtest.info)
  69. bool qtest_store_tws_link_info_cb(tws_link_info_t *info)
  70. {
  71. u8 lr_channel = info->channel;
  72. bt_tws_channel_check(lr_channel);
  73. qtest_delete_tws_link_info_cb();
  74. u8 ms_role = qtest_check_tws_master_addr(info->bd_addr);
  75. tws_update_local_addr(info->bd_addr);
  76. bt_tws_put_link_info_addr(info->bd_addr, info->link_key);
  77. bt_tws_put_link_info_feature(info->bd_addr, ms_role);
  78. #if TRACE_EN
  79. printf("qtest_create: ch=%x\n",info->channel);
  80. print_r(info->bd_addr, 6);
  81. print_r(info->link_key, 16);
  82. #endif // TRACE_EN
  83. return true;
  84. }
  85. //保存客户自定义信息到flash
  86. AT(.text.qtest.info)
  87. void qtest_store_custom_params_cb(u8 *param, u8 size)
  88. {
  89. #if TRACE_EN
  90. printf("qtest_custom%d:", size);
  91. print_r(param, size);
  92. #endif
  93. }
  94. //传给测试盒数据用于显示,测试盒需要打开“显示耳机传入信息”的功能,可自定义显示内容
  95. //第0byte为:字符串数据
  96. //第1byte为:数值
  97. void qtest_show_user_info(u8* param)
  98. {
  99. param[0] = 'V';
  100. param[1] = (u8)bsp_get_bat_level();
  101. }
  102. void qtest_custom_pair_id(u8* param)
  103. {
  104. uint pair_id = bt_tws_get_pair_id();
  105. memcpy(param,(u8*)&pair_id,4) ;
  106. }
  107. WEAK u32 xcfg_get_flash_addr(void)
  108. {
  109. return 0;
  110. }
  111. //修正1拖24的校频会影响校验码对比的问题
  112. AT(.text.qtest)
  113. u32 qtest_get_osci_cap_addr(void)
  114. {
  115. u32 offest_addr = xcfg_get_flash_addr();
  116. if(offest_addr != 0) {
  117. offest_addr += (u8*)(&xcfg_cb.osci_cap) - (u8*)&xcfg_cb;
  118. }
  119. return offest_addr;
  120. }
  121. AT(.text.qtest)
  122. static bool qtest_pwroff_check(u8 mode)
  123. {
  124. static u32 inbox_tick = 0;
  125. static u8 ear_sta = 0;
  126. u8 pre_ear_sta = ear_sta;
  127. if(mode == 0) {
  128. return false;
  129. }
  130. if(!tick_check_expire(inbox_tick, 10)) {
  131. return false;
  132. }
  133. inbox_tick = tick_get();
  134. if(qtest_get_heart_pkt_delay()) { //发完心跳包后延时段时间再检测状态
  135. qtest_dec_heart_pkt_delay();
  136. if (qtest_cb.inbox_cnt) {
  137. qtest_cb.inbox_cnt--;
  138. }
  139. return false;
  140. }
  141. if(CHARGE_DC_IN()) {
  142. ear_sta = QTEST_STA_DCIN;
  143. } else if(CHARGE_INBOX()) {
  144. ear_sta = QTEST_STA_INBOX;
  145. } else {
  146. ear_sta = QTEST_STA_OUTBOX;
  147. }
  148. if((ear_sta == QTEST_STA_INBOX) || ( pre_ear_sta != ear_sta)) {
  149. qtest_cb.inbox_cnt = 150;
  150. }
  151. // my_printf("*%x_%d",ear_sta,qtest_cb.inbox_cnt);
  152. if(!qtest_cb.inbox_cnt--) {
  153. qtest_exit();
  154. //拿起复位
  155. if((qtest_get_pickup_sta() == 2) || (ear_sta == QTEST_STA_DCIN)) {
  156. if(bt_nor_is_connected()){
  157. bt_nor_disconnect();
  158. }
  159. sw_reset_kick(SW_RST_FLAG);
  160. } else if(qtest_get_pickup_sta() == 1) {
  161. //拿起关机
  162. if(mode == SW_RST_QTEST_NORMAL) {
  163. msg_enqueue(EVT_QTEST_PICKUP_PWROFF);
  164. } else if(mode == SW_RST_QTEST_ONLY_PAIR) {
  165. bsp_saradc_exit();
  166. sfunc_pwrdown(1);
  167. }
  168. } else if(mode == SW_RST_QTEST_ONLY_PAIR) {
  169. bsp_saradc_exit();
  170. sfunc_pwrdown(1);
  171. }
  172. return true;
  173. }
  174. return false;
  175. }
  176. AT(.text.qtest)
  177. static void qtest_xcfg_init(void)
  178. {
  179. //开快速测试关闭入仓关机
  180. xcfg_cb.chg_inbox_pwrdwn_en = 0;
  181. xcfg_cb.bt_tswi_charge_rst_en = 0;
  182. if (qtest_get_mode()) {
  183. xcfg_cb.bt_tws_en = 0;
  184. xcfg_cb.bt_spp_en = 0;
  185. xcfg_cb.bt_rf_page_pwrdec = 0;
  186. // xcfg_cb.bt_rf_inq_pwrdec=0;
  187. xcfg_cb.lpwr_off_vbat = 0;//低电不关机
  188. xcfg_cb.charge_en = 0;
  189. xcfg_cb.ble_en = 0;
  190. xcfg_cb.huart_sel = HUART_TR_VUSB;
  191. RTCCON8 |= BIT(4); //仓的最低维持电压为1.7V
  192. charge_box_leakage_set(1, 0); //enable leakage
  193. // param_tws_channel_write(0);
  194. // qtest_tws_message_init();
  195. }
  196. }
  197. AT(.text.qtest)
  198. void qtest_other_usage_process(void)
  199. {
  200. u8 *tx_buf = qtest_get_txbuf();
  201. if (qtest_cb.ack != qtest_cb.flag) {
  202. qtest_cb.ack = qtest_cb.flag;
  203. qtest_cb.flag = 0;
  204. if (qtest_cb.ack == QTEST_MODE_DUT) {
  205. func_cb.sta = FUNC_BT_DUT;
  206. } else if (qtest_cb.ack == QTEST_MODE_CLR_INFO) {
  207. qtest_delete_tws_link_info_cb();
  208. func_cb.sta = FUNC_NULL;
  209. } else if ((qtest_cb.ack == QTEST_MODE_PWROFF) || (qtest_cb.ack == QTEST_MODE_PWROFF_LP)) {
  210. if (qtest_cb.ack == QTEST_MODE_PWROFF_LP) {
  211. qtest_cb.pdn_boat_flag = 1;
  212. }
  213. sys_cb.discon_reason = 0;//不同步关耳机
  214. func_cb.sta = FUNC_PWROFF;
  215. }
  216. tx_buf[0] = 'S';
  217. tx_buf[1] = 'I';
  218. tx_buf[2] = 'G';
  219. tx_buf[3] = qtest_cb.ack;
  220. qtest_send_msg2tbox(tx_buf,4);
  221. qtest_cb.ack = 0;
  222. }
  223. }
  224. //快测快配的主程序
  225. AT(.text.qtest)
  226. void qtest_process_do(void)
  227. {
  228. u8 mode = qtest_get_mode();
  229. qtest_pwroff_check(mode);
  230. qtest_deal_uart_message();
  231. WDT_CLR();
  232. vusb_reset_clr();
  233. }
  234. AT(.text.qtest)
  235. void qtest_only_pair_process(void)
  236. {
  237. qtest_xcfg_init();
  238. set_vusb_uart_flag(0);
  239. bsp_huart_init();
  240. while(1){
  241. qtest_process_do();
  242. }
  243. }
  244. ///////////////////////////////////////////////////////////
  245. AT(.text.qtest.process)
  246. void qtest_process(void)
  247. {
  248. if(qtest_get_mode()) {
  249. qtest_process_do();
  250. } else {
  251. if (qtest_cb.ack != qtest_cb.flag) {
  252. qtest_other_usage_process();
  253. }
  254. }
  255. }
  256. AT(.text.qtest)
  257. void qtest_init(void)
  258. {
  259. // TRACE("qtest_init\n");
  260. memset(&qtest_cb,0x00,sizeof(qtest_cb_t));
  261. qtest_cb.inbox_cnt = 150;
  262. u8 res = qtest_mode_init(sys_cb.sw_rst_flag);
  263. if (res) {
  264. if((res == 1) || ((TEST_INTF_SEL == INTF_HUART))) {
  265. //进入快测或者使用HUART接口时,使用HUART DMA的方式进行串口通讯
  266. sys_cb.vusb_uart_flag = 0;
  267. xcfg_cb.huart_en = 1;
  268. xcfg_cb.huart_sel = HUART_TR_VUSB;
  269. bsp_huart_init();
  270. } else {
  271. //HUART被其他调试接口占用时,可以用UART1进入快测模式
  272. bsp_uart1_init(9600);
  273. }
  274. bt_tws_channel_read();
  275. //先确定系统左右耳
  276. tws_lr_xcfg_sel();
  277. qtest_xcfg_init();
  278. //先发送蓝牙地址给到测试盒,加速快测
  279. if(res == 1){
  280. qtest_beforehand_process();
  281. }
  282. }
  283. }
  284. //恢复5v复位
  285. AT(.text.qtest)
  286. void qtest_exit(void)
  287. {
  288. xcfg_cb.charge_en = 1;
  289. }
  290. #endif