本文通過修改 SYS_CTRL3 的引腳配置為例說明 PMU CTRLx 的控制方法。
1.打開 PMU 的開關
(1)打開 PMU 的開關
vim lunch_config/X9E_Ref_Linux_Serdes_1G_2133.json
SUPPORT_PMU_SDDRV=true SUPPORT_PMU_TEST=true
(2)修改後記得重新配置編譯環境
source lunch_sd.sh -c X9E_Ref_Linux_Serdes_1G_2133.json -b X9_PTG4.3 -u customer_c
2.添加 PMU 的控制代碼
(1)在 target_init.c 中添加 PMU 的控制代碼
vim rtos/freertos_safetyos/target/reference_x9/safety/target_init.c
(2)具體實現函數如下:
int enable_sys_ctrl3(void)
{
int ret = 0;
int id = 3;
int status_val = 0;
int io_mode = PWR_CTRL_OUTPUT;
int ctrl_mode = PWR_CTRL_OUTPUT_MANUAL;
int level = PWR_CTRL_OUTPUT_HIGH; //PWR_CTRL_OUTPUT_LOW;
void *sys_ctrl3_handle = NULL;
//uint32_t pmu_res_glb_idx = RES_PMU_PMU;
int pu_delay = 0x09; // 3ms
int pd_delay = 0x09; // 3ms
ret = hal_pmu_creat_handle( &sys_ctrl3_handle, RES_PMU_PMU);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 1 _%s ] creat handle err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 1 _%s ] creat handle [ OK! ] ret:%d\n", __func__, ret);
ret = hal_pmu_init(sys_ctrl3_handle);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 2 _%s ] handle init err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 2 _%s ] handle init [ OK! ] ret:%d\n", __func__, ret);
/** get pmu status */
ret = hal_pmu_get_status(sys_ctrl3_handle, &status_val);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 2.1 _%s ] get status err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 2.1 _%s ] get status [ OK! ] status_val:0x%x\n", __func__, status_val);
/* set ctrl_id as output mode */
ret = hal_pmu_set_powerctrl_io_mode(sys_ctrl3_handle, id, io_mode);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 3 _%s ] handle set io_mode err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 3 _%s ] handle set io_mode [ ctrl_id:%d, io_mode:%d (0:output, 1:input)] ret:%d\n", __func__, id, io_mode, ret);
/* set output as auto or manual */
ret = hal_pmu_set_powerctrl_out_mode(sys_ctrl3_handle, id, ctrl_mode);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 4 _%s ] handle set out_mode err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 4 _%s ] handle set out_mode [ ctrl_id:%d, ctrl_mode:%d (0:auto, 1:manual)] ret:%d\n", __func__, id, ctrl_mode, ret);
/* set powerctrl powerup delay */
ret = hal_pmu_set_powerctrl_powerup_delay(sys_ctrl3_handle, id, pu_delay);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 5 _%s ] handle set powerup_delay err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 5 _%s ] handle set powerup_delay [ ctrl_id:%d, powerup_delay:0x0%x (0x09: 3ms)] ret:%d\n", __func__, id, pu_delay, ret);
/* set powerctrl powerdown delay */
ret = hal_pmu_set_powerctrl_powerdown_delay(sys_ctrl3_handle, id, pd_delay);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 6 _%s ] handle set powerdown_delay err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 6 _%s ] handle set powerdown_delay [ ctrl_id:%d, powerdown_delay:0x0%x (0x09: 3ms)] ret:%d\n", __func__, id, pd_delay, ret);
/** set powerctrl out high or low **/
ret = hal_pmu_set_powerctrl_out_ctrl(sys_ctrl3_handle, id, level);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 7 _%s ] handle set out_ctrl err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 7 _%s ] handle set out_ctrl [ ctrl_id:%d, level:%d (0:low, 1:high)] ret:%d\n", __func__, id, level, ret);
/**** exit ****/
ret = hal_pmu_exit(sys_ctrl3_handle);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 8 _%s ] handle exit err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 8 _%s ] handle exit [ OK! ] ret:%d\n", __func__, ret);
ret = hal_pmu_release_handle(sys_ctrl3_handle);
if(0 != ret){
dprintf(CRITICAL, "**[ stark add 9 _%s ] handle release err! ret:%d\n", __func__, ret);
return ret;
}
else dprintf(CRITICAL, "**[ stark add 9 _%s ] handle release [ OK! ]! ret:%d\n", __func__, ret);
dprintf(CRITICAL, "**[ stark add 10 _%s ] - [ enable_ctrl3 running OK! ]!\n", __func__);
return 0;
3.相關宏定義參數修改
(1)PMU 相關的宏定義位置在 pmu_drv.h 文件中
vim rtos/lk_boot/chipdev/pmu/sd_pmu/inc/pmu_drv.h
(2)這裡需要修改 Manual 和 auto 模式的定義
4.編譯燒寫測試
(1)編譯打包
make freertos
make genpac
(2)燒寫驗證
開機 safety log 確認如下信息即配置成功。
5.總結
本文通過修改 SYS_CTRL3 的引腳配置為例說明 PMU CTRLx 的控制方法,文中還給出了實際添加的控制 SYS_CTRL3 的代碼,讀者可以通過相同的修改,完全實現這個功能。
6.參考資料
[1]《Semidrive_AN_9系列PMU使用說明》
[2]《X9_SDK_用戶手冊_Rev1.7》
芯馳 X9系列相關博文:
《基於芯馳 X9HP PTG4.1 添加 yocto 應用》
《基於芯馳 X9HP PTG4.3 修改 4G DDR Layout》
《基於芯馳 X9HP PTG4.1 修改 UART10 作為 linux 串口輸出》
歡迎在博文下方留言評論,我們會及時回復您的問題。
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:好景虛設
更多資訊,請掃碼關注我們!
評論