我现在用的是tps65217,现在要控制evm班子的开关机,请问是不是开关机可以通过RTC模块通过alarm寄存器控制PMIC_POWER_EN来实现开关机?请问板子休眠是怎么控制的呢?
Steven Liu1:
你用的是什么操作系统,如果是Linux的话,可以参考下面的这个链接,通过命令行的操作来控制板子进入到休眠状态。
http://processors.wiki.ti.com/index.php/AM335x_Linux_Power_Management_User_Guide#Suspend_.26_Resume
唤醒的话,看你进入到了什么样的休眠模式,如果是DS0的话,串口终端,GPIO等都是可以作为唤醒源的。如果使能的RTC,RTC也可以作为唤醒源,具体的你可以参考一下TRM手册的8.1.4节Power Management
PS:板子的开关机和休眠唤醒是两个概念,看你的意思应该是要控制休眠唤醒,不知道我理解的对不对。
qun zhou:
回复 Steven Liu1:
你好,谢谢你的耐心回答,我正在调试板子的开关机,然后会调试休眠唤醒,现在在调试开关机的时候,遇到问题:
我tps65217的enable引脚是连接在am335x的PMIC_POWER_EN上的,是不是我可以在rtc中的rtc_power_off函数中对其进行控制:
static void rtc_power_off(void){//pr_info("enter===>%s\n",__func__); u32 val; struct rtc_time tm; /* Set PMIC power enable */ val = readl(rtc_base + OMAP_RTC_PMIC_REG); writel(val | OMAP_RTC_PMIC_POWER_EN_EN, rtc_base + OMAP_RTC_PMIC_REG); // /* Wait few seconds instead of rollover */ do { omap_rtc_read_time(NULL, &tm); if (WAIT_AFTER <= tm.tm_sec) mdelay(WAIT_TIME_MS); } while (WAIT_AFTER <= tm.tm_sec); /* Add shutdown time to the current value */ tm.tm_sec += SHUTDOWN_TIME_SEC; if (tm2bcd(&tm) < 0) return;这个是在rtc_omap.c中的代码,
/* * rtc_power_off: Set the pmic power off sequence. The RTC generates * pmic_pwr_enable control, which can be used to control an external * PMIC. */
这个是这个函数的注释,power_off功能,但是
/* Set PMIC power enable */ val = readl(rtc_base + OMAP_RTC_PMIC_REG); writel(val | OMAP_RTC_PMIC_POWER_EN_EN, rtc_base + OMAP_RTC_PMIC_REG)
这又是power enable,,这个怎么理解,
还有一个问题,在/arch/arm/kernel/process.c函数中,有一些void machine_power_off(void){ machine_shutdown(); if (pm_power_off) pm_power_off();}的函数,开关机的操作会调用到这里的函数吗?
Jian Zhou:
回复 qun zhou:
rtc_power_off()这个函数不要做改动。
omap_rtc_probe()函数中的:
/* RTC power off */ if (pdata && pdata->pm_off && !pm_power_off) pm_power_off = rtc_power_off;
把 if (pdata && pdata->pm_off && !pm_power_off)这个判断注释掉,直接pm_power_off = rtc_power_off;就可以了
qun zhou:
回复 Jian Zhou:
我就是不是很明白他是power_off的函数,为什么在里边会显示
/* Set PMIC power enable */ val = readl(rtc_base + OMAP_RTC_PMIC_REG); writel(val | OMAP_RTC_PMIC_POWER_EN_EN, rtc_base + OMAP_RTC_PMIC_REG);的函数,
还有一点有没有一个power_on,控制开机的函数呢?
Jian Zhou:
回复 qun zhou:
这个power_off是在Linux下执行shut down命令调用的。
Linux系统直接通过供电开机,貌似没有power_on命令
qun zhou:
回复 Jian Zhou:
我按照你的方法将if屏蔽掉以后,在执行omap_rtc_probe()函数以后,还是没有关机
//if (reg & (u8) OMAP_RTC_STATUS_POWER_UP) { // pr_info("%s: RTC power up reset detected\n", // pdev->name); rtc_write(OMAP_RTC_STATUS_POWER_UP, OMAP_RTC_STATUS_REG);
还有在这个函数中, rtc_write(OMAP_RTC_STATUS_POWER_UP, OMAP_RTC_STATUS_REG);直接执行这条代码也不能reset。
Jian Zhou:
回复 qun zhou:
omap_rtc_probe()里面是给power_off()函数赋值,关机的话要在命令行执行shutdown命令。
qun zhou:
回复 Jian Zhou:
你好,我在执行
sync; echo mem > /sys/power/state
echo standby > /sys/power/state进入睡眠状态以后,为什么按下am335x上的tps上的PB_IN以后,不能退出休眠tps的 PB_IN作用:
push button monitor is used to: • Power-up the device from OFF or SLEEP mode upon detecting a falling edge on PB_IN. • Power cycle the device when PB_IN is held low for > 8 s. 第一个功能就是在低跳变的时候,出进入power_on
Jian Zhou:
回复 qun zhou:
系统休眠是指AM335x休眠,而不是PMU,所以控制PMU的某个pin不能唤醒AM335x。
一般要通过AM335x的唤醒源去唤醒,比如串口或者GPIO
qun zhou:
回复 Jian Zhou:
那我在进入系统休眠的时候,tps是工作在什么状态呢?
还有一个问题怎么让tps进入休眠状态呢?