bsp_iodm.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. #include "include.h"
  2. #include "bsp_iodm.h"
  3. #if IODM_TEST_MODE
  4. #define TRACE_EN 0
  5. #if TRACE_EN
  6. #define TRACE(...) printf(__VA_ARGS__)
  7. #else
  8. #define TRACE(...)
  9. #endif
  10. struct{
  11. u8 precmd;//上次的命令
  12. u8 prelen;//上次读取到的位置
  13. }iodm;
  14. u8 iodm_ver[] = {1,2};
  15. u8 fcc_param[10];
  16. u32 bt_get_xosc_cap(void);
  17. void bt_set_xosc_cap(u32 cap);
  18. u8 param_bt_xosc_read(void);
  19. u8 vhouse_cmd_ack(vh_packet_t *packet);
  20. AT(.text.vhouse)
  21. u8 iodm_spp_tx_ack(vh_packet_t *packet)
  22. {
  23. u8 length = 5 + packet->length;
  24. u8* crc_ptr = (u8*)packet+length;
  25. *crc_ptr = vusb_crc8_maxim((u8*)packet, length);
  26. #if TRACE_EN
  27. TRACE("spp_tx_ack\n");
  28. print_r(packet,length+4);
  29. #endif
  30. bt_spp_tx((u8*)packet,length+1);
  31. return true;
  32. }
  33. u8 iodm_cmd_rsp(vh_packet_t *packet, u8 len, u8 result,u8 entrance)
  34. {
  35. packet->header = 0xAA55;
  36. packet->distinguish = VHOUSE_DISTINGUISH;
  37. packet->length = len + 1;
  38. packet->buf[0] = result;
  39. if(entrance==0){
  40. vhouse_cmd_ack(packet);
  41. }else{
  42. iodm_spp_tx_ack(packet);
  43. }
  44. return 0;
  45. }
  46. void iodm_clear_all_btname(void)
  47. {
  48. char buf = 0;
  49. param_bt_new_name_write(&buf,1);
  50. }
  51. void iodm_cmd_mic_lookback_exit(void)
  52. {
  53. dac_fade_out();
  54. dac_fade_wait(); //等待淡出完成
  55. audio_path_exit(AUDIO_PATH_MIC_TEST);
  56. }
  57. void iodm_cmd_mic_lookback_enter(void)
  58. {
  59. iodm_cmd_mic_lookback_exit();
  60. audio_path_init(AUDIO_PATH_MIC_TEST);
  61. audio_path_start(AUDIO_PATH_MIC_TEST);
  62. }
  63. char iodm_btname[32] = {0};
  64. u8 iodm_cmd_set_bt_name(vh_packet_t *packet)
  65. {
  66. u8 len = iodm.prelen+packet->length;
  67. if(len>32){
  68. iodm.prelen = 0;
  69. return IODM_RESULT_FAIL;
  70. }
  71. memcpy(iodm_btname+iodm.prelen,packet->buf,packet->length);
  72. iodm.prelen = len;
  73. if(packet->length<VH_DATA_LEN){
  74. iodm_clear_all_btname();
  75. iodm_save_bt_new_name((char*)iodm_btname, iodm.prelen);
  76. memset(iodm_btname,0,32);
  77. len = 0;
  78. return IODM_RESULT_OK;
  79. }
  80. return IODM_RESULT_COMPLETE;
  81. }
  82. u8 iodm_cmd_get_bt_name(u8*tx_buf,u8* tx_len)
  83. {
  84. u8 result = IODM_RESULT_COMPLETE;
  85. if(iodm.prelen == 0){
  86. memset(iodm_btname,0,32);
  87. if(!iodm_get_bt_name((u8*)iodm_btname)){
  88. memcpy(iodm_btname,bt_name_buf,32);
  89. }
  90. }
  91. u8 name_len = strlen(iodm_btname);
  92. *tx_len = VH_DATA_LEN-1;
  93. if(name_len<=iodm.prelen+(*tx_len)){
  94. *tx_len = name_len - iodm.prelen;
  95. result = IODM_RESULT_OK;
  96. }
  97. memcpy(tx_buf,(u8*)iodm_btname+iodm.prelen,*tx_len);
  98. if(result == IODM_RESULT_OK){
  99. iodm.prelen = 0;
  100. }else{
  101. iodm.prelen+=(*tx_len);
  102. }
  103. return result;
  104. }
  105. void iodm_reveice_data_deal(vh_packet_t *packet,u8 entrance)
  106. {
  107. u8 cmd_rsp_param_len = 0;
  108. u8 result = IODM_RESULT_OK;
  109. u8 *tx_buf = (u8*)packet->buf+1;
  110. if(iodm.precmd != packet->cmd){
  111. iodm.precmd = packet->cmd;
  112. iodm.prelen = 0;
  113. }
  114. switch(packet->cmd){
  115. case IODM_CMD_DEV_RST:
  116. result = IODM_RESULT_OK;
  117. iodm_cmd_rsp(packet, cmd_rsp_param_len, result,entrance);
  118. sw_reset_kick(SW_RST_FLAG);
  119. break;
  120. case IODM_CMD_SET_BT_ADDR:
  121. //复位生效
  122. TRACE("IODM CMD SET BT ADDR\n");
  123. bt_save_qr_addr(packet->buf);
  124. break;
  125. case IODM_CMD_GET_BT_ADDR:
  126. TRACE("IODM CMD GET BT ADDR\n");
  127. cmd_rsp_param_len = 6;
  128. if (!bt_get_qr_addr(tx_buf)) {
  129. bt_get_local_bd_addr(tx_buf);
  130. }
  131. break;
  132. case IODM_CMD_SET_BT_NAME:
  133. TRACE("IODM CMD SET BT NAME\n");
  134. result = iodm_cmd_set_bt_name(packet);
  135. break;
  136. case IODM_CMD_GET_BT_NAME:
  137. TRACE("IODM CMD GET BT NAME\n");
  138. result = iodm_cmd_get_bt_name(tx_buf,&cmd_rsp_param_len);
  139. break;
  140. case IODM_CMD_CBT_TEST_ENTER:
  141. TRACE("IODM CMD CBT TEST ENTER\n");
  142. if(func_cb.sta != FUNC_BT_DUT){
  143. func_cb.sta = FUNC_BT_DUT;
  144. }
  145. break;
  146. case IODM_CMD_CBT_TEST_EXIT:
  147. TRACE("IODM CMD CBT TEST EXIT\n");
  148. if (func_cb.sta != FUNC_BT){
  149. func_cb.sta = FUNC_BT;
  150. break;
  151. }
  152. break;
  153. case IODM_CMD_FCC_TEST_ENTER:
  154. // printf("iodm IODM_FCC_TEST\n");
  155. result = IODM_RESULT_OK;
  156. if (func_cb.sta != FUNC_BT_FCC){
  157. func_cb.sta = FUNC_BT_FCC;
  158. }
  159. break;
  160. case IODM_CMD_FCC_SET_PARAM:
  161. if (func_cb.sta == FUNC_BT_FCC) {
  162. memcpy(fcc_param, packet->buf, sizeof(fcc_param));
  163. fcc_param[5] = 7; //固定power
  164. // printf("fcc_param:");
  165. // print_r(fcc_param, 0x0a);
  166. bt_fcc_test_start();
  167. result = IODM_RESULT_OK;
  168. } else {
  169. result = IODM_RESULT_FAIL;
  170. }
  171. break;
  172. case IODM_CMD_FCC_TEST_EXIT:
  173. // printf("iodm fcc exit\n");
  174. result = IODM_RESULT_OK;
  175. if (func_cb.sta != FUNC_BT){
  176. func_cb.sta = FUNC_BT;
  177. break;
  178. }
  179. break;
  180. case IODM_CMD_SET_XOSC_CAP:
  181. TRACE("IODM CMD SET XOSC CAP\n");
  182. u8 xtal = packet->buf[0];
  183. if (xtal < 63) {
  184. bt_set_xosc_cap(xtal); //设置 频偏参数
  185. } else {
  186. result = IODM_RESULT_FAIL;
  187. }
  188. break;
  189. case IODM_CMD_GET_XOSC_CAP:
  190. TRACE("IODM CMD GET XOSC CAP\n");
  191. cmd_rsp_param_len = 1;
  192. u8 cap_param = param_bt_xosc_read();
  193. if (cap_param == 0xff) {
  194. tx_buf[0] = xcfg_cb.osc_cap;
  195. } else {
  196. cap_param &= ~0x80;
  197. tx_buf[0] = (cap_param & 0x7) << 3;
  198. tx_buf[0] |= (cap_param >> 3) & 0x07;
  199. }
  200. break;
  201. case IODM_CMD_GET_VER_INFO:
  202. TRACE("IODM CMD GET VER INFO\n");
  203. cmd_rsp_param_len = 4;
  204. memcpy(tx_buf, IODM_HARDWARE_VER, 2);
  205. memcpy(tx_buf+2, IODM_SOFTWARE_VER, 2);
  206. result = IODM_RESULT_OK;
  207. break;
  208. case IODM_CMD_GET_INFO:
  209. TRACE("IODM CMD GET INFO\n");
  210. cmd_rsp_param_len = 4;
  211. tx_buf[0] = 1;
  212. tx_buf[1] = 0;
  213. tx_buf[2] = 1;
  214. tx_buf[3] = VH_DATA_LEN;
  215. break;
  216. case IODM_CMD_BT_SET_SCAN:
  217. TRACE("IODM CMD BT SET_SCAN\n");
  218. if(bt_nor_is_connected()){
  219. bt_nor_disconnect();
  220. bt_nor_clr_link_info('I');
  221. bt_cfg.scan_ctrl = 1;
  222. bt_set_scan(true);
  223. }
  224. break;
  225. case IODM_CMD_MIC_LOOKBACK_ENTER:
  226. TRACE("IODM CMD MIC LOOKBACK ENTER\n");
  227. iodm_cmd_mic_lookback_enter();
  228. break;
  229. case IODM_CMD_MIC_LOOKBACK_EXIT:
  230. TRACE("IODM CMD MIC LOOKBACK EXIT\n");
  231. iodm_cmd_mic_lookback_exit();
  232. break;
  233. case IODM_CMD_PROTOCOL_VER:
  234. cmd_rsp_param_len = 2;
  235. memcpy(tx_buf,iodm_ver,2);
  236. break;
  237. case IODM_CMD_CLEAR_PAIR:
  238. bt_clr_all_link_info('I');
  239. break;
  240. default:
  241. // result = vhouse_custom_test(packet,&cmd_rsp_param_len);
  242. break;
  243. }
  244. if(result == IODM_RESULT_OK){
  245. vhouse_cb.ear_mute_flag = 0;
  246. bsp_change_volume(sys_cb.vol);
  247. }
  248. if(result != IODM_RESULT_NO_RSP){
  249. iodm_cmd_rsp(packet, cmd_rsp_param_len, result,entrance);
  250. TRACE("iodm_reveice_data_deal end\n");
  251. }
  252. }
  253. uint8_t *bt_rf_get_fcc_param(void)
  254. {
  255. return fcc_param;
  256. }
  257. void bt_save_qr_addr(u8 *addr)
  258. {
  259. cm_write8(PARAM_QR_ADDR_VALID, 1);
  260. cm_write(addr, PARAM_QR_ADDR, 6);
  261. cm_sync();
  262. }
  263. bool bt_get_qr_addr(u8 *addr)
  264. {
  265. if (cm_read8(PARAM_QR_ADDR_VALID) == 1) {
  266. cm_read(addr, PARAM_QR_ADDR, 6);
  267. return true;
  268. }
  269. return false;
  270. }
  271. bool iodm_get_bt_name(u8 *buf)
  272. {
  273. u8 len = cm_read8(PARAM_BT_NAME_LEN);
  274. if(len > 32 || len == 0){
  275. return false;
  276. }
  277. memset(buf,0x00,32); //clear
  278. cm_read(buf, PARAM_BT_NAME, len);
  279. return true;
  280. }
  281. void iodm_init(void)
  282. {
  283. memset(&iodm,0,sizeof(iodm));
  284. }
  285. bool iodm_reflash_bt_name(void)
  286. {
  287. if(iodm_get_bt_name((u8*)bt_name_buf)){
  288. return true;
  289. }
  290. return false;
  291. }
  292. bool iodm_save_bt_new_name(char *name,u8 len)
  293. {
  294. if(len>32){
  295. return false;
  296. }
  297. cm_write8(PARAM_BT_NAME_LEN, len);
  298. cm_write(name, PARAM_BT_NAME, len);
  299. cm_sync();
  300. return true;
  301. }
  302. extern u8 eq_rx_buf[EQ_BUFFER_LEN];
  303. void bt_spp_iodm_event(void)
  304. {
  305. #if TRACE_EN
  306. TRACE("bt_spp_iodm_event\n");
  307. print_r(eq_rx_buf,eq_rx_buf[4]+1);
  308. #endif
  309. vh_packet_t *packet =&vhouse_cb.packet;
  310. u8 len = eq_rx_buf[4];
  311. if(len>VH_DATA_LEN){
  312. return;
  313. }
  314. len = len+5;
  315. packet->checksum = eq_rx_buf[len];
  316. memcpy((u8*)packet,eq_rx_buf,len);
  317. if(packet->checksum == vusb_crc8_maxim((u8 *)packet, len)){
  318. iodm_reveice_data_deal(packet,1);
  319. }
  320. }
  321. #endif