param.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. #include "include.h"
  2. #define CM_SIZE 0x5000 //参数区至少20k
  3. #define CM_START (FLASH_SIZE - CM_SIZE)
  4. #if SYS_PARAM_RTCRAM
  5. #define param_read8(a, b) rtcram_read(a, (u8 *)&b, 1)
  6. #define param_write8(a, b) rtcram_write(a, (u8 *)&b, 1)
  7. #define param_read16(a, b) rtcram_read(a, (u8 *)&b, 2)
  8. #define param_write16(a, b) rtcram_write(a, (u8 *)&b, 2)
  9. #define param_read32(a, b) rtcram_read((a, (u8 *)&b, 4)
  10. #define param_write32(a, b) rtcram_write(a, (u8 *)&b, 4)
  11. #define param_read(a, b, c) rtcram_read(a, b, c)
  12. #define param_write(a, b, c) rtcram_write(a, b, c)
  13. #define param_sync_do()
  14. #else
  15. #define param_read8(a, b) b = cm_read8(PAGE0(a))
  16. #define param_write8(a, b) cm_write8(PAGE0(a), b)
  17. #define param_read16(a, b) b = cm_read16(PAGE0(a))
  18. #define param_write16(a, b) cm_write16(PAGE0(a), b)
  19. #define param_read32(a, b) b = cm_read32(PAGE0(a))
  20. #define param_write32(a, b) cm_write32(PAGE0(a), b)
  21. #define param_read(a, b, c) cm_read(a, PAGE0(b), c)
  22. #define param_write(a, b, c) cm_write(a, PAGE0(b), c)
  23. #define param_sync_do() cm_sync()
  24. #endif
  25. AT(.text.bsp.param)
  26. void param_init(bool reset)
  27. {
  28. //LANG ID初值
  29. if ((LANG_SELECT < LANG_EN_ZH) && xcfg_cb.lang_id >= LANG_EN_ZH) {
  30. printf("Language Select Error\n");
  31. xcfg_cb.lang_id = LANG_SELECT;
  32. }
  33. cm_init(MAX_CM_PAGE, CM_START, CM_SIZE);
  34. //printf("CM: %x\n", cm_read8(PAGE0(0)));
  35. //printf("CM: %x\n", cm_read8(PAGE1(0)));
  36. sys_cb.rand_seed = sys_get_rand_key();
  37. f_msc.cur_dev = DEV_UDISK;
  38. #if SYS_PARAM_RTCRAM
  39. //RTC专用
  40. if(reset) {
  41. f_msc.file_num = 1;
  42. param_write((u8 *)&f_msc.file_num, PARAM_MSC_NUM_SD, 2);
  43. param_write((u8 *)&f_msc.file_num, PARAM_MSC_NUM_USB, 2);
  44. sys_cb.vol = SYS_INIT_VOLUME;
  45. sys_cb.hfp_vol = SYS_INIT_VOLUME / sys_cb.hfp2sys_mul;
  46. param_sys_vol_write();
  47. fmrx_cb.ch_cur = 1;
  48. fmrx_cb.ch_cnt = 1;
  49. param_fmrx_chcur_write();
  50. param_fmrx_chcnt_write();
  51. memset(fmrx_cb.buf, 0, 26);
  52. param_fmrx_chbuf_write();
  53. #if (LANG_SELECT == LANG_EN_ZH)
  54. if (xcfg_cb.lang_id == 2) {
  55. sys_cb.lang_id = 0; //出厂默认英文
  56. } else if (xcfg_cb.lang_id == 3) {
  57. sys_cb.lang_id = 1; //出厂默认中文
  58. } else {
  59. sys_cb.lang_id = xcfg_cb.lang_id;
  60. }
  61. param_lang_id_write();
  62. #endif
  63. #if MUSIC_BREAKPOINT_EN
  64. memset(&f_msc.brkpt, 0, 10);
  65. param_write((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_SD, 10);
  66. param_write((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_USB, 10);
  67. #endif // MUSIC_BREAKPOINT_EN
  68. #if BT_LOCAL_ADDR
  69. param_random_key_write();
  70. #endif
  71. param_sync();
  72. }
  73. #endif
  74. param_sys_vol_read();
  75. if ((SYS_LIMIT_VOLUME == 0) || (sys_cb.vol > VOL_MAX)) {
  76. sys_cb.vol = SYS_INIT_VOLUME; //上电还原到默认音量
  77. } else {
  78. if (sys_cb.vol < SYS_LIMIT_VOLUME) {
  79. sys_cb.vol = SYS_LIMIT_VOLUME;
  80. }
  81. }
  82. param_hfp_vol_read();
  83. if (sys_cb.hfp_vol > 15) {
  84. sys_cb.hfp_vol = 15;
  85. }
  86. if (xcfg_cb.lang_id >= LANG_EN_ZH) {
  87. param_lang_id_read();
  88. if (sys_cb.lang_id >= LANG_EN_ZH) {
  89. if (xcfg_cb.lang_id == 2) {
  90. sys_cb.lang_id = 0; //出厂默认英文
  91. } else if (xcfg_cb.lang_id == 3) {
  92. sys_cb.lang_id = 1; //出厂默认中文
  93. } else {
  94. sys_cb.lang_id = xcfg_cb.lang_id;
  95. }
  96. param_lang_id_write();
  97. }
  98. } else {
  99. sys_cb.lang_id = xcfg_cb.lang_id;
  100. }
  101. sys_cb.sw_rst_flag = sw_reset_source_get();
  102. #if (CHARGE_BOX_TYPE == CBOX_SSW)
  103. param_vuart_popup_flag_read();
  104. #endif
  105. #if QTEST_EN
  106. update_set_qcheck_code();
  107. #endif
  108. #if MUSIC_BREAKPOINT_EN
  109. param_msc_breakpoint_read();
  110. #endif
  111. }
  112. AT(.text.bsp.param)
  113. void bsp_param_write(u8 *buf, u32 addr, uint len)
  114. {
  115. param_write(buf, addr, len);
  116. }
  117. AT(.text.bsp.param)
  118. void bsp_param_read(u8 *buf, u32 addr, uint len)
  119. {
  120. param_read(buf, addr, len);
  121. }
  122. AT(.text.bsp.param)
  123. void bsp_param_sync(void)
  124. {
  125. param_sync_do();
  126. }
  127. #if BT_LOCAL_ADDR
  128. AT(.text.bsp.param)
  129. void param_random_key_read(u8 *key)
  130. {
  131. if (key == NULL) {
  132. return;
  133. }
  134. param_read(key, PARAM_RANDOM_KEY, 4);
  135. }
  136. AT(.text.bsp.param)
  137. void param_random_key_write(void)
  138. {
  139. u32 key;
  140. param_random_key_read((u8*)&key);
  141. if (key == 0 || key == UINT_MAX) {
  142. key = sys_cb.rand_seed;
  143. param_write((u8 *)&key, PARAM_RANDOM_KEY, 4);
  144. }
  145. }
  146. #endif // BT_LOCAL_ADDR
  147. AT(.text.bsp.param)
  148. void param_msc_num_write(void)
  149. {
  150. if (f_msc.cur_dev == DEV_SDCARD) {
  151. param_write((u8 *)&f_msc.file_num, PARAM_MSC_NUM_SD, 2);
  152. } else if (f_msc.cur_dev == DEV_SDCARD1) {
  153. param_write((u8 *)&f_msc.file_num, PARAM_MSC_NUM_SD1, 2);
  154. } else {
  155. param_write((u8 *)&f_msc.file_num, PARAM_MSC_NUM_USB, 2);
  156. }
  157. }
  158. AT(.text.bsp.param)
  159. void param_msc_num_read(void)
  160. {
  161. if (f_msc.cur_dev == DEV_SDCARD) {
  162. param_read((u8 *)&f_msc.file_num, PARAM_MSC_NUM_SD, 2);
  163. } else if (f_msc.cur_dev == DEV_SDCARD1) {
  164. param_read((u8 *)&f_msc.file_num, PARAM_MSC_NUM_SD1, 2);
  165. } else {
  166. param_read((u8 *)&f_msc.file_num, PARAM_MSC_NUM_USB, 2);
  167. }
  168. if (f_msc.file_num > f_msc.file_total) {
  169. f_msc.file_num = f_msc.file_total;
  170. }
  171. if (f_msc.file_num < 1) {
  172. f_msc.file_num = 1;
  173. }
  174. }
  175. #if MUSIC_BREAKPOINT_EN
  176. AT(.text.bsp.param)
  177. void param_msc_breakpoint_write(void)
  178. {
  179. if (f_msc.cur_dev == DEV_SDCARD) {
  180. param_write((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_SD, 10);
  181. } else if (f_msc.cur_dev == DEV_SDCARD1) {
  182. param_write((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_SD1, 10);
  183. } else {
  184. param_write((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_USB, 10);
  185. }
  186. }
  187. AT(.text.bsp.param)
  188. void param_msc_breakpoint_read(void)
  189. {
  190. if (f_msc.cur_dev == DEV_SDCARD) {
  191. param_read((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_SD, 10);
  192. } else if (f_msc.cur_dev == DEV_SDCARD1) {
  193. param_read((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_SD1, 10);
  194. } else {
  195. param_read((u8 *)&f_msc.brkpt, PARAM_MSC_BRKPT_USB, 10);
  196. }
  197. }
  198. #endif // MUSIC_BREAKPOINT_EN
  199. AT(.text.bsp.param)
  200. void param_sys_vol_write(void)
  201. {
  202. param_write((u8 *)&sys_cb.vol, PARAM_SYS_VOL, 1);
  203. }
  204. AT(.text.bsp.param)
  205. void param_sys_vol_read(void)
  206. {
  207. param_read((u8 *)&sys_cb.vol, PARAM_SYS_VOL, 1);
  208. }
  209. AT(.text.bsp.param)
  210. void param_hfp_vol_write(void)
  211. {
  212. param_write((u8 *)&sys_cb.hfp_vol, PARAM_HSF_VOL, 1);
  213. }
  214. AT(.text.bsp.param)
  215. void param_hfp_vol_read(void)
  216. {
  217. param_read((u8 *)&sys_cb.hfp_vol, PARAM_HSF_VOL, 1);
  218. }
  219. AT(.text.bsp.param)
  220. void param_lang_id_write(void)
  221. {
  222. param_write((u8 *)&sys_cb.lang_id, PARAM_LANG_ID, 1);
  223. }
  224. AT(.text.bsp.param)
  225. void param_lang_id_read(void)
  226. {
  227. param_read((u8 *)&sys_cb.lang_id, PARAM_LANG_ID, 1);
  228. }
  229. AT(.text.bsp.param)
  230. void param_sync(void)
  231. {
  232. param_sync_do();
  233. }
  234. AT(.text.bsp.param)
  235. u32 param_get_xosc_addr(void)
  236. {
  237. return PARAM_BT_XOSC_CAP;
  238. }
  239. #if SYS_MODE_BREAKPOINT_EN
  240. AT(.text.bsp.param)
  241. u8 param_sys_mode_read(void)
  242. {
  243. u8 mode = 0;
  244. param_read((u8 *)&mode, PARAM_SYS_MODE, 1);
  245. return mode;
  246. }
  247. AT(.text.bsp.param)
  248. void param_sys_mode_write(u8 mode)
  249. {
  250. if (mode == FUNC_MUSIC) {
  251. mode = ((sys_cb.cur_dev & 0x0f) << 4) | mode; //高4bit用来放USB/SD设备选择
  252. }
  253. param_write((u8 *)&mode, PARAM_SYS_MODE, 1);
  254. }
  255. #endif
  256. #if SYS_KARAOK_EN
  257. AT(.text.bsp.param)
  258. void param_echo_level_write(void)
  259. {
  260. param_write((u8 *)&sys_cb.echo_level, PARAM_ECHO_LEVEL, 1);
  261. }
  262. AT(.text.bsp.param)
  263. void param_echo_level_read(void)
  264. {
  265. param_read((u8 *)&sys_cb.echo_level, PARAM_ECHO_LEVEL, 1);
  266. }
  267. AT(.text.bsp.param)
  268. void param_echo_delay_write(void)
  269. {
  270. param_write((u8 *)&sys_cb.echo_delay, PARAM_ECHO_LEVEL, 1);
  271. }
  272. AT(.text.bsp.param)
  273. void param_echo_delay_read(void)
  274. {
  275. param_read((u8 *)&sys_cb.echo_delay, PARAM_ECHO_LEVEL, 1);
  276. }
  277. #endif
  278. #if (CHARGE_BOX_TYPE == CBOX_SSW)
  279. //充电仓命令开关广播功能
  280. void param_vuart_popup_flag_read(void)
  281. {
  282. u8 temp;
  283. param_read(&temp, PARAM_VUART_POPUP_FLAG, 1);
  284. if ((temp == 1) || (temp == 2)) {
  285. sys_cb.popup_en = temp - 1;
  286. }else{
  287. sys_cb.popup_en = 1;
  288. }
  289. }
  290. void param_vuart_popup_flag_write(u8 data)
  291. {
  292. u8 temp;
  293. param_read(&temp, PARAM_VUART_POPUP_FLAG, 1);
  294. if (temp != data) {
  295. temp = data;
  296. param_write((u8 *)&temp, PARAM_VUART_POPUP_FLAG, 1);
  297. param_sync();
  298. }
  299. }
  300. #endif
  301. #if BT_TWS_EN
  302. AT(.text.bsp.param)
  303. void param_tws_channel_write(u8 channel)
  304. {
  305. if (sys_cb.vusb_force_channel != channel) {
  306. sys_cb.vusb_force_channel = channel;
  307. cm_write8(PARAM_VHOUSE_CH_VALID, channel);
  308. cm_sync();
  309. }
  310. }
  311. AT(.text.bsp.param)
  312. void param_tws_channel_read(void)
  313. {
  314. u8 channel = cm_read8(PARAM_VHOUSE_CH_VALID);
  315. if (channel == 1) {
  316. sys_cb.vusb_force_channel = 1; //固定为右声道
  317. } else if (channel == 2) {
  318. sys_cb.vusb_force_channel = 2; //固定为左声音
  319. }
  320. }
  321. #endif
  322. AT(.text.bsp.param.fota)
  323. void param_fot_addr_write(u8 *param)
  324. {
  325. param_write((u8 *)param, PARAM_FOT_ADDR, 4);
  326. param_sync();
  327. }
  328. AT(.text.bsp.param.fota)
  329. void param_fot_addr_read(u8 *param)
  330. {
  331. param_read(param, PARAM_FOT_ADDR, 4);
  332. }
  333. AT(.text.bsp.param.fota)
  334. void param_fot_remote_ver_write(u8 *param)
  335. {
  336. param_write((u8 *)param, PARAM_FOT_REMOTE_VER, 2);
  337. param_sync();
  338. }
  339. AT(.text.bsp.param.fota)
  340. void param_fot_remote_ver_read(u8 *param)
  341. {
  342. param_read(param, PARAM_FOT_REMOTE_VER, 2);
  343. }
  344. AT(.text.bsp.param.fota)
  345. void param_fot_head_info_write(u8 *param)
  346. {
  347. param_write((u8 *)param, PARAM_FOT_HEAD_INFO, 8);
  348. param_sync();
  349. }
  350. AT(.text.bsp.param.fota)
  351. void param_fot_head_info_read(u8 *param)
  352. {
  353. param_read(param, PARAM_FOT_HEAD_INFO, 8);
  354. }
  355. AT(.text.bsp.param.fota)
  356. void param_fot_hash_write(u8 *param)
  357. {
  358. param_write((u8 *)param, PARAM_FOT_HASH, 4);
  359. param_sync();
  360. }
  361. AT(.text.bsp.param.fota)
  362. void param_fot_hash_read(u8 *param)
  363. {
  364. param_read(param, PARAM_FOT_HASH, 4);
  365. }
  366. AT(.text.bsp.param.fota)
  367. void param_fot_type_write(u8 *param)
  368. {
  369. param_write((u8 *)param, PARAM_FOT_TYPE, 1);
  370. param_sync();
  371. }
  372. AT(.text.bsp.param.fota)
  373. void param_fot_type_read(u8 *param)
  374. {
  375. param_read(param, PARAM_FOT_TYPE, 1);
  376. }