使用gpio-keys中断唤醒RPi3上的屏幕

时间:2018-05-08 00:05:56

标签: android linux-kernel raspberry-pi3 device-tree wakeup

我尝试使用 gpio-keys 中断在进入睡眠状态后唤醒屏幕。我正在使用 Raspberry Pi 3 Lineage OS 14.1 。我已经能够成功配置gpio-keys,它在收到中断时注册输入设备事件。但是,当它关闭时我无法唤醒屏幕。我的gpio-keys设备的设备树覆盖文件如下:

class UserAuthorization(APIView):
    authentication_classes = (JSONWebTokenAuthentication,)
    def get(self, request, *args, **kwargs):
        print(request.user)
        return Response({})

正如您在文件中看到的那样,我添加了属性 wakeup-source ,但我相信它可能会从CPU睡眠状态中唤醒系统,而不一定是屏幕休眠时屏幕本身。< / p>

正如您所看到的,我的gpio-key与 KEY F3 相关联。如果我按下键盘上的F3,它会唤醒显示器。但是,如果我在 GPIO17 引脚上产生中断,即使它注册为KEY F3事件,它也不会唤醒显示器。有关如何从gpio-keys唤醒显示器的任何建议?谢谢!

3 个答案:

答案 0 :(得分:0)

我认为您正在寻找接近传感器的功能。对于这些功能,Linux已经有linux,keycode

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

 key: proximity {
                label = "proximity detection";
                linux,code = <11>; /* SW_FRONT_PROXIMITY */
            };

以类似的方式,您也可以添加其他功能的密钥代码。

答案 1 :(得分:0)

所以我终于明白了。我知道这不是最好的方式,我确定这不是唯一的方法,但这就是我终于让我的gpio接收到一个中断时屏幕唤醒的方式。

我使用了密钥代码143,也称为KEY_WAKEUP。设备树叠加片段如下所示:

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

答案 2 :(得分:0)

我找到了比我之前的答案更好的解决方案。我将之前的答案留作帖子,因为它是一个有效的解决方案(虽然它不是最理想的解决方案)。

无论如何,您需要做的是创建(或修改)键布局文件。要在此键布局文件中注册某个设备,键布局文件名必须遵循与您要使用的设备相关的详细命名约定( gpio-keys 在我的情况下)。有关此内容的更多详细信息:https://source.android.com/devices/input/key-layout-files。就我而言,我决定使用键布局文件名来匹配设备名称。在我的例子中,设备名称是 gpio-keys ,您可以在设备树覆盖文件中定义它。如果您可以通过在命令行cat /proc/bus/input/devices中键入来访问Android本地终端,也可以找到设备名称。我的gpio-keys覆盖文件的片段如下所示:

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-keys 。你也可以在这里写其他名字。因此,我将我的密钥布局文件命名为 gpio-keys.kl 。我将 gpio-keys.kl 文件放在Android的 / system / usr / keylayout / 目录中。 gpio-keys.kl 文件如下所示:

# Key layout used for gpio-keys

key 29   CTRL_LEFT   WAKE

由于 gpio-key GPIO17 )与 Linux keycode 29 KEY_LEFTCTRL 相关联,密钥布局文件将 Linux密钥代码29 (或 KEY_LEFTCTRL )与相应的 Android密钥代码CTRL_LEFT 相关联。然后我在同一行添加术语 WAKE ,如上所示。可以在此处找到Linux密钥代码及其匹配的Android密钥代码:https://source.android.com/devices/input/keyboard-devices

GPIO17 收到中断时,可以根据需要唤醒我的屏幕。这是比使用 WAKEUP 的Linux密钥更好的解决方案,因为您可能想要编写一个Android应用程序,其中有几个不同的 gpio-keys ,您希望以不同的方式对待。如果每个 gpio-key 与不同的键码相关联,您就可以将它们彼此区分开来。如果它们都具有相同的密钥代码,我认为区分这些不同的密钥会更加困难。