【问题标题】:using gpio-keys interrupt to wake up screen on RPi3使用 gpio-keys 中断唤醒 RPi3 上的屏幕
【发布时间】:2018-05-08 00:05:55
【问题描述】:

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

/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;
            };
        };
    };
};
};

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

您也看到了,我的 gpio-keys 绑定到 KEY F3。如果我按键盘上的 F3,它会唤醒显示器。但是,如果我在 GPIO17 引脚上生成中断,即使它注册为 KEY F3 事件,它也不会唤醒监视器。关于如何从 gpio-keys 唤醒显示器的任何建议?谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢 vinod 的回复!但是 linux,code = 也是 KEY_0。 Linux 如何区分它是 KEY_0 还是 SW_FRONT_PROXIMITY?我应该改写 linux,code = 吗?还是 Linux 会执行这两个键等?
    • 有很多钥匙有相同的钥匙代码。因此,理想情况下,它会根据标签和功能将其配置为仅用于接近传感器。
    • 所以也许我应该将标签读取为 SW_FRONT_PROXIMITY?让我试试这个,我会回复你的。再次感谢。
    • 不幸的是,这不起作用。我确实看到注册了 SW_FRONT_PROXIMITY 键。我需要指定适当的 linux,input-type。但是,我仍然有同样的问题,它不会唤醒屏幕。我确实看到我的 gpio-key 已注册为唤醒源,所以不确定问题出在哪里。同样,wakeup-source 可能是指从 CPU 睡眠中唤醒,但可能不是监视睡眠。
    【解决方案2】:

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

    我使用了密钥代码143,也称为KEY_WAKEUP。设备树覆盖 sn-p 如下图所示:

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

    【讨论】:

      【解决方案3】:

      我找到了一个比我之前的答案更好的解决方案。我将之前的答案作为帖子留下,因为它是一个可行的解决方案(尽管它不是最理想的解决方案)。

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

      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;
                  };
              };
          };
      };
      

      正如您在上面的 keypad: 旁边看到的,设备名称 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 键码 29KEY_LEFTCTRL,我的键布局文件将 Linux 键码 29(或 KEY_LEFTCTRL)与相应的 Android 键码 CTRL_LEFT 相关联。然后我在同一行添加术语WAKE,如上所示。 Linux 键码及其匹配的 Android 键码可在此处找到:https://source.android.com/devices/input/keyboard-devices

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        相关资源
        最近更新 更多