plugin.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. #include "include.h"
  2. volatile int pwrkey_detect_flag; //pwrkey 820K用于复用检测的标志。
  3. #if SYS_KARAOK_EN
  4. //{第一级混响幅度[0, 256], 每级混响衰减系数[0, 256]}
  5. const u16 echo_level_gain_16[16 + 1][2] = {
  6. {0, 0},
  7. {45, 20}, {60, 25}, {65, 30}, {65, 51},
  8. {79, 51}, {79, 72}, {79, 85}, {79, 101},
  9. {85, 131}, {85, 142}, {86, 147}, {88, 160},
  10. {88, 163}, {88, 167}, {95, 171}, {170, 150},
  11. };
  12. //{第一级混响幅度[0, 256], 每级混响衰减系数[0, 256]}
  13. const u16 echo_level_gain_12[12 + 1][2] = {
  14. {0, 0},
  15. {45, 20}, {65, 30}, {65, 51}, {79, 51},
  16. {79, 72}, {79, 85}, {85, 131}, {86, 147},
  17. {88, 160}, {88, 167}, {95, 171}, {170, 150},
  18. };
  19. #endif
  20. void plugin_init(void)
  21. {
  22. #if (LANG_SELECT == LANG_EN_ZH)
  23. multi_lang_init(sys_cb.lang_id);
  24. #endif
  25. }
  26. void plugin_var_init(void)
  27. {
  28. pwrkey_detect_flag = 0;
  29. xcfg_cb.pwrkey_config_en = xcfg_cb.pwrkey_config_en & xcfg_cb.user_pwrkey_en;
  30. xcfg_cb.adkey_config_en = xcfg_cb.adkey_config_en & xcfg_cb.user_adkey_en;
  31. xcfg_cb.adkey2_config_en = xcfg_cb.adkey2_config_en & xcfg_cb.user_adkey2_en;
  32. xcfg_cb.iokey_config_en = xcfg_cb.iokey_config_en & xcfg_cb.user_iokey_en;
  33. xcfg_cb.key_multi_config_en = xcfg_cb.key_multi_config_en & xcfg_cb.user_key_multi_press_en;
  34. #if FUNC_AUX_EN
  35. if (!xcfg_cb.func_aux_en) {
  36. xcfg_cb.linein_2_pwrdown_en = 0;
  37. xcfg_cb.linein_det_iosel = 0;
  38. xcfg_cb.auxl_sel = 0;
  39. xcfg_cb.auxr_sel = 0;
  40. xcfg_cb.mode_2_aux_en = 0;
  41. }
  42. #endif // FUNC_AUX_EN
  43. if (!xcfg_cb.led_disp_en) {
  44. xcfg_cb.bled_io_sel = 0;
  45. xcfg_cb.led_pwron_config_en = 0;
  46. xcfg_cb.led_pwroff_config_en = 0;
  47. xcfg_cb.led_btpair_config_en = 0;
  48. xcfg_cb.led_btconn_config_en = 0;
  49. xcfg_cb.led_btmusic_config_en = 0;
  50. xcfg_cb.led_btring_config_en = 0;
  51. xcfg_cb.led_btcall_config_en = 0;
  52. xcfg_cb.led_lowbat_config_en = 0;
  53. }
  54. if (!xcfg_cb.func_music_en) {
  55. xcfg_cb.music_wav_support = 0;
  56. xcfg_cb.music_wma_support = 0;
  57. xcfg_cb.music_ape_support = 0;
  58. xcfg_cb.music_flac_support = 0;
  59. xcfg_cb.music_udisk_en = 0;
  60. xcfg_cb.music_sdcard_en = 0;
  61. }
  62. if (!xcfg_cb.music_sdcard_en) {
  63. xcfg_cb.sddet_iosel = 0;
  64. }
  65. if (!EARPHONE_DETECT_EN) {
  66. xcfg_cb.earphone_det_iosel = 0;
  67. }
  68. if (!LINEIN_DETECT_EN) {
  69. xcfg_cb.linein_det_iosel = 0;
  70. }
  71. if (!xcfg_cb.led_pwr_en) {
  72. xcfg_cb.rled_io_sel = 0;
  73. }
  74. #if CHARGE_EN
  75. if (!xcfg_cb.charge_en) {
  76. xcfg_cb.charge_dc_reset = 0;
  77. xcfg_cb.charge_dc_not_pwron = 0;
  78. }
  79. #endif // CHARGE_EN
  80. #if BT_HFP_PLAY_IOS_RING_EN
  81. if (xcfg_cb.bt_hfp_play_ios_ring_en) {
  82. xcfg_cb.bt_hfp_ring_number_en = 0;
  83. }
  84. #endif
  85. //PWRKEY模拟硬开关,需要关闭长按10S复位, 第一次上电开机, 长按5秒进配对等功能。
  86. if (PWRKEY_2_HW_PWRON) {
  87. xcfg_cb.powkey_10s_reset = 0;
  88. // xcfg_cb.pwron_frist_bat_en = 0;
  89. // xcfg_cb.bt_pwrkey_nsec_discover = 0;
  90. }
  91. #if LED_DISP_EN
  92. led_func_init();
  93. #endif // LED_DISP_EN
  94. }
  95. AT(.com_text.plugin)
  96. void plugin_tmr5ms_isr(void)
  97. {
  98. #if ENERGY_LED_EN
  99. energy_led_level_calc();
  100. #endif
  101. }
  102. AT(.com_text.plugin)
  103. void plugin_tmr1ms_isr(void)
  104. {
  105. #if ENERGY_LED_EN
  106. energy_led_scan();
  107. #endif
  108. }
  109. void plugin_saradc_init(u16 *adc_ch)
  110. {
  111. #if USER_KEY_KNOB_EN
  112. *adc_ch |= BIT(ADCCH_PE5); //旋钮1
  113. *adc_ch |= BIT(ADCCH_PE6); //旋钮2
  114. #endif
  115. }
  116. #if USER_KEY_KNOB_EN
  117. //16级旋钮
  118. AT(.com_rodata.port.key)
  119. const u8 tbl_knob_level_16[16 + 1] = {
  120. 0x02, 0x13, 0x24, 0x36, 0x47, 0x59, 0x6A, 0x7B,
  121. 0x8B, 0x9A, 0xA0, 0xB2, 0xC3, 0xD5, 0xE6, 0xF8,
  122. 0xFF,
  123. };
  124. #endif
  125. AT(.com_text.port.key)
  126. void plugin_saradc_sel_channel(u16 *adc_ch)
  127. {
  128. #if USER_KEY_KNOB_EN
  129. u8 mic_vol_val = (u8)(adc_cb.sfr[ADCCH_PE5] >> 2);
  130. u8 echo_level_val = (u8)(adc_cb.sfr[ADCCH_PE6] >> 2);
  131. static u8 echo_level = USER_KEY_KNOB_LEVEL, mic_vol = USER_KEY_KNOB_LEVEL;
  132. key_knob_process(echo_level_val, tbl_knob_level_16, &echo_level);
  133. if (echo_level != sys_cb.echo_level) {
  134. sys_cb.echo_level = echo_level;
  135. msg_enqueue(EVT_ECHO_LEVEL);
  136. }
  137. key_knob_process(mic_vol_val, tbl_knob_level_16, &mic_vol);
  138. if (mic_vol != sys_cb.mic_vol) {
  139. sys_cb.mic_vol = mic_vol;
  140. msg_enqueue(EVT_MIC_VOL);
  141. }
  142. #endif
  143. }
  144. #if (MUSIC_SDCARD_EN || MUSIC_SDCARD1_EN)
  145. u8 get_sddet_io_num(u8 iosel)
  146. {
  147. u8 io_num;
  148. if (iosel <= IO_PF3) {
  149. io_num = iosel;
  150. } else if (iosel == IO_MUX_SDCLK) {
  151. io_num = SDCLK_IO;
  152. } else if (iosel == IO_MUX_SDCMD) {
  153. io_num = SDCMD_IO;
  154. } else {
  155. io_num = IO_NONE;
  156. }
  157. return io_num;
  158. }
  159. #endif // MUSIC_SDCARD_EN
  160. //蓝牙休眠时,唤醒IO配置
  161. void sleep_wakeup_config(void)
  162. {
  163. #if USER_ADKEY
  164. if (xcfg_cb.user_adkey_en) {
  165. wakeup_gpio_config(get_adc_gpio_num(ADKEY_CH), 0, 0); //配置ADKEY IO下降沿唤醒。
  166. }
  167. #endif // USER_ADKEY
  168. #if USER_ADKEY2
  169. if (xcfg_cb.user_adkey2_en) {
  170. wakeup_gpio_config(get_adc_gpio_num(ADKEY2_CH), 0, 0); //配置ADKEY1 IO下降沿唤醒。
  171. }
  172. #endif // USER_ADKEY2
  173. #if USER_ADKEY_MUX_SDCLK
  174. if (xcfg_cb.user_adkey_mux_sdclk_en) {
  175. wakeup_gpio_config(get_adc_gpio_num(SDCLK_AD_CH), 0 ,0); //IO下降沿唤醒。
  176. }
  177. #endif // USER_ADKEY_MUX_SDCLK
  178. #if USER_IOKEY
  179. if (xcfg_cb.user_iokey_en) {
  180. if (xcfg_cb.iokey_config_en) {
  181. wakeup_gpio_config(xcfg_cb.iokey_io0, 0, 1); //配置IO下降沿唤醒。
  182. wakeup_gpio_config(xcfg_cb.iokey_io1, 0, 1);
  183. wakeup_gpio_config(xcfg_cb.iokey_io2, 0, 1);
  184. wakeup_gpio_config(xcfg_cb.iokey_io3, 0, 1);
  185. wakeup_gpio_config(xcfg_cb.iokey_io4, 0, 1);
  186. } else {
  187. //不用工具配置IOKEY时,根据实际使用的IOKEY IO进行修改。
  188. wakeup_gpio_config(IO_PF0, 0, 1);
  189. wakeup_gpio_config(IO_PF1, 0, 1);
  190. wakeup_gpio_config(IO_PF3, 0, 1);
  191. }
  192. }
  193. #endif // USER_IOKEY
  194. #if USER_PWRKEY
  195. if ((xcfg_cb.user_pwrkey_en) && (!PWRKEY_2_HW_PWRON)) {
  196. wakeup_wko_config();
  197. }
  198. #endif // USER_PWRKEY
  199. #if MUSIC_SDCARD_EN
  200. //sdcard insert/remove wakeup
  201. if (xcfg_cb.music_sdcard_en) {
  202. u8 edge;
  203. if (dev_is_online(DEV_SDCARD)) {
  204. edge = 1; //sdcard remove wakeup(rising edge)
  205. } else {
  206. edge = 0; //sdcard insert wakeup(falling edge)
  207. }
  208. wakeup_gpio_config(get_sddet_io_num(xcfg_cb.sddet_iosel), edge, 1);
  209. }
  210. #endif // MUSIC_SDCARD_EN
  211. #if MUSIC_SDCARD1_EN
  212. //sdcard1 insert/remove wakeup
  213. if (xcfg_cb.music_sdcard_en) {
  214. u8 edge;
  215. if (dev_is_online(DEV_SDCARD1)) {
  216. edge = 1; //sdcard1 remove wakeup(rising edge)
  217. } else {
  218. edge = 0; //sdcard1 insert wakeup(falling edge)
  219. }
  220. wakeup_gpio_config(get_sddet_io_num(xcfg_cb.sd1det_iosel), edge, 1);
  221. }
  222. #endif // MUSIC_SDCARD1_EN
  223. #if (MUSIC_UDISK_EN)
  224. //udisk insert/remove wakeup
  225. if (xcfg_cb.music_udisk_en) {
  226. if (dev_is_online(DEV_UDISK)) {
  227. wakeup_udisk_config(1); //udisk remove wakeup(falling edge)
  228. } else {
  229. wakeup_udisk_config(0); //udisk insert wakeup(rising edge)
  230. }
  231. }
  232. #endif // MUSIC_UDISK_EN
  233. }
  234. bool bt_hfp_ring_number_en(void)
  235. {
  236. return xcfg_cb.bt_hfp_ring_number_en;
  237. }
  238. AT(.com_text.bsp.sys)
  239. bool is_sd_support(void)
  240. {
  241. #if (SD0_MAPPING == SD0MAP_G2) && EQ_DBG_IN_UART
  242. if (xcfg_cb.eq_dgb_uart_en && xcfg_cb.eq_uart_sel == 1) {
  243. return false;
  244. }
  245. #endif
  246. return (MUSIC_SDCARD_EN * xcfg_cb.music_sdcard_en);
  247. }
  248. AT(.com_text.bsp.sys)
  249. bool is_sd1_support(void)
  250. {
  251. #if (SD1_MAPPING == SD0MAP_G2) && EQ_DBG_IN_UART
  252. if (xcfg_cb.eq_dgb_uart_en && xcfg_cb.eq_uart_sel == 1) {
  253. return false;
  254. }
  255. #endif
  256. return (MUSIC_SDCARD1_EN * xcfg_cb.music_sdcard_en);
  257. }
  258. AT(.com_text.bsp.sys)
  259. bool is_usb_support(void)
  260. {
  261. #if EQ_DBG_IN_UART
  262. if (xcfg_cb.eq_dgb_uart_en && xcfg_cb.eq_uart_sel == 2) {
  263. return false;
  264. }
  265. #endif
  266. return ((MUSIC_UDISK_EN * xcfg_cb.music_udisk_en) | FUNC_USBDEV_EN);
  267. }
  268. bool is_func_fmrx_en(void)
  269. {
  270. return xcfg_cb.func_fmrx_en;
  271. }
  272. bool is_sleep_dac_off_enable(void)
  273. {
  274. if (xcfg_cb.linein_det_iosel == IO_MUX_MICL) {
  275. return false;
  276. }
  277. return true;
  278. }
  279. //设置piano提示音播放的数字音量 (0 ~ 0x7fff)
  280. u32 get_piano_digvol(void)
  281. {
  282. return 0x6000;
  283. }
  284. //设置WAV RES提示音播放的数字音量 (0 ~ 0x7fff)
  285. u32 get_wav_res_digvol(void)
  286. {
  287. return 0x5000;
  288. }
  289. void maxvol_tone_play(void)
  290. {
  291. #if WARING_MAXVOL_MP3
  292. #if BT_TWS_EN
  293. if ((xcfg_cb.bt_tws_en) && (func_cb.sta == FUNC_BT)) {
  294. tws_res_play(TWS_RES_MAX_VOL); //同步播放最大音量语音
  295. } else
  296. #endif
  297. {
  298. func_mp3_res_play(RES_BUF_MAX_VOL_MP3, RES_LEN_MAX_VOL_MP3);
  299. }
  300. if (sys_cb.maxvol_fade) {
  301. sys_cb.maxvol_fade = 2;
  302. dac_fade_out(); //抬键的时候再淡入
  303. }
  304. #else // WARING_MAXVOL_MP3
  305. #if SYS_KARAOK_EN
  306. if(func_cb.sta != FUNC_AUX) {
  307. bsp_karaok_exit(AUDIO_PATH_KARAOK);
  308. }
  309. #endif
  310. #if BT_TWS_EN
  311. if ((xcfg_cb.bt_tws_en) && (func_cb.sta == FUNC_BT)) {
  312. tws_res_play(TWS_PIANO_MAX_VOL); //同步播放最大音量TONE音
  313. } else
  314. #endif
  315. {
  316. #if WARNING_WAVRES_PLAY
  317. wav_res_play(RES_BUF_MAX_VOL_WAV, RES_LEN_MAX_VOL_WAV);
  318. #else
  319. bsp_piano_warning_play(WARNING_TONE, TONE_MAX_VOL);
  320. #endif
  321. }
  322. #if SYS_KARAOK_EN
  323. if(func_cb.sta != FUNC_AUX) {
  324. bsp_karaok_init(AUDIO_PATH_KARAOK, func_cb.sta);
  325. }
  326. #endif
  327. #endif // WARING_MAXVOL_MP3
  328. }
  329. void minvol_tone_play(void)
  330. {
  331. }
  332. void plugin_playmode_warning(void)
  333. {
  334. }
  335. void plugin_lowbat_vol_reduce(void)
  336. {
  337. #if LOWPWR_REDUCE_VOL_EN
  338. music_src_set_volume(0x50c0); //设置音乐源音量达到整体降低系统音量 (范围:0~0x7fff)
  339. #endif // LOWPWR_REDUCE_VOL_EN
  340. }
  341. void plugin_lowbat_vol_recover(void)
  342. {
  343. #if LOWPWR_REDUCE_VOL_EN
  344. music_src_set_volume(0x7fff); //还原音量
  345. #endif // LOWPWR_REDUCE_VOL_EN
  346. }
  347. //用于调DAC音质接口函数
  348. void plugin_music_eq(void)
  349. {
  350. bsp_eq_init();
  351. sys_cb.eq_mode = 0;
  352. music_set_eq_by_num(sys_cb.eq_mode);
  353. }
  354. AT(.com_text.port.vbat)
  355. void plugin_vbat_filter(u32 *vbat)
  356. {
  357. #if VBAT_FILTER_USE_PEAK
  358. //电源波动比较大的音箱方案, 取一定时间内的电量"最大值"或"次大值",更能真实反应电量.
  359. #define VBAT_MAX_TIME (3000/5) //电量峰值判断时间 3S
  360. static u16 cnt = 0;
  361. static u16 vbat_max_cnt = 0;
  362. static u32 vbat_max[2] = {0,0};
  363. static u32 vbat_ret = 0;
  364. u32 vbat_cur = *vbat;
  365. if (cnt++ < VBAT_MAX_TIME) {
  366. if (vbat_max[0] < vbat_cur) {
  367. vbat_max[1] = vbat_max[0]; //vbat_max[1] is less max (次大值)
  368. vbat_max[0] = vbat_cur; //vbat_max[0] is max(最大值)
  369. vbat_max_cnt = 0;
  370. } else if (vbat_max[0] == vbat_cur) {
  371. vbat_max_cnt ++;
  372. }
  373. } else {
  374. if (vbat_max_cnt >= VBAT_MAX_TIME/5) { //总次数的(1/5)都采到最大值,则返回最大值.
  375. vbat_ret = vbat_max[0];
  376. } else if (vbat_max[1] != 0) { //最大值次数较少,则返回次大值(舍弃最大值)
  377. vbat_ret = vbat_max[1];
  378. }
  379. vbat_max[0] = 0;
  380. vbat_max[1] = 0;
  381. vbat_max_cnt = 0;
  382. cnt = 0;
  383. }
  384. //返回值
  385. if (vbat_ret != 0) {
  386. *vbat = vbat_ret;
  387. }
  388. #endif
  389. }
  390. //初始化完成, 各方案可能还有些不同参数需要初始化,预留接口到各方案
  391. void plugin_sys_init_finish_callback(void)
  392. {
  393. #if ENERGY_LED_EN
  394. energy_led_init();
  395. #endif
  396. }
  397. bool plugin_func_idle_enter_check(void)
  398. {
  399. //可以在这里决定否需要进入idle
  400. return true;
  401. }
  402. void plugin_hfp_karaok_configure(void)
  403. {
  404. //android用于通话,iphone用于K歌
  405. #if BT_HFP_CALL_KARAOK_EN
  406. if (bt_is_ios_device()) {
  407. sys_cb.hfp_karaok_en = 1;
  408. } else {
  409. sys_cb.hfp_karaok_en = 0;
  410. }
  411. #endif
  412. }
  413. void plugin_fm_seek_chan(void)
  414. {
  415. }
  416. void plugin_fm_seek_continue(void)
  417. {
  418. }
  419. //用于karaok初始化
  420. void plugin_karaok_init(void)
  421. {
  422. #if SYS_KARAOK_EN
  423. sys_cb.echo_delay = SYS_ECHO_DELAY;
  424. #if !USER_KEY_KNOB_EN //没有旋钮的话就固定一个值
  425. sys_cb.music_vol = USER_KEY_KNOB_LEVEL - 1;
  426. sys_cb.echo_level = USER_KEY_KNOB_LEVEL - 1;
  427. sys_cb.mic_vol = USER_KEY_KNOB_LEVEL - 1;
  428. #endif
  429. #endif
  430. }
  431. #if SYS_MAGIC_VOICE_EN || AUDIO_STRETCH_EN
  432. const u8 magic_table[15][2] = {
  433. {0, 7}, //0.3~0.5
  434. {0, 6}, //0.5~1.0
  435. {0, 5}, //0.5~1.0-
  436. {0, 4}, //0.5~1.0
  437. {0, 3}, //0.5~1.0
  438. {0, 2}, //0.5~1.0-
  439. {0, 1}, //0.5~1.0
  440. {0, 0}, //1.0
  441. {1, 1}, //1.0~2.0-
  442. {1, 2}, //1.0~2.0
  443. {1, 3}, //1.0~2.0
  444. {1, 4}, //1.0~2.0-
  445. {1, 5}, //1.0~2.0
  446. {1, 6}, //1.0~2.0
  447. {1, 7}, //2.0
  448. };
  449. #endif
  450. #if SYS_MAGIC_VOICE_EN
  451. void magic_voice_switch(void)
  452. {
  453. static int magic_sel[5] = {-1,2,5,8,11};
  454. static u8 i = 0;
  455. if (i++ > 3) {
  456. i = 0;
  457. }
  458. //printf("i=%d\n",i);
  459. sys_cb.magic_type = magic_table[magic_sel[i]][0];
  460. sys_cb.magic_level = magic_table[magic_sel[i]][1];
  461. printf("set mav:%d %d %d\n", magic_sel[i], sys_cb.magic_type, sys_cb.magic_level);
  462. karaok_set_mav(sys_cb.magic_type, sys_cb.magic_level);
  463. }
  464. #endif
  465. #if SYS_PITCH_SHIFT
  466. void pitch_shift2_init(s32 SampleRate, s32 shift);
  467. void pitch_shift_switch(void)
  468. {
  469. int pitch_tbl[5] = {0, -31000, -10000, 8000, 16000};//-32768~32767
  470. static u8 i = 0;
  471. pitch_shift2_init(44100, pitch_tbl[i]);
  472. if (i++ > 3) {
  473. i = 0;
  474. }
  475. }
  476. #endif
  477. #if AUDIO_STRETCH_EN
  478. bool get_dac_music_speed_status(void);
  479. void stretch_voice_set_level(u8 type, u8 level);
  480. void stretch_voice_switch(void)
  481. {
  482. static int magic_sel = 0;
  483. magic_sel++;
  484. if (magic_sel > 15) {
  485. magic_sel = 0;
  486. }
  487. sys_cb.magic_type = magic_table[magic_sel][0];
  488. sys_cb.magic_level = magic_table[magic_sel][1];
  489. printf("set mav:%d %d %d\n", magic_sel, sys_cb.magic_type, sys_cb.magic_level);
  490. karaok_set_mav(sys_cb.magic_type, sys_cb.magic_level);
  491. }
  492. #endif
  493. #if AUDIO_STRETCH_EN && AUDIO_STRETCH_EN
  494. void switch_magic_speed(void)
  495. {
  496. if(get_dac_music_speed_status() == 1){
  497. stretch_voice_switch();
  498. }else{
  499. magic_voice_switch();
  500. }
  501. }
  502. #endif
  503. void led_test_flash(u32 cnt)
  504. {
  505. LED_TEST_INIT();
  506. while(cnt--) {
  507. LED_TEST_ON();
  508. delay_5ms(50);
  509. LED_TEST_OFF();
  510. delay_5ms(50);
  511. }
  512. }