其他分享
首页 > 其他分享> > 如何使用GPIO从Suspend唤醒Android嵌入式开发板

如何使用GPIO从Suspend唤醒Android嵌入式开发板

作者:互联网

我目前正在将Android 4.4(Kitkat)移植到嵌入式系统(基于Freescale i.MX6)上.为了开始我的开发,我使用了一些开发套件(Wandboard,边界设备的BD-SL).

在定制板电源管理方面,我可以毫不费力地将开发套件暂停.但是,我找不到如何将它们从睡眠中唤醒的方法(除了对它们重新加电之外).唤醒系统的预期方式是通过在GPIO上获取中断(例如,基于Android的手机上的开/关按钮).

我想知道用GPIO中断将Android设备从挂起状态唤醒的常用方法是什么.尽管这个问题看似微不足道,但我无法从Google和专业论坛上的各种搜索中收集所需的所有信息.我发现了很多信息,但没有涵盖整个主题.可能是因为缺少所需的背景知识,所以在没有代码示例的情况下,我很难将所有内容组合在一起.我猜我不是在这种情况下的唯一一个人,因此是这篇文章.

这是我发现的一些信息:

> Android PowerPanager and wake locks
> Android Power Management
> Android Power Management on i.MX6DQ/DL
> Android Input

解决方法:

最后,我挖得太深了.该代码示例就在我的眼皮底下.我需要的一切都在BD-SL devkit的主板特定代码中(可以在mydroid / BD-SL-i.MX6 / kernel_imx / arch / arm / mach-mx6 / board-mx6_nitrogen6x.c中的BD-SL源代码树中找到. )

该代码特定于飞思卡尔i.MX6提供的内核,但不同的部分应轻松移植/适配其他Android嵌入式平台.

GPIO定义.为了简单起见,我跳过了GPIO引脚复用器.该引脚需要多路复用到GPIO功能:

#define GP_ONOFF_KEY        IMX_GPIO_NR(2, 3)

输入键的定义

#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 buttons[] = {
    GPIO_BUTTON(GP_ONOFF_KEY, KEY_POWER, 1, "key-power", 1),
};

相应平台数据和平台设备的定义:

static struct gpio_keys_platform_data button_data = {
    .buttons    = buttons,
    .nbuttons   = ARRAY_SIZE(buttons),
};

static struct platform_device button_device = {
    .name       = "gpio-keys",
    .id     = -1,
    .num_resources  = 0,
    .dev        = {
        .platform_data = &button_data,
    }
};

平台设备的注册

static void __init add_device_buttons(void)
{
    platform_device_register(&button_device);
}

/*!
 * Board specific initialization.
 */
static void __init board_init(void)
{
    //...

    add_device_buttons();

    //...
}

为了完整起见,指向董事会特定初始化的初始化数据结构

/*
 * initialize data structure.
 */
MACHINE_START(MX6_NITROGEN6X, "Boundary Devices Nitrogen6X/SABRE Lite Board")
    /* Maintainer: Boundary Devices */
    .boot_params = MX6_PHYS_OFFSET + 0x100,
    .fixup = fixup_mxc_board,
    .map_io = mx6_map_io,
    .init_irq = mx6_init_irq,
    .init_machine = board_init,
    .timer = &timer,
    .reserve = reserve,
MACHINE_END

标签:powermanager,embedded,linux-kernel,input-devices,android
来源: https://codeday.me/bug/20191121/2048275.html