How can I use key button to wake up system?

cancel
Showing results for 
Search instead for 
Did you mean: 

How can I use key button to wake up system?

1,830 Views
chenglong
Contributor I

I use i'mx53.
I want to use a key button to wake up system.The key button uses gpio1_8.I have changed arch/arm/mach-mx5/Pm.c to use irq 50.But it does not work.When system enter sleeping,it dose not wake up.How can I do?Thanks a lot.

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");

}

Labels (2)
0 Kudos
19 Replies

560 Views
enaud
Contributor III

nothing can help me?

pls

0 Kudos

560 Views
jimmychan
NXP TechSupport
NXP TechSupport

Are you board use the same PMIC DA9053 as the SMD board?

mx53_smd_loco_irq_wake_fixup() function called in the "mx53_smd.c --> smd_suspend_enter() " or "mx53_loco.c --> loco_suspend_enter() " . Please double check the function called properly when enter to the suspend mode.

0 Kudos

560 Views
enaud
Contributor III

Why 0x1<<18???? what is this?

0 Kudos

560 Views
jimmychan
NXP TechSupport
NXP TechSupport

Please read the i.MX53RM Chapter 75.6.14 Wakeup Config Register: Irq 0 to 31 (TZIC_WAKEUPn) for more details.

The Wakeup Conguration Registers (WAKEUP) are used to set which interrupts will assert the tzic_wakeup_request signal. Each bit in the register corresponds to an interrupt source available in the system.

For example: According to the i.MX53 RM "Table 3-1. ARM Domain Interrupt Summary", IRQ 50 is "Combined interrupt indication for GPIO-1 signal 0 throughout 15".

Then in Chapter 75.6.14, the formula is WAKEUP[31] -> (32*X)+31.

In this case, WAKEUP[50] is 32*1+18.  so the TZIC_WAKEUP1's 18bit need to be set 1.

Hope this can help you to understand.

0 Kudos

560 Views
enaud
Contributor III
jimmychan: but I must use this code in upper part of this post or simply i must use this code, how FabioEstevan suggest me? Standby and wakeup with a gpio
0 Kudos

560 Views
jimmychan
NXP TechSupport
NXP TechSupport

This part of code is write to register directly. Just want to make sure that the GPIO is set as a wakeup source directly to avoid if somewhere missed or set it wrongly. Plesae also check the initial value (pull-up or pull-down) of the GPIO. So when you press the button, the value should from 0->1  or  1->0. 

0 Kudos

560 Views
enaud
Contributor III

I've setted gpio6_3:

in mx53loco.c i have:

#define GPIO105 (0x1<<9)    <------- It is a correct value?  from iMX53RM pg217 ---> 105 GPIO-6  "Combined interrupt indication for GPIO-6 signal 0 throughout 15"


in static iomux_v3_cfg_t mx53_loco_pads[] {


//MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17,

MX53_PAD_CSI0_DAT17__GPIO6_3,


and:


static void loco_da9053_irq_wakeup_only_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(GPIO105, tzic_base + TZIC_WAKEUP3_OFFSET);

  iounmap(tzic_base);

  pr_info("only da9053 irq is wakeup-enabled\n");

}

static void loco_suspend_enter(void)

{

  if (!board_is_mx53_loco_mc34708()) {

  loco_da9053_irq_wakeup_only_fixup();

  da9053_suspend_cmd_sw();

  }

}


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

0 Kudos

560 Views
jimmychan
NXP TechSupport
NXP TechSupport

1. define a key

#define MX53_PAD_ WAKEUP  (5*32 + 3)   /* GPIO6_3 */

2.  put it in the gpio_key_button to register the gpio button.

#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)

#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \

{        \

.gpio  = gpio_num,    \

.type  = EV_KEY,    \

.code  = ev_code,    \

.active_low = act_low,    \

.desc  = "btn " descr,    \

.wakeup  = wake,     \

}

static struct gpio_keys_button loco_buttons[] = {

GPIO_BUTTON(MX53_nONKEY, KEY_POWER, 1, "power", 0),

GPIO_BUTTON(USER_UI1, KEY_VOLUMEUP, 1, "volume-up", 0),

GPIO_BUTTON(USER_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),

GPIO_BUTTON(MX53_PAD_ WAKEUP,KEY_F4,0,"wakeup",1),

};

0 Kudos

560 Views
enaud
Contributor III

what is KEY_F4? in GPIO_BUTTON(MX53_PAD_ WAKEUP,KEY_F4,0,"wakeup",1),?

And this?

#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)

#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake) \

{        \

.gpio  = gpio_num,    \

.type  = EV_KEY,    \

.code  = ev_code,    \

.active_low = act_low,    \

.desc  = "btn " descr,    \

.wakeup  = wake,     \

}

0 Kudos

560 Views
jimmychan
NXP TechSupport
NXP TechSupport

You can find this part of code in mx53_loco.c.

Just like other key buttons, to define the F4 Key as a wakeup button.


0 Kudos

560 Views
enaud
Contributor III

In static iomux_v3_cfg_t mx53_loco_pads[] = {

I have writed:

I commented:

//MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17,

and  i have add:

MX53_PAD_CSI0_DAT17__GPIO6_3,

IS RIGHT?

And this function ? i must modified nothing?

static void loco_da9053_irq_wakeup_only_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);

  iounmap(tzic_base);

  pr_info("only da9053 irq is wakeup-enabled\n");

}

0 Kudos

559 Views
enaud
Contributor III

i've tested  your code but it dont work,

AT GPIO6_3 i have connected a button and when i press it /sys/class/gpio/gpio163/value is 0.

look here:

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.174 msecs

suspend wp cpu=400000000

PM: late suspend of devices complete after 0.784 msecs

only da9053 irq is wakeup-enabled

PM: early resume of devices complete after 0.377 msecs

IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)

and gpio163(6_3) dont work.

THEN i have enabled:

CONFIG_KEYBOARD_GPIO=y in ltib->device_driver->etc....

and when i type in console:

echo 163 > /sys/class/gpio/export

echo in > /sys/class/gpio/gpio163/direction

i have error and gpio163 dont exist in /sys/class/gpio/      

:smileyangry:

my mx53loco is this attached, pls help me :smileysad:

0 Kudos

559 Views
chenglong
Contributor I

When the system is running,the key button can cause the interrupt.I have checked it.So the imoux setting has no problem.But when the system enter sleeping,the irq can't wake up system.I don't konw how to modify the codes.

0 Kudos

559 Views
RichardZhao
Contributor I

On some platforms, iomux registers are over-written to save power when enter into suspend. I'm not sure whether it's the case. What release are you using? And you can dump registers after setup everything to see whether it's as expected.

0 Kudos

561 Views
RongDian
Contributor I

According your code modification and description,  IRQ 50  should  be registered into system wakeup  IRQ source group

0 Kudos

561 Views
RongDian
Contributor I

hi, I belive imx53  bsp supplies powerkey feature for suspend/resume , you can refer to mxc_pwrkey.c. According to your code, you should catch key signal  with oscilloscope to check your wakeup irq and IO pad property/IO direction input/iomux configure

0 Kudos

561 Views
RichardZhao
Contributor I

Did you check iomux settings?

0 Kudos

561 Views
chenglong
Contributor I

I have checked the iomux setting.It's gpio.It is no problem.Thanks for your reply.

0 Kudos

560 Views
RichardZhao
Contributor I

hmm.., can you receive interrupt at runtime, or just can not wake up the system?

0 Kudos