公司项目使用SIM2_SCLK作为External Buck的Enable pin,Dws中配置为GPIO mode,output high;
但是开机却开不起来,量去Vcore以及Buck Enable pin的电压波形发现Vcore电压升至1.3V后,很短时间就降为0,而Buck Enable pin始终没有电压,感觉就是这个GPIO口拉不起来,因为之前也没有使用过SIM卡的CLOCK口作GPIO,但和硬件确认说MTK明确回复该口可以作GPIO使用。
问题卡在这边,接下来我们量了下其他使用External Buck的Vcore以及 Buck Enable pin的波形:
Vcore在从0升至1.3V后,大概维持了1.26s后,会有一个电压下降(ms级别),之后又恢复1.3V,从硬件原理上分析是在Vcore上电1.2s后基于功耗效率考虑降为0.75V输出,但同时GPIO使能External Buck,Buck输出1.3V,由于是和Vcore并联,又将Vcore抬高到1.3V。
上述主要过程对应code中如下:
/*below code is add for init external buck*/
#if defined(__EXT_BUCK__)
DclPMU_Initialize();
gpio_external_buck_set_in_normal_mode();
pmu_vcore_voltage_set_in_normal_mode();
#endif
----------
void gpio_external_buck_set_in_normal_mode(void)
{
gpio_external_buck_init();
gpio_external_buck_turn_on();
}
void pmu_vcore_voltage_set_in_normal_mode(void)
{
DCL_HANDLE handle;
PMU_CTRL_LDO_BUCK_SET_VOLTAGE val;
handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
val.voltage = PMU_VOLT_00_750000_V;
val.mod = VCORE;
DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&val);
DclPMU_Close(handle);
}
----------
之后我们开始检查SIM部分的电源域,因之前项目GPIO使用的是2.8V的电源域,而这里的电压是1.8V,基带确认1.8V的输出是足够拉高的。最后没办法我们又测量了同属于同一电源域的VSIM2,结果竟然也是没有电压。。。只不过这次问题很明显了,SIM2的电源根本就没有打开!
Finally,我们在buck初始化时gpio_external_buck_init加入:
/* Enable VSIM2 power and adjust VSIM2 to 1.8V */
handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
val.voltage = PMU_VOLT_01_800000_V;
val.mod = VSIM2;
DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&val);
ldo_vsim_gpldo_en.enable = DCL_TRUE;
ldo_vsim_gpldo_en.mod = VSIM2;
DclPMU_Control(handle, LDO_BUCK_SET_VSIM2_GPLDO_EN, (DCL_CTRL_DATA_T *)&ldo_vsim_gpldo_en);
ldoSetEn.mod = VSIM2;
ldoSetEn.enable = DCL_TRUE;
DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&ldoSetEn);
DclPMU_Close(handle);
Problem Solved.