Android 使用gpio键中断唤醒RPi3上的屏幕

Android 使用gpio键中断唤醒RPi3上的屏幕,android,linux-kernel,raspberry-pi3,device-tree,wakeup,Android,Linux Kernel,Raspberry Pi3,Device Tree,Wakeup,我试图在屏幕进入睡眠状态后,使用gpio键中断来唤醒屏幕。我正在使用树莓皮3和沿袭OS 14.1。我已经能够成功地配置gpio键,它在接收到中断时注册输入设备事件。但是,我无法让它在屏幕关闭时唤醒屏幕。我的gpio密钥设备的设备树覆盖文件如下: /dts-v1/; /plugin/; / { compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; fragment@0 { // Configure the gpio pi

我试图在屏幕进入睡眠状态后,使用gpio键中断来唤醒屏幕。我正在使用树莓皮3和沿袭OS 14.1。我已经能够成功地配置gpio键,它在接收到中断时注册输入设备事件。但是,我无法让它在屏幕关闭时唤醒屏幕。我的gpio密钥设备的设备树覆盖文件如下:

/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";

fragment@0 {
    // Configure the gpio pin controller
    target = <&gpio>;
    __overlay__ {
        pin_state: key_pins@0 {
            brcm,pins = <17>;       // gpio number
            brcm,function = <0>;    // 0 = input, 1 = output
            brcm,pull = <2>;        // 0 = none, 1 = pull down, 2 = pull up
        };
    };
};      

fragment@1 {    
    target-path = "/";
    __overlay__ {
        keypad: proximity@0 {
            compatible = "gpio-keys";
            #address-cells = <1>;
            #size-cells = <0>;

            key: proximity {
                label = "proximity detection";
                linux,code = <61>;          // F3 Key
                gpios = <&gpio 17 1>;       // GPIO 17
                wakeup-source;
            };
        };
    };
};
};
/dts-v1/;
/插件/;
/ {
compatible=“brcm,bcm2835”,“brcm,bcm2708”,“brcm,bcm2709”;
fragment@0 {
//配置gpio引脚控制器
目标=;
__覆盖层{
pin_状态:键_pins@0 {
brcm,引脚=;//gpio编号
brcm,函数=;//0=输入,1=输出
brcm,pull=;//0=无,1=向下拉,2=向上拉
};
};
};      
fragment@1 {    
目标路径=“/”;
__覆盖层{
键盘:proximity@0 {
compatible=“gpio密钥”;
#地址单元=;
#大小单元格=;
关键:接近{
label=“接近检测”;
linux,代码=;//F3键
gpios=;//gpio17
唤醒源;
};
};
};
};
};
正如您在文件中看到的,我添加了属性wakeup source,但我相信它可能会从CPU睡眠中唤醒系统,而不一定是在屏幕睡眠时唤醒屏幕本身


如您所见,我的gpio键与键F3绑定。如果我按键盘上的F3键,它会唤醒显示器。但是,如果我在GPIO17引脚上生成中断,它不会唤醒监视器,即使它注册为键F3事件。有没有关于如何从gpio键唤醒显示器的建议?谢谢

我认为您正在寻找接近传感器功能。Linux已经具备了这种功能

对于接近传感器,您必须在设备树中添加键代码
0x0b(11)
,如:

 key: proximity {
                label = "proximity detection";
                linux,code = <11>; /* SW_FRONT_PROXIMITY */
            };
键:接近{
label=“接近检测”;
linux,代码=;/*SW_前端*/
};

以类似的方式,您也可以为其他功能添加关键代码。

所以我终于得到了它。我知道这不是最好的方法,我确信这不是唯一的方法,但这就是我最终在gpio收到中断时让屏幕醒来的方式

我使用了keycode
143
,也称为
KEY\u WAKEUP
。设备树覆盖代码段如下所示:

key: proximity {
            label = "proximity-detection";
            linux,code = <143>;          // KEY_WAKEUP
            gpios = <&gpio 17 0>;       // GPIO 17
            wakeup-source;
        };
# Key layout used for gpio-keys

key 29   CTRL_LEFT   WAKE
键:接近{
label=“接近检测”;
linux,代码=;//键_唤醒
gpios=;//gpio17
唤醒源;
};

我找到了一个比我以前的答案好得多的解决方案。我把我以前的答案作为一个帖子留下,因为它是一个有效的解决方案(尽管它不是最理想的解决方案)

无论如何,您要做的就是创建(或修改)一个键布局文件。对于要向特定设备注册的密钥布局文件,该密钥布局文件名必须遵循与要使用的设备相关的特定命名约定(gpio密钥)。有关此的更多详细信息,请单击此处:。在我的例子中,我决定让我的键布局文件名与设备名匹配。在我的例子中,设备名是gpio键,您可以在设备树覆盖文件中定义它。如果您可以通过在命令行
cat/proc/bus/input/devices
中键入来访问Android本地终端,您还可以找到设备名称。我的gpio密钥覆盖文件的一个片段如下所示:

fragment@1 {    
    target-path = "/";
    __overlay__ {
        keypad: gpio-keys {
            compatible = "gpio-keys";
            #address-cells = <1>;
            #size-cells = <0>;

            key: proximity {
                label = "proximity-detection";
                linux,code = <29>;      // KEY_LEFTCTRL
                linux,input-type = <1>;     // EV_KEY
                gpios = <&gpio 17 0>;       // GPIO 17
                wakeup-source;
            };
        };
    };
};
由于我的gpio键(GPIO17)与Linux键盘代码29键左CTRL相关联,因此我的按键布局文件将Linux键盘代码29(或键左CTRL)与相应的Android键盘代码CTRL\U LEFT相关联。然后我在同一行添加术语WAKE,如上所示。Linux密钥码及其匹配的Android密钥码可在此处找到:


这允许我的屏幕在GPIO17收到所需中断时唤醒。这是一个比只使用Linux keycode进行唤醒更好的解决方案,因为您可能希望编写一个Android应用程序,其中您有几个不同的gpio键,您希望对它们进行不同的处理。如果每个gpio键都绑定到不同的键码,您将能够区分它们。如果它们都有相同的钥匙码,我想区分这些不同的钥匙会困难得多。

谢谢您的回复!但是linux,code=也是关键。Linux将如何区分它是键0还是开关前端?我应该改写linux,代码=?或者Linux执行这两个密钥,等等?有很多密钥都有相同的密钥代码。因此,理想情况下,基于标签和功能,它将仅为接近传感器配置它。因此,也许我应该让标签读为SW_FRONT_Proximition?让我试试,我会给你回复的。再次感谢。不幸的是,这不起作用。我确实看到SW_前_接近键正在注册。我需要指定适当的linux输入类型。然而,我仍然有同样的问题,它没有唤醒屏幕。我确实看到我的gpio密钥已注册为唤醒源,因此不确定问题出在哪里。同样,可能wakeup source指的是从CPU睡眠中唤醒,但可能不是监视睡眠。