Armadilloフォーラム

/dev/input/event0のキーイベントについて

matsumoto

2014年12月15日 20時39分

お世話になっております、松本です。

/dev/input/event0のキーイベントについて確認させていただければと思います。

Qtのプロジェクト内で、実行時のシステム環境変数に、

QWS_KEYBOARD linuxinput:/dev/input/event0

と記述すると、SW1〜SW4までがkeyとして認識されると考えているのですが、
現在、widget内部にオーバーライドしたkeyPressEvent(QKeyEvent* event)で感知することができません。
何か他に設定が必要となりますでしょうか?
#あるいは、USB接続のキーなどでも良いのですが

ご存知でしたら、ご教授いただければと思います。
よろしくお願いいたします。

コメント

matsumoto

2014年12月15日 20時50分

お世話になっております、松本です。

すみません、記載ミスしましたので、
訂正いたします。

>

> QWS_KEYBOARD linuxinput:/dev/input/event0
> 

ではなく、

 QWS_KEYBOARD linuxinput:/dev/input/event2
 

になります。/dev/input/event0 は、タッチの方でした。

> お世話になっております、松本です。
>
> /dev/input/event0のキーイベントについて確認させていただければと思います。
>
> Qtのプロジェクト内で、実行時のシステム環境変数に、
>
>

> QWS_KEYBOARD linuxinput:/dev/input/event0
> 

>
> と記述すると、SW1〜SW4までがkeyとして認識されると考えているのですが、
> 現在、widget内部にオーバーライドしたkeyPressEvent(QKeyEvent* event)で感知することができません。
> 何か他に設定が必要となりますでしょうか?
> #あるいは、USB接続のキーなどでも良いのですが
>
> ご存知でしたら、ご教授いただければと思います。
> よろしくお願いいたします。

at_kojiro.yamada

2014年12月18日 14時22分

> 何か他に設定が必要となりますでしょうか?
QtでArmadillo-840のユーザースイッチ(SW1~4)のイベント受け取るには
以下の作業が必要になります。

■gen-input-run-data.shの修正
修正用のパッチを添付しました。
以下のようにして適用してください。
適用後、コンフィグ領域に保存してArmadilloを再起動すると、SW4はQtでイベントを受け取ることができるようになります。

[Armadillo ~]# ls
gen-input-run-data_sw1_4.patch
[Armadillo ~]# cd /etc/config/
[Armadillo /etc/config]# patch < ~/gen-input-run-data_sw1_4.patch
[Armadillo /etc/config]# cd
[Armadillo ~]# flatfsd -s
[Armadillo ~]# reboot

■Linuxカーネルの修正
SW1~3のイベントを取得するには、
linux-3.4-at[VERSION]/arch/arm/mach-shmobile/board-armadillo840.c

static struct gpio_keys_button gpio_buttons[]
を修正する必要があります。

SW1~3には、KEY_POWER, KEY_BACK, KEY_MENUがそれぞれ割り当てられています。
そしてQtでは、Linuxカーネルで使われているキーボードのキーのコードを、別の値に割り当てています。
しかし、上の3つのキーのコードは、Qt5.0.2では割り当てられていません。

そのため、Qt5.0.2でSW1~3のイベントを取得するには、SW1~3に別のキーのコードを割り当てる必要があります。
以下は、修正の一例として参考にしてください。

SW1 : KEY_POWER -> KEY_KP0(テンキーの0)
SW2 : KEY_BACK -> KEY_KP1(テンキーの1)
SW3 : KEY_MENU -> KEY_KP2(テンキーの2)

static struct gpio_keys_button gpio_buttons[] = {
#if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_POWER_PORT97)
    GPIO_KEY(KEY_KP0,    GPIO_PORT97,    "SW1", .wakeup = 1),
#endif
#if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_BACK_PORT98)
    GPIO_KEY(KEY_KP1,    GPIO_PORT98,    "SW2"),
#endif
#if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_MENU_PORT99)
    GPIO_KEY(KEY_KP2,    GPIO_PORT99,    "SW3"),
#endif
#if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_HOME_PORT100)
    GPIO_KEY(KEY_HOME,    GPIO_PORT100,    "SW4"),
#endif
};

他のキーを割り当てる場合は、Qtで対応しているかどうかを確認してください。

- キーボードのキーのコードの定義
linux-3.4-at[VERSION]/include/linux/input.h

- Qt5.0.2のキーボードのキーの割り当て
https://qt.gitorious.org/qt/qtbase/source/0e344bb64a8cb27f9a20cff1df612…

- Qtのキーボードの各キーの定義(Qt5.4)
http://doc.qt.io/qt-5.4/qt.html#Key-enum

例として、SW4に設定されている KEY_HOME の場合だと、
- キーのコードは 102
- Qt5.0.2での 102 の割り当て先は 0x01000010
- Qtでの 0x01000010 の定義は Qt::Key_Home
になります。

ファイル ファイルの説明
gen-input-run-data_sw1_4.patch gen-input-run-data.shの修正パッチ

matsumoto

2014年12月19日 10時50分

ご連絡ありがとうございます。
現在実機が手元にないのですが、返ってきたら試してみたいとおもいます。

情報ありがとうございます。

> > 何か他に設定が必要となりますでしょうか?
> QtでArmadillo-840のユーザースイッチ(SW1~4)のイベント受け取るには
> 以下の作業が必要になります。
>
>
> ■gen-input-run-data.shの修正
> 修正用のパッチを添付しました。
> 以下のようにして適用してください。
> 適用後、コンフィグ領域に保存してArmadilloを再起動すると、SW4はQtでイベントを受け取ることができるようになります。
>
>

> [Armadillo ~]# ls
> gen-input-run-data_sw1_4.patch
> [Armadillo ~]# cd /etc/config/
> [Armadillo /etc/config]# patch < ~/gen-input-run-data_sw1_4.patch
> [Armadillo /etc/config]# cd
> [Armadillo ~]# flatfsd -s
> [Armadillo ~]# reboot
> 

>
> ■Linuxカーネルの修正
> SW1~3のイベントを取得するには、
> linux-3.4-at[VERSION]/arch/arm/mach-shmobile/board-armadillo840.c
> の
> static struct gpio_keys_button gpio_buttons[]
> を修正する必要があります。
>
> SW1~3には、KEY_POWER, KEY_BACK, KEY_MENUがそれぞれ割り当てられています。
> そしてQtでは、Linuxカーネルで使われているキーボードのキーのコードを、別の値に割り当てています。
> しかし、上の3つのキーのコードは、Qt5.0.2では割り当てられていません。
>
> そのため、Qt5.0.2でSW1~3のイベントを取得するには、SW1~3に別のキーのコードを割り当てる必要があります。
> 以下は、修正の一例として参考にしてください。
>
> SW1 : KEY_POWER -> KEY_KP0(テンキーの0)
> SW2 : KEY_BACK -> KEY_KP1(テンキーの1)
> SW3 : KEY_MENU -> KEY_KP2(テンキーの2)
>
>

> static struct gpio_keys_button gpio_buttons[] = {
> #if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_POWER_PORT97)
>     GPIO_KEY(KEY_KP0,    GPIO_PORT97,    "SW1", .wakeup = 1),
> #endif
> #if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_BACK_PORT98)
>     GPIO_KEY(KEY_KP1,    GPIO_PORT98,    "SW2"),
> #endif
> #if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_MENU_PORT99)
>     GPIO_KEY(KEY_KP2,    GPIO_PORT99,    "SW3"),
> #endif
> #if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_HOME_PORT100)
>     GPIO_KEY(KEY_HOME,    GPIO_PORT100,    "SW4"),
> #endif
> };
> 

>
> 他のキーを割り当てる場合は、Qtで対応しているかどうかを確認してください。
>
> - キーボードのキーのコードの定義
> linux-3.4-at[VERSION]/include/linux/input.h
>
> - Qt5.0.2のキーボードのキーの割り当て
> https://qt.gitorious.org/qt/qtbase/source/0e344bb64a8cb27f9a20cff1df612…
>
> - Qtのキーボードの各キーの定義(Qt5.4)
> http://doc.qt.io/qt-5.4/qt.html#Key-enum
>
> 例として、SW4に設定されている KEY_HOME の場合だと、
> - キーのコードは 102
> - Qt5.0.2での 102 の割り当て先は 0x01000010
> - Qtでの 0x01000010 の定義は Qt::Key_Home
> になります。
>