Armadillo-440,410でEXT_IO24をGPIOクラスで制御する方法

いつもお世話になっております。大岡です。

EXT_IO24はデフォルトだとLCD_SW1に割り当てられていますが、
GPIOクラス経由で制御する方法を教えてください。

とりあえず、v2.6.26-at18のカーネルコンフィグ項目の
Linux Kernel Configuration
 System Type
  Freescale MXC Implementations
   MX25 Options
    Armadillo-400 Board options
      [ ] LCD_SW1 (CON11_39) ←ここ

上記箇所を無効化したのですが/sys/class/gpio/CON11_39 は出てきませんでした。

カーネルのソースコードを検索して、arch/arm/mach-mx25/armadillo400.c の314行目付近の
以下のあたりを修正したらいいのかなと思ったのですが、影響範囲がわからなくて
本当に修正していいのか迷っている状況です。

#if defined(CONFIG_MACH_ARMADILLO410) || defined(CONFIG_MACH_ARMADILLO440) || defined(CONFIG_MACH_ARMADILLO460)
 {KEY_BACK, GPIO(2, 20), 1, "LCD_SW1", EV_KEY, CONFIG_ARMADILLO400_CON11_39_GPIO_2_20_IS_WAKE_SRC},
#if defined(CONFIG_ARMADILLO400_CON11_40_GPIO_2_29)
 {KEY_MENU, GPIO(2, 29), 1, "LCD_SW2", EV_KEY, CONFIG_ARMADILLO400_CON11_40_GPIO_2_29_IS_WAKE_SRC},
#endif

正しい修正方法をご教授願えないでしょうか。よろしくお願いします。

製品: 
Armadillo-440
Armadillo-410

中村です。

> EXT_IO24はデフォルトだとLCD_SW1に割り当てられていますが、
> GPIOクラス経由で制御する方法を教えてください。

ちょうど同じあたりをさわろうとしていたところでしたので(作業の優先
順位としてはもう少し先なのですけど)こちらを先に見てみました。

> MX25 Options
> Armadillo-400 Board options
> [ ] LCD_SW1 (CON11_39) ←ここ
>
> 上記箇所を無効化したのですが/sys/class/gpio/CON11_39 は出てきませんでした。

この部分のKconfigとソースを見て、この設定がどこに影響を与えるのかを
調べる必要があります。

Kconfigによると、この設定で有効なるのは、
ARMADILLO400_CON11_39_GPIO_2_20_WAKE_SRC_SELECT
です。また、
ARMADILLO400_CON11_39_GPIO_2_20_IS_WAKE_SRC
が0か1になります。

ARMADILLO400_CON11_39_GPIO_2_20_WAKE_SRC_SELECT
は、ソース使っているところはありません。

ARMADILLO400_CON11_39_GPIO_2_20_IS_WAKE_SRC
は、大岡さんが書かれたarmadillo400.cの314行目付近に出てきます。
それ以外はありません。

ARMADILLO400_CON11_39_GPIO_2_20_IS_WAKE_SRC
は、wakeupに使うかどうかというフラグであって、gpioクラスに
するか?とか、gpio_keysにするか?とかとは関係ないですね。

CON11_39(GPIO_2_20)をgpio_keysにするか、GPIOクラスにするかは、
カーネルコンフィグで切り替えはできず、ソースを直接修正するしかないです。

armadillo400.cでは、CON11_39(GPIO_2_20)はgpio_keysとして
使うことになっていて、armadillo400.cの314行目付近の

static struct gpio_keys_button armadillo400_key_buttons[] = {

の配列に入ってしまっています。
まずは、この配列からCON11_39を外します。
(gpio_keysとgpioクラスを同時には使えないと思うので)

次に、

static struct mxc_ext_gpio gpio_list_revb[] = {

または

static struct mxc_ext_gpio gpio_list_revc[] = {

の配列の中に(両方に入れてしまって大丈夫でしょう)CON11_39の
設定を入れてあげる必要があります。
たぶん、こんなのを入れてあげればいいのではないかと思います。

        {"CON11_39", GPIO(2, 20), MXC_EXT_GPIO_DIRECTION_INPUT},

まだ自分では試してないですけど、たぶんこれでいいのではないかと思います。

余談ですが...Armadillo-410で(420や440と互換にすることなく)これらの
GPIOを使うときに"CON11_XX"って使いにくいですよね。
CON9_XXやCON11_XXは別の名前を付けてしまってもいいのでは
ないかと思います。

--
なかむら

佐々木です。

修正については、中村さんに ご説明頂いたとおりです。

補足の注意点として、以下のソースコード内でPADに対する設定を行なっています。
{linux-2.6.26}/arch/arm/mach-mx25/armadillo400_gpio.c

例えば、以下のコードではLCD_SW2(CON11_40)のIOに対し、47kΩのPull Up抵抗を有効に設定しており、
armadillo400_gpio_init関数にてレジスタに書きこまれます。

MX25_PAD_KPP_ROW0__GPIO_2_29(PAD_CTL_PKE | PAD_CTL_PUS_47K_UP),

※armadillo400_gpio.c:41行目

今回、質問の対象となっている、LCD_SW1(CON11_39)については、
常に47kΩでPull UpされているIOであるため、設定は変える必要がない(変えられない)のですが、
デフォルトからIOの役割を変更する場合には、ご使用の用途に合わせIOの設定も変更すべきか確認してください。

お世話になっております。大岡です。

中村様、佐々木様
お二人共詳細な説明をありがとうございます。

中村様の説明を試してみたところ無事にGPIOクラスが作成されました。
動作確認はまだとれていませんが取り急ぎお礼を申し上げます。

佐々木様、実はCON11_40とCON11_41もGPIO制御する予定だったので
アドバイスが大変参考になりました。ありがとうございます。