plugin.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #include "include.h"
  2. volatile int pwrkey_detect_flag; //pwrkey 820K用于复用检测的标志。
  3. void plugin_init(void)
  4. {
  5. CLKGAT0 = BIT(0)|BIT(12);
  6. CLKGAT1 = BIT(1)|BIT(2)|BIT(3)|BIT(18)|BIT(19)|BIT(20)|BIT(21)|BIT(22)|BIT(23)|BIT(24)|BIT(25)|BIT(26)|BIT(27)|BIT(28)|BIT(29)|BIT(30);
  7. CLKGAT2 = BIT(2)|BIT(10)|BIT(11)|BIT(12)|BIT(15)|BIT(17)|BIT(23)|BIT(24)|BIT(25)|BIT(26)|BIT(29);
  8. CLKGAT3 = 0;
  9. #if UART0_PRINTF_SEL != PRINTF_NONE
  10. CLKGAT0 |= BIT(6);
  11. #endif
  12. #if (LANG_SELECT == LANG_EN_ZH)
  13. multi_lang_init(sys_cb.lang_id);
  14. #endif
  15. #if USB_SUPPORT_EN
  16. CLKGAT0 |= BIT(15);
  17. #endif
  18. #if SD_SUPPORT_EN
  19. CLKGAT0 |= BIT(16);
  20. #endif
  21. }
  22. void plugin_var_init(void)
  23. {
  24. pwrkey_detect_flag = 0;
  25. xcfg_cb.pwrkey_config_en = xcfg_cb.pwrkey_config_en & xcfg_cb.user_pwrkey_en;
  26. xcfg_cb.adkey_config_en = xcfg_cb.adkey_config_en & xcfg_cb.user_adkey_en;
  27. xcfg_cb.iokey_config_en = xcfg_cb.iokey_config_en & xcfg_cb.user_iokey_en;
  28. xcfg_cb.key_multi_config_en = xcfg_cb.key_multi_config_en & xcfg_cb.user_key_multi_press_en;
  29. #if FUNC_AUX_EN
  30. if (!xcfg_cb.func_aux_en) {
  31. xcfg_cb.linein_2_pwrdown_en = 0;
  32. xcfg_cb.linein_det_iosel = 0;
  33. xcfg_cb.auxl_sel = 0;
  34. xcfg_cb.auxr_sel = 0;
  35. xcfg_cb.mode_2_aux_en = 0;
  36. }
  37. #endif // FUNC_AUX_EN
  38. if (!xcfg_cb.led_disp_en) {
  39. xcfg_cb.bled_io_sel = 0;
  40. xcfg_cb.charge_full_bled = 0;
  41. xcfg_cb.led_sta_config_en = 0;
  42. }
  43. if (!xcfg_cb.func_music_en) {
  44. xcfg_cb.music_udisk_en = 0;
  45. xcfg_cb.music_sdcard_en = 0;
  46. }
  47. if (!xcfg_cb.music_sdcard_en) {
  48. xcfg_cb.sddet_iosel = 0;
  49. }
  50. if (!LINEIN_DETECT_EN) {
  51. xcfg_cb.linein_det_iosel = 0;
  52. }
  53. if (!xcfg_cb.led_pwr_en) {
  54. xcfg_cb.rled_io_sel = 0;
  55. }
  56. if (xcfg_cb.buck_mode_en) {
  57. xcfg_cb.vddbt_capless_en = 0;
  58. }
  59. if (!xcfg_cb.charge_en) {
  60. xcfg_cb.chbox_en = 0;
  61. }
  62. if (!xcfg_cb.chbox_en) {
  63. xcfg_cb.ch_box_type_sel = 3;
  64. xcfg_cb.ch_out_auto_pwron_en = 0;
  65. xcfg_cb.ch_leakage_sel = 0;
  66. xcfg_cb.chg_inbox_pwrdwn_en = 0;
  67. xcfg_cb.chbox_out_delay = 0;
  68. }
  69. #if (CHARGE_BOX_TYPE == CBOX_SSW)
  70. if (xcfg_cb.chbox_en) {
  71. xcfg_cb.ch_box_type_sel = 2; //昇生微智能充电仓为维持电压仓
  72. xcfg_cb.chg_inbox_pwrdwn_en = 0;
  73. }
  74. #endif
  75. if (!xcfg_cb.bt_tws_en) {
  76. xcfg_cb.bt_tws_pair_mode = 0;
  77. xcfg_cb.bt_tws_pair_bonding_en = 0;
  78. xcfg_cb.tws_sel_left_gpio_sel = 0;
  79. xcfg_cb.bt_tswi_en = 0;
  80. }
  81. if (!xcfg_cb.bt_tswi_en) {
  82. xcfg_cb.bt_tswi_kpwr_en = 0;
  83. xcfg_cb.bt_tswi_msc_en = 0;
  84. xcfg_cb.bt_tswi_sco_en = 0;
  85. }
  86. #if USER_PWRKEY
  87. if (xcfg_cb.user_pwrkey_en || PWRKEY_2_HW_PWRON) {
  88. sys_cb.wko_pwrkey_en = 1;
  89. }
  90. #endif // USER_PWRKEY
  91. #if USER_TKEY_SOFT_PWR_EN
  92. sys_cb.tkey_pwrdwn_en = 1;
  93. #endif
  94. //PWRKEY模拟硬开关,需要关闭长按10S复位, 第一次上电开机, 长按5秒进配对等功能。
  95. if (PWRKEY_2_HW_PWRON) {
  96. xcfg_cb.powkey_10s_reset = 0;
  97. // xcfg_cb.pwron_frist_bat_en = 0;
  98. xcfg_cb.bt_pwrkey_nsec_discover = 0;
  99. }
  100. #if LED_DISP_EN
  101. led_func_init();
  102. #endif // LED_DISP_EN
  103. }
  104. AT(.com_text.plugin)
  105. void plugin_tmr5ms_isr(void)
  106. {
  107. #if ENERGY_LED_EN
  108. energy_led_level_calc();
  109. #endif
  110. }
  111. AT(.com_text.plugin)
  112. void plugin_tmr1ms_isr(void)
  113. {
  114. #if ENERGY_LED_EN
  115. energy_led_scan();
  116. #endif
  117. }
  118. #if (MUSIC_SDCARD_EN)
  119. u8 get_sddet_io_num(u8 iosel)
  120. {
  121. u8 io_num;
  122. if (iosel <= IO_MAX_NUM) {
  123. io_num = iosel;
  124. } else if (iosel == IO_MUX_SDCLK) {
  125. io_num = SDCLK_IO;
  126. } else if (iosel == IO_MUX_SDCMD) {
  127. io_num = SDCMD_IO;
  128. } else {
  129. io_num = IO_NONE;
  130. }
  131. return io_num;
  132. }
  133. #endif // MUSIC_SDCARD_EN
  134. //蓝牙休眠时,唤醒IO配置
  135. void sleep_wakeup_config(void)
  136. {
  137. #if USER_ADKEY
  138. if (xcfg_cb.user_adkey_en) {
  139. wakeup_gpio_config(get_adc_gpio_num(ADKEY_CH), 0, 0); //配置ADKEY IO下降沿唤醒。
  140. }
  141. #endif // USER_ADKEY
  142. #if USER_ADKEY2
  143. if (xcfg_cb.user_adkey2_en) {
  144. wakeup_gpio_config(get_adc_gpio_num(ADKEY2_CH), 0, 0); //配置ADKEY1 IO下降沿唤醒。
  145. }
  146. #endif // USER_ADKEY2
  147. #if USER_ADKEY_MUX_SDCLK
  148. if (xcfg_cb.user_adkey_mux_sdclk_en) {
  149. wakeup_gpio_config(get_adc_gpio_num(SDCLK_AD_CH), 0 ,0); //IO下降沿唤醒。
  150. }
  151. #endif // USER_ADKEY_MUX_SDCLK
  152. #if USER_IOKEY
  153. if (xcfg_cb.user_iokey_en) {
  154. if (xcfg_cb.iokey_config_en) {
  155. wakeup_gpio_config(xcfg_cb.iokey_io0, 0, 1); //配置IO下降沿唤醒。
  156. wakeup_gpio_config(xcfg_cb.iokey_io1, 0, 1);
  157. wakeup_gpio_config(xcfg_cb.iokey_io2, 0, 1);
  158. wakeup_gpio_config(xcfg_cb.iokey_io3, 0, 1);
  159. wakeup_gpio_config(xcfg_cb.iokey_io4, 0, 1);
  160. } else {
  161. //不用工具配置IOKEY时,根据实际使用的IOKEY IO进行修改。
  162. wakeup_gpio_config(IO_PB1, 0, 1);
  163. wakeup_gpio_config(IO_PB2, 0, 1);
  164. }
  165. }
  166. #endif // USER_IOKEY
  167. #if SC7A20_EN
  168. wakeup_wko_config(); /*配置PB5作为GPIO唤醒功能*/
  169. //printf("%s config pb5 wakeup\n", __func__);
  170. #endif
  171. #if USER_PWRKEY
  172. if ((xcfg_cb.user_pwrkey_en) && (!PWRKEY_2_HW_PWRON) && !bsp_tkey_wakeup_en()) {
  173. wakeup_wko_config();
  174. }
  175. #endif // USER_PWRKEY
  176. #if MUSIC_SDCARD_EN
  177. //sdcard insert/remove wakeup
  178. if (xcfg_cb.music_sdcard_en) {
  179. u8 edge;
  180. if (dev_is_online(DEV_SDCARD)) {
  181. edge = 1; //sdcard remove wakeup(rising edge)
  182. } else {
  183. edge = 0; //sdcard insert wakeup(falling edge)
  184. }
  185. wakeup_gpio_config(get_sddet_io_num(xcfg_cb.sddet_iosel), edge, 1);
  186. }
  187. #endif // MUSIC_SDCARD_EN
  188. #if MUSIC_UDISK_EN
  189. //udisk insert/remove wakeup
  190. if (xcfg_cb.music_udisk_en) {
  191. if (dev_is_online(DEV_UDISK)) {
  192. wakeup_gpio_config(IO_PB3, 0, 2); //udisk remove wakeup(falling edge)
  193. } else {
  194. wakeup_gpio_config(IO_PB3, 1, 2); //udisk insert wakeup(rising edge)
  195. }
  196. }
  197. #endif // MUSIC_UDISK_EN
  198. }
  199. AT(.com_text.bsp.sys)
  200. void lefmic_zero_detect(u8 *ptr, u32 samples)
  201. {
  202. }
  203. bool bt_hfp_ring_number_en(void)
  204. {
  205. return (!BT_HFP_INBAND_RING_EN && xcfg_cb.bt_hfp_ring_number_en);
  206. }
  207. AT(.com_text.bsp.sys)
  208. bool is_sd_support(void)
  209. {
  210. #if (SD0_MAPPING == SD0MAP_G2) && EQ_DBG_IN_UART
  211. if (xcfg_cb.huart_en && xcfg_cb.huart_sel == 1) {
  212. return false;
  213. }
  214. #endif
  215. return (MUSIC_SDCARD_EN * xcfg_cb.music_sdcard_en);
  216. }
  217. AT(.com_text.bsp.sys)
  218. bool is_usb_support(void)
  219. {
  220. #if EQ_DBG_IN_UART
  221. if (xcfg_cb.huart_en && xcfg_cb.huart_sel == 2) {
  222. return false;
  223. }
  224. #endif
  225. return ((MUSIC_UDISK_EN * xcfg_cb.music_udisk_en) | FUNC_USBDEV_EN);
  226. }
  227. bool is_sleep_dac_off_enable(void)
  228. {
  229. if (xcfg_cb.linein_det_iosel == IO_MUX_MICL) {
  230. return false;
  231. }
  232. return true;
  233. }
  234. //设置piano提示音播放的数字音量 (0 ~ 0x7fff)
  235. u32 get_piano_digvol(void)
  236. {
  237. return bsp_volume_convert(WARNING_VOLUME);
  238. }
  239. //设置WAV RES提示音播放的数字音量 (0 ~ 0x7fff)
  240. u32 get_wav_res_digvol(void)
  241. {
  242. return bsp_volume_convert(WARNING_VOLUME);
  243. }
  244. #if WARNING_WSBC_EN
  245. //设置提示音播放的数字音量 (0 ~ 0x7fff)
  246. u32 waring_get_digvol_cb(void)
  247. {
  248. return bsp_volume_convert(WARNING_VOLUME);
  249. }
  250. #endif
  251. void maxvol_tone_play(void)
  252. {
  253. bsp_res_play(TWS_RES_MAX_VOL);
  254. }
  255. void minvol_tone_play(void)
  256. {
  257. }
  258. void plugin_playmode_warning(void)
  259. {
  260. }
  261. void plugin_lowbat_vol_reduce(void)
  262. {
  263. #if LPWR_REDUCE_VOL_EN
  264. music_src_set_volume(0x50c0); //设置音乐源音量达到整体降低系统音量 (范围:0~0x7fff)
  265. #endif // LPWR_REDUCE_VOL_EN
  266. }
  267. void plugin_lowbat_vol_recover(void)
  268. {
  269. #if LPWR_REDUCE_VOL_EN
  270. music_src_set_volume(0x7fff); //还原音量
  271. #endif // LPWR_REDUCE_VOL_EN
  272. }
  273. //用于调DAC音质接口函数
  274. void plugin_music_eq(void)
  275. {
  276. bsp_eq_init();
  277. sys_cb.eq_mode = 0;
  278. music_set_eq_by_num(sys_cb.eq_mode);
  279. }
  280. AT(.com_text.port.vbat)
  281. void plugin_vbat_filter(u32 *vbat)
  282. {
  283. #if VBAT_FILTER_USE_PEAK
  284. //电源波动比较大的音箱方案, 取一定时间内的电量"最大值"或"次大值",更能真实反应电量.
  285. #define VBAT_MAX_TIME (3000/5) //电量峰值判断时间 3S
  286. static u16 cnt = 0;
  287. static u16 vbat_max_cnt = 0;
  288. static u32 vbat_max[2] = {0,0};
  289. static u32 vbat_ret = 0;
  290. u32 vbat_cur = *vbat;
  291. if (cnt++ < VBAT_MAX_TIME) {
  292. if (vbat_max[0] < vbat_cur) {
  293. vbat_max[1] = vbat_max[0]; //vbat_max[1] is less max (次大值)
  294. vbat_max[0] = vbat_cur; //vbat_max[0] is max(最大值)
  295. vbat_max_cnt = 0;
  296. } else if (vbat_max[0] == vbat_cur) {
  297. vbat_max_cnt ++;
  298. }
  299. } else {
  300. if (vbat_max_cnt >= VBAT_MAX_TIME/5) { //总次数的(1/5)都采到最大值,则返回最大值.
  301. vbat_ret = vbat_max[0];
  302. } else if (vbat_max[1] != 0) { //最大值次数较少,则返回次大值(舍弃最大值)
  303. vbat_ret = vbat_max[1];
  304. }
  305. vbat_max[0] = 0;
  306. vbat_max[1] = 0;
  307. vbat_max_cnt = 0;
  308. cnt = 0;
  309. }
  310. //返回值
  311. if (vbat_ret != 0) {
  312. *vbat = vbat_ret;
  313. }
  314. #endif
  315. }
  316. //初始化完成, 各方案可能还有些不同参数需要初始化,预留接口到各方案
  317. void plugin_sys_init_finish_callback(void)
  318. {
  319. #if ENERGY_LED_EN
  320. energy_led_init();
  321. #endif
  322. }
  323. bool plugin_func_idle_enter_check(void)
  324. {
  325. //可以在这里决定否需要进入idle
  326. return true;
  327. }