использование прерывания gpio-keys для пробуждения экрана на RPi3 - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь использовать прерывание gpio-keys , чтобы разбудить экран после его перехода в спящий режим. Я использую Raspberry Pi 3 и Lineage OS 14.1 . Я был в состоянии успешно настроить gpio-ключи, где он регистрирует события устройства ввода после получения прерывания. Тем не менее, я не могу заставить его разбудить экран, когда он гаснет. Файл наложения дерева моего устройства для моего устройства 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 , но я полагаю, что, возможно, он пробуждает систему из спящего режима процессора и не обязательно сам экран, когда экран спит.

Как вы видите, мои gpio-ключи привязаны к KEY F3 . Если я нажимаю F3 на клавиатуре, он будит монитор. Однако если я сгенерирую прерывание на выводе GPIO17 , он не разбудит монитор, даже если он регистрируется как событие KEY F3. Есть какие-нибудь предложения, как как разбудить монитор от gpio-клавиш? Спасибо!

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Итак, я наконец-то понял. Я знаю, что это не лучший способ, и я уверен, что это не единственный способ, но именно так я наконец получил экран, чтобы проснуться после того, как мой gpio получил прерывание.

Я использовал код ключа 143, также известный как KEY_WAKEUP. Фрагмент наложения дерева устройств показан ниже:

key: proximity {
            label = "proximity-detection";
            linux,code = <143>;          // KEY_WAKEUP
            gpios = <&gpio 17 0>;       // GPIO 17
            wakeup-source;
        };
0 голосов
/ 09 мая 2018

Я нашел намного лучшее решение, чем мой предыдущий ответ. Я оставляю свой предыдущий ответ как пост, так как это рабочее решение (хотя это не самое идеальное решение).

В любом случае, вам нужно создать (или изменить) файл раскладки . Чтобы этот файл раскладки клавиш регистрировался на определенном устройстве, имя файла раскладки клавиш должно соответствовать определенному соглашению об именах, соответствующему сведениям об устройстве, которое вы хотите использовать ( gpio- ключи в моем случае). Подробнее об этом здесь: https://source.android.com/devices/input/key-layout-files. В моем случае я решил, что мое расположение клавиш имя файла должно совпадать с именем устройства. Имя устройства в моем случае было gpio-keys , которое вы определяете в файле наложения дерева устройств. Вы также можете найти имя устройства, если у вас есть доступ к локальному терминалу Android, введя в командной строке cat /proc/bus/input/devices. Фрагмент моего файла оверлея 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 в каталог / system / usr / keylayout / в Android. Файл gpio-keys.kl показан ниже:

# Key layout used for gpio-keys

key 29   CTRL_LEFT   WAKE

Поскольку мой gpio-ключ ( 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 получает прерывание по желанию. Это лучшее решение, чем просто использование ключевого кода Linux для WAKEUP , так как вы можете захотеть написать приложение для Android, где у вас есть несколько различных gpio-keys , которые вы хотите обрабатывать по-разному. Если каждый gpio-ключ привязан к отдельному коду, вы сможете отличить их друг от друга. Если бы они все имели один и тот же код ключа, я думаю, что различить эти разные ключи было бы гораздо сложнее.

0 голосов
/ 08 мая 2018

Я думаю, что вы ищете функциональные возможности датчика приближения. В Linux уже есть linux, код ключа для этой функциональности.

Для датчика приближения вы должны добавить код ключа 0x0b (11) в дерево устройств, например:

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

Аналогичным образом вы можете добавить код ключа и для других функций.

...