cfg_drv.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. /*!
  2. * \file cfg_drv.c
  3. * \brief 驱动配置接口
  4. * \details
  5. * \author
  6. * \date
  7. * \copyright Actions
  8. */
  9. #include "list.h"
  10. #include <sdfs.h>
  11. #include <device.h>
  12. #include <zephyr/types.h>
  13. #include "drivers/cfg_drv/driver_config.h"
  14. #include "drv_cfg_head.h"
  15. #ifndef bool_t
  16. #define bool_t int
  17. #endif
  18. #ifndef TRUE
  19. #define TRUE 1
  20. #endif
  21. #ifndef FALSE
  22. #define FALSE 0
  23. #endif
  24. /*!
  25. * \brief 获取最小值
  26. */
  27. #define _MIN(_a, _b) (((_a) < (_b)) ? (_a) : (_b))
  28. /*!
  29. * \brief 获取最大值
  30. */
  31. #define _MAX(_a, _b) (((_a) > (_b)) ? (_a) : (_b))
  32. /*!
  33. * \brief 获取CFG key中的ID, OFFSET, LEN
  34. */
  35. #define CFG_KEY_ID(key) ((key >> 24) & 0xff)
  36. #define CFG_KEY_OFFSET(key) ((key >> 12) & 0xfff)
  37. #define CFG_KEY_LEN(key) ((key) & 0xfff)
  38. typedef struct
  39. {
  40. u8_t format[4];
  41. u8_t magic [4];
  42. u16_t user_version;
  43. u8_t minor_version;
  44. u8_t major_version;
  45. u16_t total_size;
  46. u16_t num_cfg_items;
  47. } drv_config_file_header_t;
  48. typedef struct
  49. {
  50. u32_t cfg_id:8;
  51. u32_t sub_pos:12;
  52. u32_t cfg_len:12;
  53. } drv_config_item_info_t;
  54. typedef struct
  55. {
  56. struct list_head node;
  57. void *file;
  58. int num_cfg_items;
  59. u8_t* cfg_data;
  60. drv_config_item_info_t* cfg_items;
  61. } drv_config_file_info_t;
  62. typedef struct {
  63. /** item key value, defined by drivers */
  64. uint32_t item_key_value;
  65. /** cfg key value, generated by config tools */
  66. uint32_t cfg_key_value;
  67. } cfg_key_map_t;
  68. /* 最大配置文件数 */
  69. #define MAX_DRV_CFG_FILE 2
  70. drv_config_file_info_t cfg_file_info[MAX_DRV_CFG_FILE];
  71. struct list_head drv_config_file_list = LIST_HEAD_INIT(drv_config_file_list);
  72. cfg_key_map_t cfg_key_map_table[]={
  73. /* UART */
  74. { ITEM_UART_TX_PIN , CFG_Console_UART_RX_Pin },
  75. { ITEM_UART_RX_PIN , CFG_Console_UART_TX_Pin },
  76. { ITEM_UART_BAUDRATE , CFG_Console_UART_Baudrate },
  77. { ITEM_UART_PRINT_TIME_STAMP , CFG_Console_UART_Print_Time_Stamp },
  78. /* LED */
  79. { ITEM_LED_LED, CFG_LED_Drives_LED },
  80. /* ONOFF KEY */
  81. { ITEM_ONOFF_USE_INNER_ONOFF_KEY, CFG_ONOFF_Key_Use_Inner_ONOFF_Key },
  82. { ITEM_ONOFF_CONTINUE_KEY_FUNCTION_AFTER_WAKE_UP, CFG_ONOFF_Key_Continue_Key_Function_After_Wake_Up },
  83. { ITEM_ONOFF_KEY_VALUE, CFG_ONOFF_Key_Key_Value },
  84. { ITEM_ONOFF_TIME_PRESS_POWER_ON, CFG_ONOFF_Key_Time_Press_Power_On },
  85. { ITEM_ONOFF_TIME_LONG_PRESS_RESET, CFG_ONOFF_Key_Time_Long_Press_Reset },
  86. { ITEM_ONOFF_BOOT_HOLD_KEY_FUNC, CFG_ONOFF_Key_Boot_Hold_Key_Func},
  87. { ITEM_ONOFF_BOOT_HOLD_KEY_TIME_MS, CFG_ONOFF_Key_Boot_Hold_Key_Time_Ms },
  88. { ITEM_ONOFF_DEBOUNCE_TIME_MS, CFG_ONOFF_Key_Debounce_Time_Ms },
  89. { ITEM_ONOFF_REBOOT_AFTER_BOOT_HOLD_KEY_CLEAR_PAIRED_LIST, CFG_ONOFF_Key_Reboot_After_Boot_Hold_Key_Clear_Paired_List },
  90. /* LRADC KEY */
  91. { ITEM_LRADC_KEY, CFG_LRADC_Keys_Key },
  92. { ITEM_LRADC_CTRL, CFG_LRADC_Keys_LRADC_Ctrl },
  93. { ITEM_LRADC_PULL_UP, CFG_LRADC_Keys_LRADC_Pull_Up },
  94. { ITEM_LRADC_KEY_WAKE_UP, CFG_LRADC_Keys_Use_LRADC_Key_Wake_Up },
  95. { ITEM_LRADC_VALUE_TEST, CFG_LRADC_Keys_LRADC_Value_Test },
  96. { ITEM_LRADC_DEBOUNCE_TIME_MS, CFG_LRADC_Keys_Debounce_Time_Ms },
  97. /* GPIO KEY */
  98. { ITEM_GPIO_KEY, CFG_GPIO_Keys_Key },
  99. /* TAP KEY */
  100. { ITEM_TAP_KEY_CONTROL, CFG_Tap_Key_Tap_Key_Control },
  101. /* AUDIO */
  102. { ITEM_AUDIO_OUT_MODE, CFG_Audio_Settings_Audio_Out_Mode },
  103. { ITEM_AUDIO_I2STX_SELECT_GPIO, CFG_Audio_Settings_I2STX_Select_GPIO },
  104. { ITEM_AUDIO_CHANNEL_SELECT_MODE, CFG_Audio_Settings_Channel_Select_Mode },
  105. { ITEM_AUDIO_CHANNEL_SELECT_GPIO, CFG_Audio_Settings_Channel_Select_GPIO },
  106. { ITEM_AUDIO_CHANNEL_SELECT_LRADC, CFG_Audio_Settings_Channel_Select_LRADC },
  107. { ITEM_AUDIO_TWS_ALONE_AUDIO_CHANNEL, CFG_Audio_Settings_TWS_Alone_Audio_Channel },
  108. { ITEM_AUDIO_L_SPEAKER_OUT, CFG_Audio_Settings_L_Speaker_Out },
  109. { ITEM_AUDIO_R_SPEAKER_OUT, CFG_Audio_Settings_R_Speaker_Out },
  110. { ITEM_AUDIO_ADC_BIAS_SETTING, CFG_Audio_Settings_ADC_Bias_Setting },
  111. { ITEM_AUDIO_DAC_BIAS_SETTING, CFG_Audio_Settings_DAC_Bias_Setting },
  112. { ITEM_AUDIO_KEEP_DA_ENABLED_WHEN_PLAY_PAUSE, CFG_Audio_Settings_Keep_DA_Enabled_When_Play_Pause },
  113. { ITEM_AUDIO_DISABLE_PA_WHEN_RECONNECT, CFG_Audio_Settings_Disable_PA_When_Reconnect },
  114. { ITEM_AUDIO_EXTERN_PA_CONTROL, CFG_Audio_Settings_Extern_PA_Control },
  115. { ITEM_AUDIO_ANTIPOP_PROCESS_DISABLE, CFG_Audio_Settings_AntiPOP_Process_Disable },
  116. { ITEM_AUDIO_DMIC01_CHANNEL_ALIGNING, CFG_Audio_Settings_DMIC01_Channel_Aligning },
  117. { ITEM_AUDIO_DMIC23_CHANNEL_ALIGNING, CFG_Audio_Settings_DMIC23_Channel_Aligning },
  118. { ITEM_AUDIO_DMIC_SELECT_GPIO, CFG_Audio_Settings_DMIC_Select_GPIO },
  119. { ITEM_AUDIO_ENABLE_ANC, CFG_Audio_Settings_Enable_ANC },
  120. { ITEM_AUDIO_ANCDMIC_SELECT_GPIO, CFG_Audio_Settings_ANCDMIC_Select_GPIO },
  121. { ITEM_AUDIO_RECORD_ADC_SELECT, CFG_Audio_Settings_Record_Adc_Select },
  122. { ITEM_AUDIO_ENABLE_VMIC, CFG_Audio_Settings_Enable_VMIC },
  123. { ITEM_AUDIO_HW_AEC_SELECT, CFG_Audio_Settings_Hw_Aec_Select },
  124. { ITEM_AUDIO_TM_ADC_SELECT, CFG_Audio_Settings_Tm_Adc_Select },
  125. { ITEM_AUDIO_MIC_CONFIG, CFG_Audio_Settings_Mic_Config },
  126. { ITEM_AUDIO_ADC_INPUT_SELECT, CFG_Audio_Settings_ADC_Select_INPUT },
  127. { ITEM_AUDIO_PA_GAIN, CFG_Audio_Settings_Pa_Gain },
  128. { ITEM_AUDIO_DUAL_MIC_EXCHANGE_ENABLE, CFG_Audio_Settings_Dual_MIC_Exchange_Enable },
  129. { ITEM_AUDIO_LARGE_CURRENT_PROTOTECT_ENABLE, CFG_Audio_Settings_Large_Current_Protect_Enable},
  130. { ITEM_AUDIO_ANALOG_GAIN_SETTINGS, CFG_Audio_Settings_ANALOG_GAIN_Settings },
  131. /* BATTERY */
  132. { ITEM_CHARGE_SELECT_CHARGE_MODE, CFG_Battery_Charge_Select_Charge_Mode },
  133. { ITEM_CHARGE_CURRENT, CFG_Battery_Charge_Charge_Current },
  134. { ITEM_CHARGE_VOLTAGE, CFG_Battery_Charge_Charge_Voltage },
  135. { ITEM_CHARGE_STOP_MODE, CFG_Battery_Charge_Charge_Stop_Mode },
  136. { ITEM_CHARGE_STOP_VOLTAGE, CFG_Battery_Charge_Charge_Stop_Voltage },
  137. { ITEM_CHARGE_STOP_CURRENT, CFG_Battery_Charge_Charge_Stop_Current },
  138. { ITEM_CHARGE_PRECHARGE_STOP_VOLTAGE, CFG_Battery_Charge_Precharge_Stop_Voltage },
  139. { ITEM_CHARGE_PRECHARGE_CURRENT, CFG_Battery_Charge_Precharge_Current },
  140. { ITEM_CHARGE_PRECHARGE_CURRENT_MIN_LIMIT, CFG_Battery_Charge_Precharge_Current_Min_Limit },
  141. { ITEM_CHARGE_FAST_CHARGE_ENABLE, CFG_Battery_Charge_Fast_Charge_Enable },
  142. { ITEM_CHARGE_FAST_CHARGE_CURRENT, CFG_Battery_Charge_Fast_Charge_Current },
  143. { ITEM_CHARGE_FAST_CHARGE_VOLTAGE_THRESHOLD, CFG_Battery_Charge_Fast_Charge_Voltage_Threshold },
  144. { ITEM_CHARGE_ENABLE_BATTERY_RECHARGE, CFG_Battery_Charge_Enable_Battery_Recharge },
  145. { ITEM_CHARGE_BATTERY_RECHARGE_THRESHOLD, CFG_Battery_Charge_Enable_Battery_Recharge },
  146. { ITEM_CHARGE_BATTERY_CHARGE_TOTAL_TIME_LIMIT, CFG_Battery_Charge_Charge_Total_Time_Limit },
  147. { ITEM_CHARGE_BATTERY_CHECK_PERIOD_SEC, CFG_Battery_Charge_Battery_Check_Period_Sec },
  148. { ITEM_CHARGE_CHECK_PERIOD_SEC, CFG_Battery_Charge_Charge_Check_Period_Sec },
  149. { ITEM_CHARGE_FULL_CONTINUE_SEC, CFG_Battery_Charge_Charge_Full_Continue_Sec },
  150. { ITEM_CHARGE_FRONT_CHARGE_FULL_POWER_OFF_WAIT_SEC, CFG_Battery_Charge_Front_Charge_Full_Power_Off_Wait_Sec },
  151. { ITEM_CHARGE_DC5V_DETECT_DEBOUNCE_TIME_MS, CFG_Battery_Charge_DC5V_Detect_Debounce_Time_Ms },
  152. /* CHARGER BOX*/
  153. { ITEM_CHARGEBOX_ENABLE_CHARGER_BOX, CFG_Charger_Box_Enable_Charger_Box },
  154. { ITEM_CHARGEBOX_DC5V_PULL_DOWN_CURRENT, CFG_Charger_Box_DC5V_Pull_Down_Current },
  155. { ITEM_CHARGEBOX_DC5V_PULL_DOWN_HOLD_MS, CFG_Charger_Box_DC5V_Pull_Down_Hold_Ms },
  156. { ITEM_CHARGEBOX_STANDBY_DELAY_MS, CFG_Charger_Box_Charger_Standby_Delay_Ms },
  157. { ITEM_CHARGEBOX_STANDBY_VOLTAGE, CFG_Charger_Box_Charger_Standby_Voltage },
  158. { ITEM_CHARGEBOX_WAKE_DELAY_MS, CFG_Charger_Box_Charger_Wake_Delay_Ms },
  159. { ITEM_CHARGEBOX_BOX_STANDBY_CURRENT, CFG_Charger_Box_Charger_Box_Standby_Current },
  160. { ITEM_CHARGEBOX_DC5V_UART_COMM_SETTINGS, CFG_Charger_Box_DC5V_UART_Comm_Settings },
  161. { ITEM_CHARGEBOX_DC5V_IO_COMM_SETTINGS, CFG_Charger_Box_DC5V_IO_Comm_Settings },
  162. /* BATTERY */
  163. { ITEM_BATTERY_LEVEL, CFG_Battery_Level_Level },
  164. { ITEM_BATTERY_TOO_LOW_VOLTAGE, CFG_Battery_Low_Battery_Too_Low_Voltage },
  165. { ITEM_BATTERY_LOW_VOLTAGE, CFG_Battery_Low_Battery_Low_Voltage },
  166. { ITEM_BATTERY_LOW_VOLTAGE_EX, CFG_Battery_Low_Battery_Low_Voltage_Ex },
  167. { ITEM_BATTERY_LOW_PROMPT_INTERVAL_SEC, CFG_Battery_Low_Battery_Low_Prompt_Interval_Sec },
  168. /* NTC */
  169. { ITEM_NTC_SETTING, CFG_NTC_Settings_NTC_Settings },
  170. { ITEM_NTC_RANGES, CFG_NTC_Settings_NTC_Ranges },
  171. /* OTHER - SYS MORE CONFIG */
  172. { ITEM_SYS_SETTINGS_SUPPORT_FEATURES, CFG_System_Settings_Support_Features},
  173. };
  174. /*!
  175. * \brief 加载驱动配置数据文件
  176. * \n 注: 使用时必须先加载 defcfg.bin, 再加载 usrcfg.bin
  177. * \n
  178. * \n file_name : 配置文件名
  179. * \return
  180. * 成功: TRUE
  181. * \n 失败: FALSE
  182. */
  183. static bool_t drv_config_load( const char* file_name)
  184. {
  185. struct sd_file *file;
  186. drv_config_file_info_t* file_info;
  187. drv_config_file_header_t hdr;
  188. int len = sizeof(drv_config_file_header_t);
  189. int i;
  190. if ((file = sd_fopen(file_name)) == NULL)
  191. {
  192. goto err;
  193. }
  194. if (sd_fread(file, &hdr, sizeof(drv_config_file_header_t)) != len)
  195. {
  196. goto err;
  197. }
  198. if (memcmp(hdr.format, "CFG", 4) != 0 ||
  199. memcmp(hdr.magic, "VER", 4) != 0)
  200. {
  201. goto err;
  202. }
  203. //file_info = app_mem_malloc(sizeof(drv_config_file_info_t));
  204. for(i=0; i<MAX_DRV_CFG_FILE; i++)
  205. {
  206. if(cfg_file_info[i].file == NULL)
  207. {
  208. break;
  209. }
  210. }
  211. if(i >= MAX_DRV_CFG_FILE)
  212. return FALSE;
  213. file_info = &cfg_file_info[i];
  214. file_info->num_cfg_items = hdr.num_cfg_items;
  215. file_info->file = file;
  216. list_add_tail(&file_info->node, &drv_config_file_list);
  217. return TRUE;
  218. err:
  219. return FALSE;
  220. }
  221. /*!
  222. * \brief 读取驱动配置数据
  223. * \n 配置数据在读取前会被初始化为默认值 0
  224. * \n
  225. * \param cfg_id : 应用配置 ID
  226. * \param cfg_data : 保存配置数据
  227. * \param cfg_offs : 读取配置位置偏移
  228. * \param cfg_len : 读取配置数据长度
  229. * \return
  230. * 配置数据为默认配置时返回 1
  231. * \n 配置数据非默认配置时返回 2
  232. * \n 失败返回 0
  233. */
  234. static int drv_config_read
  235. (
  236. uint32_t cfg_id, void* cfg_data, uint32_t cfg_offs, uint32_t cfg_len)
  237. {
  238. int ret_val = 0;
  239. drv_config_file_info_t* file_info;
  240. drv_config_item_info_t cfg_item;
  241. int file_offs;
  242. int i;
  243. //OSSchedLock();
  244. memset(cfg_data, 0, cfg_len);
  245. /* 顺序读取配置文件,
  246. * 后面读取的新数据覆盖前面读取的数据
  247. */
  248. list_for_each_entry(file_info, &drv_config_file_list, node)
  249. {
  250. int start_pos =
  251. sizeof(drv_config_file_header_t) +
  252. file_info->num_cfg_items * sizeof(drv_config_item_info_t);
  253. int result = 0;
  254. file_offs = start_pos;
  255. for (i = 0; i < file_info->num_cfg_items; i++, file_offs += cfg_item.cfg_len)
  256. {
  257. int offs;
  258. int len;
  259. offs = sizeof(drv_config_file_header_t) +
  260. i * sizeof(drv_config_item_info_t);
  261. sd_fseek(file_info->file, offs, FS_SEEK_SET);
  262. sd_fread(file_info->file, &cfg_item, sizeof(drv_config_item_info_t));
  263. if (cfg_item.cfg_id != cfg_id)
  264. {
  265. continue;
  266. }
  267. /* 只读取覆盖需要的部分数据
  268. */
  269. offs = _MAX(cfg_item.sub_pos, cfg_offs);
  270. len = _MIN(cfg_item.sub_pos + cfg_item.cfg_len, cfg_offs + cfg_len) - offs;
  271. if (len <= 0)
  272. {
  273. continue;
  274. }
  275. int pos = file_offs + (offs - cfg_item.sub_pos);
  276. void* data = (u8_t*)cfg_data + (offs - cfg_offs);
  277. sd_fseek(file_info->file, pos, FS_SEEK_SET);
  278. sd_fread(file_info->file, data, len);
  279. result = 1;
  280. }
  281. ret_val += result;
  282. }
  283. //OSSchedUnlock();
  284. return ret_val;
  285. }
  286. /* return:
  287. 0 - 匹配失败
  288. other - 成功
  289. */
  290. static uint32_t cfg_key_map(uint32_t item_key)
  291. {
  292. uint32_t cfg_key = 0;
  293. int i;
  294. for(i=0; i<sizeof(cfg_key_map_table)/sizeof(cfg_key_map_t); i++)
  295. {
  296. if(cfg_key_map_table[i].item_key_value == item_key)
  297. {
  298. cfg_key = cfg_key_map_table[i].cfg_key_value;
  299. }
  300. }
  301. return cfg_key;
  302. }
  303. /*!
  304. * \brief 读取驱动配置数据
  305. * \n
  306. * \param item_key : 各驱动定义的item ID, 见driver_config.h
  307. * \param data : 保存配置数据
  308. * \param size : data 大小
  309. * \return
  310. * 成功: 读取的数据长度
  311. * \n 失败: 0
  312. */
  313. int cfg_get_by_key(uint32_t item_key, void *data, int size)
  314. {
  315. uint32_t cfg_key;
  316. int ret;
  317. cfg_key = cfg_key_map(item_key);
  318. if(cfg_key == 0)
  319. return 0;
  320. if(size < CFG_KEY_LEN(cfg_key))
  321. return 0;
  322. ret = drv_config_read(CFG_KEY_ID(cfg_key), data, CFG_KEY_OFFSET(cfg_key), CFG_KEY_LEN(cfg_key));
  323. if(ret == 0)
  324. {
  325. return 0;
  326. }
  327. return CFG_KEY_LEN(cfg_key);
  328. }
  329. /*!
  330. * \brief 驱动配置初始化
  331. * \n
  332. * \param : void
  333. * \return
  334. * 成功: TRUE
  335. * \n 失败: FALSE
  336. */
  337. static int cfg_drv_init(const struct device *dev)
  338. {
  339. int ret;
  340. memset(&cfg_file_info, 0, sizeof(cfg_file_info));
  341. /* 需要先加载默认配置文件
  342. */
  343. ret = drv_config_load("defcfg.bin");
  344. if(ret == FALSE)
  345. return FALSE;
  346. /* 然后再加载用户配置文件
  347. */
  348. ret = drv_config_load("usrcfg.bin");
  349. printk("%s init ok.\n", __FUNCTION__);
  350. return TRUE;
  351. }
  352. /* CFG_DRV定义:依赖sdfs,须在sdfs之后初始化,sdfs的proi为80 */
  353. SYS_INIT(cfg_drv_init, PRE_KERNEL_1, 54);