分类: LINUX
2011-12-22 16:08:49
在调试SD卡的时候,发现一插入SD卡便导致板子重启,经过检测,返现VDDIO会有一个browout,因为一插入SD卡,VDDIO负载变大,导致出现电压变化,但是为什么重启了呢?
在imx233的启动文件中,有电源初始化,在power_prep.c中,_start函数中经过跟踪发现 PowerPrep_EnableOutputRailProtection此函数导致重启,进入分析源码,对照芯片手册,发现针对 HW_POWER_CTRL寄存器,开启了三路电源vddio vdda vddd的browout的中断,但是在源码后续分析中也发现,对于VDDIO的browout的侦测有时候是存在虚假的,可以禁止掉此中断,在函数 PowerPrep_EnableOutputRailProtection中,
/* note that VDDIO brownout indicator has been found to falsely
* trigger due to a 5V connection. Possibly also due to a pswitch
* press.
*/
#ifndef DISABLE_VDDIO_BO_PROTECTION
HW_POWER_VDDIOCTRL.B.PWDN_BRNOUT = 1;
#endif
所以定义 #define DISABLE_VDDIO_BO_PROTECTION
即可,重启一切正常~~~~~~~~~~~
上述阶段只是针对,未启动内核之前,在启动内核之后,还要对电源重新进行一次初始化。通过对于源码的剖析,将主要流程在此叙述下,
针对采用IMX233config的内核来说,在drivers/power/mxs/linux.c中,有一个函数 init_protection,此函数是为了完成一定的保护工作而作的电源硬件配置,在其中,有函数 ddi_power_InitOutputBrownouts,便是完成的三路电源browout的中断配置,进入
void ddi_power_InitOutputBrownouts(void)
{
uint32_t temp;
__raw_writel(BM_POWER_CTRL_VDDD_BO_IRQ |
BM_POWER_CTRL_VDDA_BO_IRQ |
BM_POWER_CTRL_VDDIO_BO_IRQ,
REGS_POWER_BASE + HW_POWER_CTRL_CLR);
__raw_writel(BM_POWER_CTRL_ENIRQ_VDDD_BO |
BM_POWER_CTRL_ENIRQ_VDDA_BO |
BM_POWER_CTRL_ENIRQ_VDDIO_BO,
REGS_POWER_BASE + HW_POWER_CTRL_SET);
temp = __raw_readl(REGS_POWER_BASE + HW_POWER_VDDDCTRL);
temp &= ~BM_POWER_VDDDCTRL_PWDN_BRNOUT;
__raw_writel(temp, REGS_POWER_BASE + HW_POWER_VDDDCTRL);
temp = __raw_readl(REGS_POWER_BASE + HW_POWER_VDDACTRL);
temp &= ~BM_POWER_VDDACTRL_PWDN_BRNOUT;
__raw_writel(temp, REGS_POWER_BASE + HW_POWER_VDDACTRL);
temp = __raw_readl(REGS_POWER_BASE + HW_POWER_VDDIOCTRL);
temp &= ~BM_POWER_VDDIOCTRL_PWDN_BRNOUT;
__raw_writel(temp, REGS_POWER_BASE + HW_POWER_VDDIOCTRL);
}
可以看到temp &= ~BM_POWER_VDDIOCTRL_PWDN_BRNOUT;
这便是开启相应电源路的browout中断,注释掉就可以了,重新编译启动即可,针对stm37XXX的配置,其思路是一样的只是文件位置不同而已