1 /*
2  * SPDX-FileCopyrightText: 2019-2025 SiFli Technologies(Nanjing) Co., Ltd
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include "bf0_hal.h"
8 #include <string.h>
9 #include "mem_map.h"
10 #include "rtconfig.h"
11 #include "register.h"
12 /** @addtogroup BF0_HAL_Driver
13   * @{
14   */
15 
16 #ifdef HAL_SYSTEM_CONFIG_ENABLED
17 
18 #if defined(LCPU_RUN_SEPERATE_IMG) || defined(LCPU_RUN_ROM_ONLY)
19     #define BSP_CFG_IN_HCPU         (1)
20 #else
21     #define BSP_CFG_IN_HCPU         (0)
22 #endif // SF32LB52X
23 
24 
25 
26 //static uint32_t conf_buf[CFG_SYS_SIZE / 4];
27 HAL_RETM_BSS_SECT(sip1_mode, static uint8_t sip1_mode);
28 HAL_RETM_BSS_SECT(sip2_mode, static uint8_t sip2_mode);
29 
30 static uint32_t conf_user[CFG_USER_SIZE / 4];
31 static uint32_t conf_cust[CFG_USER_SIZE / 4];
32 
BSP_OTP_CFG_READ(uint8_t id,uint8_t * data,uint8_t size,uint8_t * buf,uint32_t buf_size)33 static uint8_t BSP_OTP_CFG_READ(uint8_t id, uint8_t *data, uint8_t size, uint8_t *buf, uint32_t buf_size)
34 {
35     int i = 0;
36     int len = 0;
37     uint32_t fac_cfg_size = 0;
38 
39     if (buf == NULL)
40     {
41         return 0;
42     }
43     fac_cfg_size = buf_size ;
44 
45     uint8_t *p = buf ;
46 
47     while (p[i] != FACTORY_CFG_ID_UNINIT)
48     {
49         len = p[i + 1];
50         if (p[i] == id)                               // Found config
51         {
52             break;
53         }
54 
55         if ((i + len + SYSCFG_FACTORY_HDR_SIZE) >= (int)fac_cfg_size)   // More than max configuration area?
56         {
57             len = 0;
58             break;
59         }
60 
61         i += (len + SYSCFG_FACTORY_HDR_SIZE);       // Next config
62         len = 0;
63     }
64     if (len)                                        // Found config
65     {
66         if (len > size)
67             len = size;
68         memcpy(data, &p[i + SYSCFG_FACTORY_HDR_SIZE], len);
69     }
70 
71     return len;
72 }
73 
BSP_OTP_CUST_CFG_READ(uint8_t id,uint8_t * data,uint8_t size,uint8_t * buf,uint32_t buf_size)74 static uint8_t BSP_OTP_CUST_CFG_READ(uint8_t id, uint8_t *data, uint8_t size, uint8_t *buf, uint32_t buf_size)
75 {
76     uint8_t res;
77     uint8_t *buf_user;
78     res = BSP_OTP_CFG_READ(id, data, size, buf, buf_size);
79     if (res > 0)
80         goto end;
81     buf_user = (uint8_t *)conf_user;
82     res = BSP_OTP_CFG_READ(id, data, size, buf_user, CFG_USER_SIZE);
83     if (res > 0)
84         goto end;
85     buf_user = (uint8_t *)conf_cust;
86     res = BSP_OTP_CFG_READ(id, data, size, buf_user, CFG_USER_SIZE);
87 end:
88     return res;
89 }
90 
91 #ifndef SF32LB55X
BSP_GetFlashByAddr(uint32_t addr)92 static MPI_TypeDef *BSP_GetFlashByAddr(uint32_t addr)
93 {
94     MPI_TypeDef *fhandle = NULL;
95 
96     if ((addr >= QSPI1_MEM_BASE) && (addr < (QSPI1_MEM_BASE + QSPI1_MAX_SIZE)))
97         fhandle = FLASH1;
98     else if ((addr >= QSPI2_MEM_BASE) && (addr < (QSPI2_MEM_BASE + QSPI2_MAX_SIZE)))
99         fhandle = FLASH2;
100 #ifdef FLASH3
101     else if ((addr >= QSPI3_MEM_BASE) && (addr < (QSPI3_MEM_BASE + QSPI3_MAX_SIZE)))
102         fhandle = FLASH3;
103 #endif
104 #ifdef FLASH4
105     else if ((addr >= QSPI4_MEM_BASE) && (addr < (QSPI4_MEM_BASE + QSPI4_MAX_SIZE)))
106         fhandle = FLASH4;
107 #endif
108 #ifdef FLASH5
109     else if ((addr >= QSPI5_MEM_BASE) && (addr < (QSPI5_MEM_BASE + QSPI5_MAX_SIZE)))
110         fhandle = FLASH5;
111 #endif
112     return fhandle;
113 }
114 #else //!55x
BSP_GetFlashByAddr(uint32_t addr)115 static QSPI_TypeDef *BSP_GetFlashByAddr(uint32_t addr)
116 {
117     QSPI_TypeDef *fhandle = NULL;
118 
119     if ((addr >= QSPI1_MEM_BASE) && (addr < (QSPI1_MEM_BASE + QSPI1_MAX_SIZE)))
120         fhandle = FLASH1;
121     else if ((addr >= QSPI2_MEM_BASE) && (addr < (QSPI2_MEM_BASE + QSPI2_MAX_SIZE)))
122         fhandle = FLASH2;
123     else if ((addr >= QSPI3_MEM_BASE) && (addr < (QSPI3_MEM_BASE + QSPI3_MAX_SIZE)))
124         fhandle = FLASH3;
125     else if ((addr >= QSPI4_MEM_BASE) && (addr < (QSPI4_MEM_BASE + QSPI4_MAX_SIZE)))
126         fhandle = FLASH4;
127 
128     return fhandle;
129 }
130 #endif /* !SF32LB55X */
131 
132 #ifdef SOC_BF0_HCPU
133 
HAL_RAM_RET_CODE_SECT(BSP_HxtCbank_Config,void BSP_HxtCbank_Config (uint32_t cbank_sel))134 HAL_RAM_RET_CODE_SECT(BSP_HxtCbank_Config, void BSP_HxtCbank_Config(uint32_t cbank_sel))
135 {
136     int clk_src = HAL_RCC_HCPU_GetClockSrc(RCC_CLK_MOD_SYS);
137 
138     HAL_RCC_HCPU_ClockSelect(RCC_CLK_MOD_SYS, RCC_SYSCLK_HRC48);
139     uint32_t dll1_freq = HAL_RCC_HCPU_GetDLL1Freq();
140     uint32_t dll2_freq = HAL_RCC_HCPU_GetDLL2Freq();
141 
142     HAL_PMU_SET_HXT_CBANK(cbank_sel);
143 
144     HAL_Delay_us(0);
145     HAL_Delay_us(40);
146 
147     HAL_RCC_HCPU_DisableDLL1();
148     HAL_RCC_HCPU_DisableDLL2();
149 
150     HAL_RCC_HCPU_EnableDLL1(dll1_freq);
151     HAL_RCC_HCPU_EnableDLL2(dll2_freq);
152 
153 
154     HAL_RCC_HCPU_ClockSelect(RCC_CLK_MOD_SYS, clk_src);
155     HAL_Delay_us(0);
156 
157     return;
158 }
159 #endif
160 
161 #ifdef SF32LB52X
162 
163 static uint32_t conf_sys[CFG_SYS_SIZE / 4];
164 
BSP_System_Config(void)165 int BSP_System_Config(void)
166 {
167     int res, i;
168     uint8_t *data;
169     uint16_t ate_efuse_offset = 256; // bank1 , offset 0
170     FLASH_HandleTypeDef fhandle;
171     int len;
172     uint8_t *buf;
173     FACTORY_CFG_BATTERY_CALI_T battery_cfg;
174     uint32_t conf_buf[CFG_SYS_SIZE / 4];
175     FACTORY_CFG_CRYSTAL_T xtal_cfg;
176 
177     data  = (uint8_t *)&conf_sys[0];
178     res = HAL_EFUSE_Init();
179     if (res != 0)
180     {
181         //rt_kprintf("efuse init fail %d\n", res);
182         return 1;
183     }
184     HAL_Delay_us(0);
185     HAL_Delay_us(10);
186 
187     // initial data buffer to 0
188     for (i = 0; i < CFG_SYS_SIZE / 4; i++)
189         conf_sys[i] = 0;
190 
191     res = HAL_EFUSE_Read(ate_efuse_offset, data, CFG_SYS_SIZE);
192     if (res != CFG_SYS_SIZE)
193     {
194         //rt_kprintf("Read EFUSE fail\n");
195         return 2;
196     }
197 
198     HAL_PMU_LoadCalData();
199 
200 #if defined(CFG_SUPPORT_NON_OTP)
201     return 0;
202 #endif /* CFG_SUPPORT_NON_OTP */
203 
204     uint32_t addr = BSP_GetOtpBase();
205     memset(&fhandle, 0, sizeof(fhandle));
206     fhandle.Instance = BSP_GetFlashByAddr(addr);
207     HAL_ASSERT(fhandle.Instance);
208     res = HAL_FLASH_PreInit(&fhandle);
209     HAL_ASSERT(0 == res);
210 
211     // load sys otp page to cache buffer
212     buf = (uint8_t *)conf_buf;
213     len = HAL_QSPI_READ_OTP(&fhandle, CFG_IN_OTP_PAGE << 12, buf, CFG_SYS_SIZE);
214     HAL_ASSERT(len > 0);
215 
216     // load user otp page to cache buffer
217     buf = (uint8_t *)conf_user;
218     len = HAL_QSPI_READ_OTP(&fhandle, CFG_USER_OTP_PAGE << 12, buf, CFG_USER_SIZE);
219     HAL_ASSERT(len > 0);
220 
221     buf = (uint8_t *)conf_cust;
222     len = HAL_QSPI_READ_OTP(&fhandle, CFG_CUST_OTP_PAGE << 12, buf, CFG_USER_SIZE);
223     HAL_ASSERT(len > 0);
224 
225     /* set hxt_cbank */
226     res = BSP_OTP_CUST_CFG_READ(FACTORY_CFG_ID_CRYSTAL, (uint8_t *)&xtal_cfg, sizeof(FACTORY_CFG_CRYSTAL_T), (uint8_t *)conf_buf, len);
227     if ((res > 0) && (xtal_cfg.cbank_sel != 0) && (xtal_cfg.cbank_sel != 0x3ff)) // add xtal invalid data check
228     {
229 #ifdef SOC_BF0_HCPU
230         BSP_HxtCbank_Config(xtal_cfg.cbank_sel);
231 #endif
232     }
233 
234     return 0;
235 }
236 
BSP_Get_SysCfg_Cache()237 char *BSP_Get_SysCfg_Cache()
238 {
239     return (char *)conf_sys;
240 }
241 
242 // split to adc/pmu/charge and move to driver code later?
BSP_CONFIG_get(int type,uint8_t * buf,int length)243 int BSP_CONFIG_get(int type, uint8_t *buf, int length)
244 {
245     int ret = 0;
246     uint8_t *data = (uint8_t *)conf_sys;
247     uint8_t pid = __HAL_SYSCFG_GET_PID();
248     uint8_t avdd_v18_en = 0, pvdd_v18_en = 0;
249 
250 #if defined(AVDD_V18_ENABLE)
251     avdd_v18_en = 1;
252 #endif/* AVDD_V18_ENABLE */
253 #if defined(PVDD_V18_ENABLE)
254     pvdd_v18_en = 1;
255 #endif/* PVDD_1V8_ENABLE */
256 
257     if (buf == NULL || length <= 0)
258         return 0;
259 
260 #if 1
261     // data[0] include PMU TRIM/POLAR/VOUT, it should not be 0 if do ate calibrate
262     if (data[0] == 0)
263         return 0;
264 #else
265     // add debug data
266     data[0] = (0xa << 4) | 0xd;
267 #endif
268     if (type == FACTORY_CFG_ID_ADC)
269     {
270         if (length >= (int)sizeof(FACTORY_CFG_ADC_T))
271         {
272             FACTORY_CFG_ADC_T *cfg = (FACTORY_CFG_ADC_T *)buf;
273             ret = length;
274             if (!SF32LB52X_LETTER_SERIES() && avdd_v18_en)
275             {
276                 HAL_ASSERT(0);
277             }
278 
279             if (SF32LB52X_LETTER_SERIES()  && avdd_v18_en)
280             {
281                 cfg->vol10 = (uint16_t)data[22] | ((uint16_t)(data[23] & 0xf) << 8);
282                 cfg->low_mv = ((data[23] & 0xf0) >> 4) | ((data[24] & 1) << 4);
283                 cfg->vol25 = (uint16_t)((data[24] & 0xfe) >> 1) | ((uint16_t)(data[25] & 0x1f) << 7);
284                 cfg->high_mv = ((data[25] & 0xe0) >> 5) | ((data[26] & 0x3) << 3);
285                 cfg->vbat_reg = ((uint16_t)(data[26] & 0xfc) >> 2) | ((uint16_t)(data[27] & 0x3f) << 6);
286                 cfg->vbat_mv = ((data[27] & 0xc0) >> 6) | ((data[28] & 0xf) << 2);
287                 cfg->low_mv *= 100;     // data in efuse with 100 mv based
288                 cfg->high_mv *= 100;
289                 cfg->vbat_mv *= 100;
290             }
291             else
292             {
293                 cfg->vol10 = (uint16_t)data[4] | ((uint16_t)(data[5] & 0xf) << 8);
294                 cfg->low_mv = ((data[5] & 0xf0) >> 4) | ((data[6] & 1) << 4);
295                 cfg->vol25 = (uint16_t)((data[6] & 0xfe) >> 1) | ((uint16_t)(data[7] & 0x1f) << 7);
296                 cfg->high_mv = ((data[7] & 0xe0) >> 5) | ((data[8] & 0x3) << 3);
297                 cfg->vbat_reg = ((uint16_t)(data[8] & 0xfc) >> 2) | ((uint16_t)(data[9] & 0x3f) << 6);
298                 cfg->vbat_mv = ((data[9] & 0xc0) >> 6) | ((data[10] & 0xf) << 2);
299                 cfg->low_mv *= 100;     // data in efuse with 100 mv based
300                 cfg->high_mv *= 100;
301                 cfg->vbat_mv *= 100;
302             }
303 
304             if (SF32LB52X_LETTER_SERIES())
305             {
306                 cfg->ldovref_flag = (data[17] & 0x8) >> 3;
307                 cfg->ldovref_sel = (data[17] & 0xf0) >> 4;
308             }
309 
310 
311 #if 0
312             cfg->vol10 = 1758;
313             cfg->low_mv = 1000;
314             cfg->vol25 = 3162; //3170;  //3162
315             cfg->high_mv = 2500;
316             cfg->vbat_reg = 2788;
317             cfg->vbat_mv = 4200;
318 #endif
319             if (cfg->vol10 == 0 || cfg->low_mv == 0 || cfg->vol25 == 0
320                     || cfg->high_mv == 0 || cfg->vbat_reg == 0 || cfg->vbat_mv == 0)  // all data should be valid
321                 ret = 0;
322         }
323     }
324     else if (type == FACTORY_CFG_ID_VBUCK)
325     {
326         if (length >= (int)sizeof(FACTORY_CFG_VBK_LDO_T))
327         {
328             FACTORY_CFG_VBK_LDO_T *cfg = (FACTORY_CFG_VBK_LDO_T *)buf;
329             ret = length;
330             if (!SF32LB52X_LETTER_SERIES() && pvdd_v18_en)
331             {
332                 HAL_ASSERT(0);
333             }
334             /*only 52D 3.3v use new*/
335             if (((SF32LB52X_LETTER_SERIES()) && (pid == 4) && !pvdd_v18_en) || ((SF32LB52X_LETTER_SERIES()) && (pid != 4) && pvdd_v18_en))  /*52D 3v3, 52A 1v8*/
336             {
337                 cfg->buck_vos_trim = data[20] & 7;
338                 cfg->buck_vos_polar = (data[20] & 8) >> 3;
339                 cfg->hpsys_ldo_vout = (data[20] & 0xf0) >> 4;
340                 cfg->lpsys_ldo_vout = data[21] & 0xf;
341                 cfg->vret_trim = (data[21] & 0xf0) >> 4;
342                 cfg->hpsys_ldo_vout2 = (data[28] & 0x78) >> 3;
343             }
344             else
345             {
346                 cfg->buck_vos_trim = data[0] & 7;
347                 cfg->buck_vos_polar = (data[0] & 8) >> 3;
348                 cfg->hpsys_ldo_vout = (data[0] & 0xf0) >> 4;
349                 cfg->lpsys_ldo_vout = data[1] & 0xf;
350                 cfg->vret_trim = (data[1] & 0xf0) >> 4;
351 
352                 //cfg->buck_vos_trim2 = data[13] & 7;
353                 //cfg->buck_vos_polar2 = (data[13] & 8) >> 3;
354                 cfg->hpsys_ldo_vout2 = (data[13] & 0xf0) >> 4;
355                 cfg->lpsys_ldo_vout2 = data[14] & 0xf;
356             }
357 
358 
359             if (!SF32LB52X_LETTER_SERIES())
360             {
361                 cfg->vdd33_ldo2_vout = (data[2] & 0xf0) >> 4;
362                 cfg->vdd33_ldo3_vout = data[3] & 0xf;
363                 cfg->aon_vos_trim = (data[3] & 0x70) >> 4;
364                 cfg->aon_vos_polar = (data[3] & 0x80) >> 7;
365             }
366 
367             if (!(SF32LB52X_LETTER_SERIES()) || ((SF32LB52X_LETTER_SERIES()) && !pvdd_v18_en))
368                 cfg->ldo18_vref_sel = data[2] & 0xf;
369 
370             if (cfg->hpsys_ldo_vout == 0 || cfg->hpsys_ldo_vout2 == 0)
371                 ret = 0;
372         }
373     }
374     else if (type == FACTORY_CFG_ID_CHARGER)
375     {
376         if (length >= (int)sizeof(FACTORY_CFG_CHARGER_T))
377         {
378             FACTORY_CFG_CHARGER_T *cfg = (FACTORY_CFG_CHARGER_T *)buf;
379             ret = length;
380             cfg->prog_v1p2 = (data[10] & 0xf0) >> 4;
381             cfg->cv_vctrl = data[11] & 0x3f;
382             cfg->cc_mn = (data[11] >> 6) | ((data[12] & 7) << 2);
383             cfg->cc_mp = data[12] >> 3;
384 
385             cfg->chg_step = ((data[14] & 0xf0) >> 4) | ((data[15] & 0xf) << 4);
386         }
387     }
388     else
389     {
390         ret = 0;
391     }
392     return ret;
393 }
394 
395 #else //52x
396 
397 typedef struct
398 {
399 #ifndef SF32LB55X
400     uint32_t adc_cal[2];
401 #else
402     uint32_t adc_cal;
403 #endif
404     uint32_t sdadc_cal[2];
405     uint8_t sn[HAL_LCPU_CONFIG_SN_MAX_NUM];
406     uint16_t sn_len;
407     uint8_t chip_rev;
408     uint8_t reserved;
409     uint32_t battery_a;
410     uint32_t battery_b;
411 } HAL_HCPU_CONFIG_T;
412 
413 #if BSP_CFG_IN_HCPU
414 
415 HAL_HCPU_CONFIG_T g_bsp_hcpu_config;
416 
BSP_CONFIG_set(int type,uint8_t * value,int length)417 HAL_StatusTypeDef BSP_CONFIG_set(int type, uint8_t *value, int length)
418 {
419     HAL_StatusTypeDef ret = HAL_ERROR;
420 #ifdef SOC_BF0_HCPU
421 
422     switch (type)
423     {
424     case FACTORY_CFG_ID_ADC:
425     {
426 #ifndef SF32LB55X
427         if (length == 8) // 64 bit
428         {
429             memcpy((void *)&g_bsp_hcpu_config.adc_cal[0], value, length);
430             ret = HAL_OK;
431         }
432 #else
433         if (length == 4) // 32 bit
434         {
435             memcpy((void *)&g_bsp_hcpu_config.adc_cal, value, length);
436             ret = HAL_OK;
437         }
438 #endif
439         break;
440     }
441     case FACTORY_CFG_ID_SDMADC:
442     {
443         if (length == 8) // 64 bit
444         {
445             memcpy((void *)&g_bsp_hcpu_config.sdadc_cal, value, 8);
446             ret = HAL_OK;
447         }
448         break;
449     }
450     case FACTORY_CFG_ID_BATTERY:
451     {
452         if (length == 8)
453         {
454             uint32_t *p = (uint32_t *)value;
455             g_bsp_hcpu_config.battery_a = p[0];
456             g_bsp_hcpu_config.battery_b = p[1];
457             ret = HAL_OK;
458         }
459         else if (length == 12) //maybe 12 bytes
460         {
461             uint32_t *p = (uint32_t *)value;
462             g_bsp_hcpu_config.battery_a = p[1];
463             g_bsp_hcpu_config.battery_b = p[2];
464             ret = HAL_OK;
465         }
466         break;
467     }
468     default:
469         break;
470     }
471 #endif // No need set in LCPU currently
472 
473     return ret;
474 }
475 
476 
BSP_CONFIG_get(int type,uint8_t * value,int length)477 int BSP_CONFIG_get(int type, uint8_t *value, int length)
478 {
479     int ret = 0;
480 
481     switch (type)
482     {
483     case FACTORY_CFG_ID_ADC:
484     {
485 #ifndef SF32LB55X
486         if (length == 8) // 64 bit
487         {
488             memcpy((void *)value, (void *)&g_bsp_hcpu_config.adc_cal[0], 8);
489             ret = length;
490         }
491 #else
492         if (length == 4) // 32 bit
493         {
494             memcpy((void *)value, (void *)&g_bsp_hcpu_config.adc_cal, 4);
495             ret = length;
496         }
497 #endif
498         break;
499     }
500     case FACTORY_CFG_ID_SDMADC:
501     {
502         if (length == 8) // 64 bit
503         {
504             memcpy((void *)value, (void *)&g_bsp_hcpu_config.sdadc_cal, 8);
505             ret = length;
506         }
507         break;
508     }
509     case FACTORY_CFG_ID_BATTERY:
510     {
511         if (length == 8)
512         {
513             uint32_t *p = (uint32_t *)value;
514             p[0] = g_bsp_hcpu_config.battery_a;
515             p[1] = g_bsp_hcpu_config.battery_b;
516             ret = length;
517         }
518         else if (length == 12)
519         {
520             uint32_t *p = (uint32_t *)value;
521             p[0] = 0xe8091ad7;
522             p[1] = g_bsp_hcpu_config.battery_a;
523             p[2] = g_bsp_hcpu_config.battery_b;
524             ret = length;
525         }
526         break;
527     }
528     default:
529         break;
530     }
531     return ret;
532 
533 }
534 #else
BSP_get_lcpu_type(int type)535 HAL_LCPU_CONFIG_TYPE_T BSP_get_lcpu_type(int type)
536 {
537     HAL_LCPU_CONFIG_TYPE_T lcpu_type = HAL_LCPU_CONFIG_MAX;
538 
539     switch (type)
540     {
541     case FACTORY_CFG_ID_ADC:
542     {
543         lcpu_type = HAL_LCPU_CONFIG_ADC_CALIBRATION;
544         break;
545     }
546     case FACTORY_CFG_ID_SDMADC:
547     {
548         lcpu_type = HAL_LCPU_CONFIG_SDADC_CALIBRATION;
549         break;
550     }
551     case FACTORY_CFG_ID_BATTERY:
552     {
553         lcpu_type = HAL_LCPU_CONFIG_BATTERY_CALIBRATION;
554         break;
555     }
556     default:
557         break;
558     }
559     return lcpu_type;
560 }
BSP_CONFIG_set(int type,uint8_t * buf,int length)561 HAL_StatusTypeDef BSP_CONFIG_set(int type, uint8_t *buf, int length)
562 {
563     HAL_StatusTypeDef ret;
564     HAL_LCPU_CONFIG_TYPE_T lcpu_type;
565 
566     lcpu_type = BSP_get_lcpu_type(type);
567 
568     ret = HAL_LCPU_CONFIG_set(lcpu_type, buf, (uint16_t)length);
569 
570     return ret;
571 }
BSP_CONFIG_get(int type,uint8_t * buf,int length)572 int BSP_CONFIG_get(int type, uint8_t *buf, int length)
573 {
574     HAL_StatusTypeDef ret;
575     HAL_LCPU_CONFIG_TYPE_T lcpu_type;
576     uint16_t len = (uint16_t)length;
577 
578     lcpu_type = BSP_get_lcpu_type(type);
579 
580     ret = HAL_LCPU_CONFIG_get(lcpu_type, buf, &len);
581 
582     if (ret == HAL_OK)
583     {
584         return length;
585     }
586     else
587     {
588         return 0;
589     }
590 }
591 #endif
592 
593 #ifdef SF32LB55X
BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T * cfg)594 static void BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T *cfg)
595 {
596     if (cfg == NULL)
597         return;
598 
599     MODIFY_REG(hwp_pmuc->BG1_CR, PMUC_BG1_CR_BG1_VREF12_Msk, cfg->vbuck1 << PMUC_BG1_CR_BG1_VREF12_Pos);
600     MODIFY_REG(hwp_pmuc->LDO_CR, PMUC_LDO_CR_HPSYS_LDO_VREF_Msk, cfg->hp_ldo << PMUC_LDO_CR_HPSYS_LDO_VREF_Pos);
601     MODIFY_REG(hwp_pmuc->LDO_CR, PMUC_LDO_CR_LPSYS_LDO_VREF_Msk, cfg->lp_ldo << PMUC_LDO_CR_LPSYS_LDO_VREF_Pos);
602     MODIFY_REG(hwp_pmuc->VRET_CR, PMUC_VRET_CR_TRIM_Msk, cfg->vret << PMUC_VRET_CR_TRIM_Pos);
603     MODIFY_REG(hwp_pmuc->BG2_CR, PMUC_BG2_CR_BG2_VREF12_Msk, cfg->vbuck2 << PMUC_BG2_CR_BG2_VREF12_Pos);
604 }
605 #elif defined(SF32LB58X)
BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T * cfg)606 static void BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T *cfg)
607 {
608     if (cfg == NULL)
609         return;
610 
611     MODIFY_REG(hwp_pmuc->BG1_CR, PMUC_BG1_CR_BG1_VREF12_Msk, cfg->vbuck1 << PMUC_BG1_CR_BG1_VREF12_Pos);
612     MODIFY_REG(hwp_pmuc->LDO_CR, PMUC_LDO_CR_HPSYS_LDO_VREF_Msk, cfg->hp_ldo << PMUC_LDO_CR_HPSYS_LDO_VREF_Pos);
613     MODIFY_REG(hwp_pmuc->VRET_CR, PMUC_VRET_CR_TRIM_Msk, cfg->vret << PMUC_VRET_CR_TRIM_Pos);
614     MODIFY_REG(hwp_pmuc->BG2_CR, PMUC_BG2_CR_BG2_VREF12_Msk, cfg->vbuck2 << PMUC_BG2_CR_BG2_VREF12_Pos);
615 }
616 #elif defined(SF32LB56X)
BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T * cfg)617 static void BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T *cfg)
618 {
619     if (cfg == NULL)
620         return;
621 
622     MODIFY_REG(hwp_pmuc->BG1_CR, PMUC_BG1_CR_BG1_VREF12_Msk, cfg->vbuck1 << PMUC_BG1_CR_BG1_VREF12_Pos);
623     MODIFY_REG(hwp_pmuc->HPSYS_LDO, PMUC_HPSYS_LDO_VREF_Msk, cfg->hp_ldo << PMUC_HPSYS_LDO_VREF_Pos);
624     MODIFY_REG(hwp_pmuc->LPSYS_LDO, PMUC_LPSYS_LDO_VREF_Msk, cfg->lp_ldo << PMUC_LPSYS_LDO_VREF_Pos);
625     MODIFY_REG(hwp_pmuc->VRET_CR, PMUC_VRET_CR_TRIM_Msk, cfg->vret << PMUC_VRET_CR_TRIM_Pos);
626 
627     HAL_PMU_SaveCalData(cfg);
628 }
629 
630 #else // 52x?
BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T * cfg)631 static void BSP_CFG_CALIB_PMU(FACTORY_CFG_VBK_LDO_T *cfg)
632 {
633     if (cfg == NULL)
634         return;
635 }
636 
637 #endif //55x
638 
BSP_System_Config(void)639 int BSP_System_Config(void)
640 {
641     FLASH_HandleTypeDef fhandle;
642     int res, len;
643     uint8_t *buf;
644     FACTORY_CFG_SDMADC_T sdm_cfg;
645     FACTORY_CFG_BATTERY_CALI_T battery_cfg;
646     FACTORY_CFG_VBK_LDO_T vbk_cfg;
647     FACTORY_CFG_SIP_MOD_T sip_cfg;
648     uint32_t conf_buf[CFG_SYS_SIZE / 4];
649     FACTORY_CFG_CRYSTAL_T xtal_cfg;
650 
651     buf = (uint8_t *)conf_buf;
652 
653 #if defined(CFG_SUPPORT_NON_OTP)
654     return 0;
655 #endif
656 
657     uint32_t addr = BSP_GetOtpBase();
658     memset(&fhandle, 0, sizeof(fhandle));
659     fhandle.Instance = BSP_GetFlashByAddr(addr);
660     HAL_ASSERT(fhandle.Instance);
661     res = HAL_FLASH_PreInit(&fhandle);
662     HAL_ASSERT(0 == res);
663 
664     len = HAL_QSPI_READ_OTP(&fhandle, CFG_IN_OTP_PAGE << 12, buf, CFG_SYS_SIZE);
665     HAL_ASSERT(len > 0);
666 
667 #ifndef SF32LB52X
668     res = BSP_OTP_CFG_READ(FACTORY_CFG_ID_VBUCK, (uint8_t *)&vbk_cfg, sizeof(FACTORY_CFG_VBK_LDO_T), buf, len);
669     if (res > 0)
670     {
671         // set vbuck / ldo as configure.
672         BSP_CFG_CALIB_PMU(&vbk_cfg);
673     }
674     else // change default
675     {
676         HAL_PMU_SET_HPSYS_LDO_VREF(PMU_HPSYS_LDO_VREF_DEFAULT);
677     }
678 #endif
679 #ifdef SF32LB55X
680     res = BSP_OTP_CFG_READ(FACTORY_CFG_ID_CRYSTAL, (uint8_t *)&xtal_cfg, sizeof(FACTORY_CFG_CRYSTAL_T), buf, len);
681     if ((res > 0) && (xtal_cfg.cbank_sel != 0) && (xtal_cfg.cbank_sel != 0x3ff)) // add xtal invalid data check
682     {
683         // set crystal configure.
684         HAL_PMU_SET_HXT_CBANK(xtal_cfg.cbank_sel);
685     }
686     else // do not set by factory test, use defualt 0x1ea;
687     {
688         HAL_PMU_SET_HXT_CBANK(0x1EA);
689     }
690 #endif /* SF32LB55X */
691 
692 
693     FACTORY_CFG_ADC_T adc_cfg;
694     res = BSP_OTP_CFG_READ(FACTORY_CFG_ID_ADC, (uint8_t *)&adc_cfg, sizeof(FACTORY_CFG_ADC_T), buf, len);
695     if (res > 0)
696     {
697         BSP_CONFIG_set(FACTORY_CFG_ID_ADC, (uint8_t *)&adc_cfg, sizeof(FACTORY_CFG_ADC_T));
698     }
699     res = BSP_OTP_CFG_READ(FACTORY_CFG_ID_SDMADC, (uint8_t *)&sdm_cfg, sizeof(FACTORY_CFG_SDMADC_T), buf, len);
700     if (res > 0)
701     {
702         BSP_CONFIG_set(FACTORY_CFG_ID_SDMADC, (uint8_t *)&sdm_cfg, sizeof(FACTORY_CFG_SDMADC_T));
703     }
704     res = BSP_OTP_CFG_READ(FACTORY_CFG_ID_BATTERY, (uint8_t *)&battery_cfg, sizeof(FACTORY_CFG_BATTERY_CALI_T), buf, len);
705     if (res > 0)
706     {
707         BSP_CONFIG_set(FACTORY_CFG_ID_BATTERY, (uint8_t *)&battery_cfg, sizeof(FACTORY_CFG_BATTERY_CALI_T));
708     }
709 
710     res = BSP_OTP_CFG_READ(FACTORY_CFG_ID_SIPMODE, (uint8_t *)&sip_cfg, sizeof(FACTORY_CFG_SIP_MOD_T), buf, len);
711     if (res <= 0)
712     {
713         sip1_mode = 0;
714         sip2_mode = 0;
715     }
716     else
717     {
718         sip1_mode = sip_cfg.mpi1_mode;
719         sip2_mode = sip_cfg.mpi2_mode;
720     }
721 
722     // load user otp page to cache buffer
723     buf = (uint8_t *)conf_user;
724     len = HAL_QSPI_READ_OTP(&fhandle, CFG_USER_OTP_PAGE << 12, buf, CFG_USER_SIZE);
725     HAL_ASSERT(len > 0);
726 
727     buf = (uint8_t *)conf_cust;
728     len = HAL_QSPI_READ_OTP(&fhandle, CFG_CUST_OTP_PAGE << 12, buf, CFG_USER_SIZE);
729     HAL_ASSERT(len > 0);
730 
731 #ifndef SF32LB55X
732     res = BSP_OTP_CUST_CFG_READ(FACTORY_CFG_ID_CRYSTAL, (uint8_t *)&xtal_cfg, sizeof(FACTORY_CFG_CRYSTAL_T), (uint8_t *)conf_buf, CFG_SYS_SIZE);
733     if ((res > 0) && (xtal_cfg.cbank_sel != 0) && (xtal_cfg.cbank_sel != 0x3ff)) // add xtal invalid data check
734     {
735 #ifdef SOC_BF0_HCPU
736         BSP_HxtCbank_Config(xtal_cfg.cbank_sel);
737 #endif
738     }
739 #endif /* !SF32LB55X */
740 
741     return 0;
742 }
743 #endif // SF32LB52X
744 
BSP_Get_UserOTP_Cache()745 char *BSP_Get_UserOTP_Cache()
746 {
747     return (char *)conf_user;
748 }
749 
BSP_Get_CustOTP_Cache()750 char *BSP_Get_CustOTP_Cache()
751 {
752     return (char *)conf_cust;
753 }
754 
HAL_RAM_RET_CODE_SECT(BSP_Get_Sip1_Mode,uint32_t BSP_Get_Sip1_Mode ())755 HAL_RAM_RET_CODE_SECT(BSP_Get_Sip1_Mode, uint32_t BSP_Get_Sip1_Mode())
756 {
757     return (uint32_t)sip1_mode;
758 }
759 
HAL_RAM_RET_CODE_SECT(BSP_Get_Sip2_Mode,uint32_t BSP_Get_Sip2_Mode ())760 HAL_RAM_RET_CODE_SECT(BSP_Get_Sip2_Mode, uint32_t BSP_Get_Sip2_Mode())
761 {
762     return (uint32_t)sip2_mode;
763 }
764 
BSP_GetOtpBase(void)765 __weak uint32_t BSP_GetOtpBase(void)
766 {
767 #if defined(SF32LB56X)||defined(SF32LB58X)
768     return 0x1C000000;
769 #else
770     return 0x10000000;
771 #endif
772 }
773 
774 #endif //HAL_SYSTEM_CONFIG_ENABLED
775 /**
776   * @}
777   */