Hi,
my system is formed by a board with imx53 and a display 10''
LVDS.
I need to put the system in standby(STOP MODE?) consuming as little as
possible (turnin off the display) and wake up it with the push of a
button (GPIO connected all'MX53) quickly.
How do I?
PS: I'm already reading the AN4270. but I can not find the wakeup function and how enable the STOP MODE?
thanks
Take a look at arch/arm/mach-mx5/board-mx53_loco.c:
static const struct gpio_keys_button loco_buttons[] __initconst = {
GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 1),
GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0),
GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),
};
all these GPIOs act as wakeup sources.
Look also at the GPIO_BUTTON definition to understand how it works (hint: there is a .wakeup field).
Also, don't forget to setup your GPIO pin as GPIO (look at mx53_loco_pads array).
Regards,
Fabio Estevam
Thanks Fabio,
I've view this post https://community.freescale.com/message/302517#302517
I must put this code in mx53_loco.c?
static void mx53_smd_loco_irq_wake_fixup(void)
{
void __iomem *tzic_base;
tzic_base = ioremap(MX53_TZIC_BASE_ADDR, SZ_4K);
if (NULL == tzic_base) {
pr_err("fail to map MX53_TZIC_BASE_ADDR\n");
return;
}
__raw_writel(0, tzic_base + TZIC_WAKEUP0_OFFSET);
__raw_writel(0, tzic_base + TZIC_WAKEUP1_OFFSET);
__raw_writel(0, tzic_base + TZIC_WAKEUP2_OFFSET);
/* only enable irq wakeup for da9053 */
// __raw_writel(GPIO7_0_11_IRQ_BIT, tzic_base + TZIC_WAKEUP3_OFFSET);
__raw_writel(0x1<<18, tzic_base + TZIC_WAKEUP1_OFFSET);
iounmap(tzic_base);
pr_info("only da9053 irq is wakeup-enabled\n");
}
No, no need to add such code.
As I told you you only need to do two things:
1. Add
GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 1),
,where MX53_LOCO_POWER needs to be adapted to the GPIO number you have in your real hardware
2. Setup your GPIO pin as GPIO (look at mx53_loco_pads array).
Regards,
Fabio Estevam
Hi,
Thanks:
so, i have this GPIO: MX53_PAD_CSI0_DAT17__GPIO6_3
and in mx53_loco.c:
1) #define GPIO6_3 (5*32+3) //GPIO6_3
2) in static iomux_v3_cfg_t mx53_loco_pads[], add:
MX53_PAD_CSI0_DAT17__GPIO6_3,
and comment:
//MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17,
3) in static struct gpio_keys_button loco_buttons[] = {
// GPIO_BUTTON(MX53_nONKEY, KEY_POWER, 1, "power", 0),
GPIO_BUTTON(GPIO6_3, KEY_POWER, 1, "power", 1),
GPIO_BUTTON(USER_UI1, KEY_VOLUMEUP, 1, "volume-up", 0),
GPIO_BUTTON(USER_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),
};
IS CORRECT?
YOU confirm it?
so i can standby the system with : echo mem > /sys/power/state ?
THANKS
I haven't measured the time it takes to wakeup the system, but this is something you can easily measure.
Yes, many drivers can be turned off in low power mode. Power Management layer (CONFIG_PM) will take care of it.
Each individual driver may have its own hooks for handling low power mode.
Regards,
Fabio Estevam
Most likely you have alreadt CONFIG_PM=y in your .config file.
#
# Power management options
#
CONFIG_SUSPEND=y
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_SUSPEND_DEVICE_TIME_DEBUG=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_RUNTIME=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y
Regards,
Fabio Estevam
This is my .config file:
#
# Power management options
#
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not set
# CONFIG_PM_VERBOSE is not set
CONFIG_CAN_PM_TRACE=y
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND_NVS=y
CONFIG_SUSPEND=y
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_SUSPEND_DEVICE_TIME_DEBUG=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_APM_EMULATION=y
CONFIG_PM_RUNTIME=y
CONFIG_PM_OPS=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_NET=y
SO THIS IS MAX of LOW POWER for i.MX53 ??
In order to enter into low power mode:
echo mem > /sys/power/state
Many low-power techniques are already implemented in the FSL BSP.
If you need to further optmize power savings, you may refer to this application note:
cache.freescale.com/files/32bit/doc/app_note/AN4270.pdf
Regards,
Fabio Estevam
Hi,
i've tested the new kernel with this changes, but it dont work at wakeup...
I've setted gpio163:
root@freescale ~$ echo 163 > /sys/class/gpio/export
root@freescale ~$ echo in > /sys/class/gpio/gpio163/direction
root@freescale ~$ cd /sys/class/gpio
root@freescale /sys/class/gpio$ cd gpio163
and it work infact when i pres button vale change:
root@freescale /sys/class/gpio/gpio163$ cat value
1
root@freescale /sys/class/gpio/gpio163$ cat value
0
root@freescale /sys/class/gpio/gpio163$ cat value
1
root@freescale /sys/class/gpio/gpio163$ cat value
0
after i go in standby:
root@freescale ~$ echo 163 > /sys/class/gpio/export
root@freescale ~$ echo in > /sys/class/gpio/gpio163/direction
root@freescale ~$ cd /sys
root@freescale /sys$ cd power
STANDBY MODE:
root@freescale /sys/power$ echo mem > state
PM: Syncing filesystems ... done.
Freezing user space processes ... (elapsed 0.01 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.01 seconds) done.
da9052_tsi_suspend: called
PM: suspend of devices complete after 727.189 msecs
suspend wp cpu=400000000
PM: late suspend of devices complete after 0.794 msecs
only da9053 irq is wakeup-enabled
PM: early resume of devices complete after 0.390 msecs
IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)
NOW WHEN I PRESS BUTTON IT DONT RETURN IN IDLE STATE to CONSOLE...
why? you can help me pls?