Armadilloフォーラム

GPIO PORT62をSW5として使用したい。

y-otuki

2014年10月23日 19時12分

大槻です。

いつもお世話になっています。

下記の件で悩んでおります。

GPIOのPORT62(IRQ15)を液晶モデルのCON4の32ピンを利用して。
SW5(KEY_A)として使用したい。

試みた内容は 「board-armadillo840.c」と「Kconfig.armadillo800」 を変更してmake menuconfigとmakeをしました。
atmark-dist-20140602 ,linux3.4-at9を使用
接続は1KでプルアップしてタクトSWを接続しました。

変更内容
board-armadillo840.c
#if IS_ENABLED(CONFIG_ARMADILLO840_GPIO_KEY_A_PORT62) <------3行追加
GPIO_KEY(KEY_A, GPIO_PORT62, "SW5"),
#endif

Kconfig.armadillo800の変更点
config ARMADILLO840_CON7EB_LCD
bool "LCD"
select ARMADILLO840_FSIA_SLAVE
select ARMADILLO840_FSIA_SLAVE_DEVICE_WM8978
select ARMADILLO840_GPIO_KEY
select ARMADILLO840_GPIO_KEY_POWER_PORT97
select ARMADILLO840_GPIO_KEY_BACK_PORT98
select ARMADILLO840_GPIO_KEY_MENU_PORT99
select ARMADILLO840_GPIO_KEY_HOME_PORT100
select ARMADILLO840_GPIO_KEY_A_PORT62 <-------1行を追加。
.....
.....
config ARMADILLO840_GPIO_KEY_A_PORT62 <------3行追加
bool "KEY: A [KEY:PORT62]"
depends on ARMADILLO840_GPIO_KEY

コンフィグ設定
[*] use GPIO-KEY
[*] KEY: Power [KEY:PORT97]
[*] KEY: Back [KEY:PORT98]
[*] KEY: Menu [KEY:PORT99]
[*] KEY: Home [KEY:PORT100]
[*] KEY: A [KEY:PORT62]

evtestで確認した内容
タッチパネルを無効にして未接続にしているためevent0になっています。
[root@armadillo840-0 (ttySC2) ~]# evtest /dev/input/event0
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "gpio-keys"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 30 (A) <-----Aキーできている。
Event code 102 (Home)
Event code 116 (Power)
Event code 139 (Menu)
Event code 158 (Back)
Testing ... (interrupt to exit)
Event: time 1414058409.739909, type 1 (Key), code 116 (Power), value 1
Event: time 1414058409.739916, -------------- Report Sync ------------
Event: time 1414058409.896195, type 1 (Key), code 116 (Power), value 0
Event: time 1414058409.896201, -------------- Report Sync ------------
Event: time 1414058410.698147, type 1 (Key), code 158 (Back), value 1
Event: time 1414058410.698154, -------------- Report Sync ------------
Event: time 1414058410.794648, type 1 (Key), code 158 (Back), value 0
Event: time 1414058410.794653, -------------- Report Sync ------------
Event: time 1414058411.580297, type 1 (Key), code 139 (Menu), value 1
Event: time 1414058411.580304, -------------- Report Sync ------------
Event: time 1414058411.701307, type 1 (Key), code 139 (Menu), value 0
Event: time 1414058411.701312, -------------- Report Sync ------------
Event: time 1414058413.315409, type 1 (Key), code 102 (Home), value 1
Event: time 1414058413.315417, -------------- Report Sync ------------
Event: time 1414058413.450814, type 1 (Key), code 102 (Home), value 0
Event: time 1414058413.450819, -------------- Report Sync ------------

結果
上記の用にEvent Code 30(A)は出るのですが、キーを押してもメッセージが表示されません。

ご教授、よろしくお願いします。

コメント

at_nakai

2014年10月24日 12時39分

nakaiです。

> GPIOのPORT62(IRQ15)を液晶モデルのCON4の32ピンを利用して。
> SW5(KEY_A)として使用したい。

PORT62については、GPIO_FN_LCD0_DCKとマルチプレクスされています。
■ PORT62のマルチプレクス
/* Port62 */
PINMUX_DATA(LCD0_DCK_MARK, PORT62_FN1),
PINMUX_DATA(LCD0_WR_MARK, PORT62_FN4),
PINMUX_DATA(DV_CLK_MARK, PORT62_FN6),
PINMUX_DATA(IRQ15_PORT62_MARK, PORT62_FN0, MSEL1CR_15_1),

LCD0は利用されないのでしたら、
「CON7 extension board」でLCDを非選択として、
「use LCDC0」も非選択としてください。

LCD0を利用する場合 で カメラを利用しない場合では、
PORT180が利用できそうです。

■ PORT180のマルチプレクス
/* Port180 */
PINMUX_DATA(VIO0_D10_MARK, PORT180_FN1),
PINMUX_DATA(TPU0TO3_MARK, PORT180_FN4),
PINMUX_DATA(VIO1_D2_MARK, PORT180_FN5),
PINMUX_DATA(IDE_INT_MARK, PORT180_FN6),
PINMUX_DATA(IRQ24_MARK, PORT180_FN0),

ご確認ください。

--
nakai

y-otuki

2014年10月24日 14時25分

大槻です

nakai 殿 回答有難うございます。
>
> > GPIOのPORT62(IRQ15)を液晶モデルのCON4の32ピンを利用して。
> > SW5(KEY_A)として使用したい。
>
> PORT62については、GPIO_FN_LCD0_DCKとマルチプレクスされています。
> ■ PORT62のマルチプレクス
> /* Port62 */
> PINMUX_DATA(LCD0_DCK_MARK, PORT62_FN1),
> PINMUX_DATA(LCD0_WR_MARK, PORT62_FN4),
> PINMUX_DATA(DV_CLK_MARK, PORT62_FN6),
> PINMUX_DATA(IRQ15_PORT62_MARK, PORT62_FN0, MSEL1CR_15_1),
>
> LCD0は利用されないのでしたら、
> 「CON7 extension board」でLCDを非選択として、
> 「use LCDC0」も非選択としてください。
非選択で行っています。
設定項目以下のとおりです。
*** Extension Board select ***
CON7 extension board (Custom) --->
CON8 extension board (Custom) --->
*** Interface and Device select ***
[ ] use CEU0 Lower [CLKs, SYNCs and D7-0]
[ ] use CEU0 Upper [CLKs, SYNCs and D15-8]
[ ] use CEU1 [CLKs, SYNCs and D7-0]
[*] use FSIA as Slave
Audio Codec (AUDIO: CS4270 codec) --->
[*] use GPIO-KEY
[*] KEY: Power [KEY:PORT97]
[*] KEY: Back [KEY:PORT98]
[*] KEY: Menu [KEY:PORT99]
[*] KEY: Home [KEY:PORT100]
[*] KEY: A [KEY:PORT62]
[*] KEY: B [KEY:PORT180]
[ ] TOUCHSCREEN: ST1232
[ ] use I2C-GPIO3 [SCL:PORT194, SDA:PORT193]
[ ] use LCDC0
Primary framebuffer (LCDC1) --->
[ ] use LED-Driver TB62752
[*] use External LED
[*] LED: EXT1 [LED:102]
[*] LED: EXT2 [LED:59]
[*] LED: EXT3 [LED:60]
[*] LED: EXT4 [LED:10]
[*] LED: EXT5 [LED:8]
[*] LED: EXT6 [LED:7]
[*] LED: NLED1 [LED:65]
[*] LED: NLED2 [LED:61]
[*] LED: NLED3 [LED:165]
[*] LED: NLED4 [LED:164]
[*] LED: NLED5 [LED:66]
[*] LED: NLED6 [LED:43]
[*] LED: NLED7 [LED:44]
[*] LED: NLED8 [LED:45]
[*] LED: NLED9 [LED:46]
[*] LED: NLED10 [LED:47]
[*] LED: NLED11 [LED:48]
[*] LED: NLED12 [LED:51]
[*] LED: NLED13 [LED:52]
[*] LED: NLED14 [LED:53]
[ ] use MSIOF1
[*] use SCIFA0
[*] have RTS/CTS
[*] use SCIFA1
[*] have RTS/CTS
[ ] use SCIFA3
[ ] use SCIFA4 [RX:PORT94, TX:PORT93]
[ ] use SCIFA5
[ ] use SCIFA5
[ ] use SCIFA6
[*] use SCIFA7
[ ] use SCIFB
[ ] use SDENC
[ ] use SDHI1
[ ] use TPU0 Output2 [PORT202]
USB1 selection (CON5 - Host) --->
>
> LCD0を利用する場合 で カメラを利用しない場合では、
> PORT180が利用できそうです。
>
> ■ PORT180のマルチプレクス
> /* Port180 */
> PINMUX_DATA(VIO0_D10_MARK, PORT180_FN1),
> PINMUX_DATA(TPU0TO3_MARK, PORT180_FN4),
> PINMUX_DATA(VIO1_D2_MARK, PORT180_FN5),
> PINMUX_DATA(IDE_INT_MARK, PORT180_FN6),
> PINMUX_DATA(IRQ24_MARK, PORT180_FN0),
PORT180をKEY_Bでやってみた結果
KEY_Bだけがevtestでイベントが取れました。
Event: time 1414126005.896907, -------------- Report Sync ------------
Event: time 1414126005.983482, type 1 (Key), code 48 (B), value 0
Event: time 1414126005.983486, -------------- Report Sync ------------

2つで違うところは 割り込み番号が SW1~4とかぶっていないところです。
KEY_POWER PORT97(IQR12)
KEY_BACK PORT98(IQR13)
KEY_MENU PORT99(IQR14)
KEY_HOME PORT100(IQR15)
KEY_A PORT62(IQR15)
KEY_B PORT180(IQR24)

SW5,SW6を指定せずGPIO PORT180とPORT62でcatでvalue値を確認したところ
両方共に「押:0」、「離:1」でedgeも両方に有りました。
GPIO100とGPIO62のedgeが両方に上がることはないと思いますが。
(edgeの動作確認はこれからやります)

SWで割り込みが関係している場合にどのあたりのコードを参照すればよいか、
ご教授お願いします。

以上、よろしくお願いします。

at_nakai

2014年10月24日 14時48分

nakaiです。

> 2つで違うところは 割り込み番号が SW1~4とかぶっていないところです。
> KEY_POWER PORT97(IQR12)
> KEY_BACK PORT98(IQR13)
> KEY_MENU PORT99(IQR14)
> KEY_HOME PORT100(IQR15)
> KEY_A PORT62(IQR15)
> KEY_B PORT180(IQR24)

IRQ15がかぶっているのですね。
R-MobileA1では、IRQもマルチプレクスの対象になっていますので、
どちらかのピンでのみで利用可能です。
ちなみに、gpio_keys.cではGPIOの割り込みを取れない場合は、エラーとなるようです。

irq = gpio_to_irq(button->gpio);
if (irq < 0) {
error = irq;
dev_err(dev,
"Unable to get irq number for GPIO %d, error %d\n",
button->gpio, error);
goto fail;
}
bdata->irq = irq;

> KEY_HOME PORT100(IQR15)
> KEY_A PORT62(IQR15)

この二つのGPIOをgpio_keysで利用したい場合は、
どちらかでgpio_keys_polledを利用することで解決しそうです。
#gpio_keys_polledは試したことがありません。

ちょっとソースを見てみましたが、
board-armadillo840.c で、gpio_keys_deviceと同様にplatform_deviceなどを定義し、
platform_deviceの.nameを"gpio-keys-polled"に変更することで利用できそうな感じです。

--
nakai

at_nakai

2014年10月24日 14時57分

nakaiです。

#Paragraphタグ間違えました。。

> ちょっとソースを見てみましたが、
> board-armadillo840.c で、gpio_keys_deviceと同様にplatform_deviceなどを定義し、
> platform_deviceの.nameを"gpio-keys-polled"に変更することで利用できそうな感じです。

platform_dataでpoll_intervalが必要そうです。

static int __devinit gpio_keys_polled_probe(struct platform_device *pdev)
{
        struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
              :
        if (!pdata || !pdata->poll_interval)
                return -EINVAL;

--
nakai

y-otuki

2014年10月28日 20時39分

大槻です。

ご教授、ありがとうございます。

割り込みが重ならない、PORT69,70,71,67,202を使用して
KEY_A~KEY_Eを取得することにしました。

gpio-keys-polledについてはコンフィグレーションのスケルトンを有効にして。
少し見てみましたが、理解できず断念しました、また時間が有るときに挑戦したいと
思います。

以上

y.nakamura

2015年1月14日 17時54分

中村です。

去年の10月の話題ですが・・・
nakaiさんが
「#gpio_keys_polledは試したことがありません。」
という前置きで情報書いてくれていたArmadillo-840の
gpio-keys-polledを試してみました。

> > ちょっとソースを見てみましたが、
> > board-armadillo840.c で、gpio_keys_deviceと同様にplatform_deviceなどを定義し、
> > platform_deviceの.nameを"gpio-keys-polled"に変更することで利用できそうな感じです。
>
> platform_dataでpoll_intervalが必要そうです。

これらの修正をして動かしたみたところ、動いてくれているようです。

ただ(予想どおりなのですが)、割り込みを使うgpio-keysと
割り込みを使わないgpio-keys-polledは別デバイスになってしまって、
割り込みありのボタンと割り込みなしのボタンが混在すると、
アプリからは使いにくいですね。
私の環境では、event0がgpio-keys-polledになって、
event1がタッチパネル、event2がgpio-keysになりました。

そこで、元々はgpio-keysになっているLCD拡張ボードの
ボタン(POWERなど)をgpio-keys-polledにしてみたところ、
これも大丈夫そうです。

ということで、gpio-keys-polledを使うなら、割り込みがあるポートも
gpio-keys-polledにしてしまうのが良さそうに思います。

--
なかむら