我目前正致力于在嵌入式系统(基于Freescale i.MX6)上移植Android 4.4(Kitkat)。为了开始我的开发,我使用了一些开发工具包(Wandboard,Boundary Device的BD-SL)。
在我的自定义电路板的电源管理工作中,我毫不费力地将devkits暂停。但是,我找不到如何将它们从睡眠中唤醒(除了重新启动它们)。唤醒系统的预期方式是在GPIO上获得中断(例如基于Android的手机上的开关按钮)。
我想知道通过GPIO的中断从挂起唤醒Android设备的常用方法是什么。虽然这个问题看似微不足道,但我无法从谷歌和专业论坛上的各种搜索中收集所需的所有信息。我发现了很多信息,但没有任何内容涉及整个主题。可能是因为我错过了所需的背景,所以我没有代码示例就无法将所有内容放在一起。我猜我不是这种情况下的唯一一个,因此这篇文章。
以下是我发现的一些信息:
答案 0 :(得分:3)
最后,我挖得太深了。代码示例就在我的鼻子底下。我需要的一切都在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();
//...
}
为了完整性,初始化数据结构指向Board特定的初始化
/*
* 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