Armadilloフォーラム

sys/class にgpioが作成されない

oobu_eiichi

2014年11月4日 10時12分

お世話になっております。
日立産業制御ソリューションズ 大部です。

現在、800EVAでGPIOをユーザーから制御するために、sys/class/gpio を使用し、
directionやHiまたはLoを出力しようとしていますが、sys/classの下にgpioが存在
しておらず、open("/sys/class/gpio/export", O_RDWR); でエラーとなっている状況です。
sys/classの下にgpioを作成するにはどうしたらよろしいでしょうか?

環境としては以下の通り。
ATDE4を使用。
800EVAボードを使用。

実施した手順としては
① linux-2.6.35-a800eva-at3 にて以下のコマンドを実行。
  make ARCH=arm mrproper
  make ARCH=arm armadillo800eva_android_defconfig
② make ARCH=arm menuconfig
  でDevice Drivers ---->
  を選択し、GPIO Support ----->
  を選択し、/sys/class/gpio/・・・(sysfs interface )
  を有効(チェックする)にし、最初のページまで戻り、
  save an Alternate Configuration File
  を選択し、Yesを選択し、保存する。  
③ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
④ /sys/class でlsしてもgpioフォルダが作成されていない。

大変、急で申し訳ないのですが11/6(木)までにご回答をお願いします。

コメント

at_yashi

2014年11月5日 17時49分

GPIO_SYSFS が選択されていれば出ると思いますが...。

make した後に、カーネルを書き換えていないとかないですよね?

at_hanada

2014年11月6日 1時32分

花田です。

> 現在、800EVAでGPIOをユーザーから制御するために、sys/class/gpio を使用し、
> directionやHiまたはLoを出力しようとしていますが、sys/classの下にgpioが存在
> しておらず、open("/sys/class/gpio/export", O_RDWR); でエラーとなっている状況です。
> sys/classの下にgpioを作成するにはどうしたらよろしいでしょうか?

Armadillo-800 EVAで使っているカーネル2.6.35におけるルネサスSoC向けgpioのコード、
このボードではarch/arm/mach-shmobile/board-armadillo800eva.c内にあるのですが、
これは/sys/devices/platform下に分類された形で使用されるものしかexportされてないですね。

> ② make ARCH=arm menuconfig
>   でDevice Drivers ---->
>   を選択し、GPIO Support ----->
>   を選択し、/sys/class/gpio/・・・(sysfs interface )
>   を有効(チェックする)にし、最初のページまで戻り、
>   save an Alternate Configuration File
>   を選択し、Yesを選択し、保存する。  

この設定自体はまったく正しいです。
ただ汎用GPIOとしてexportされているGPOIが一つもないため、見えないのではないかと思います。

使用したいGPIOがどれか書かれていなかったので、ここではSDHI0_CD(SDカードスロット0の挿入検出)を例にとります。
arch/arm/mach-shmobile/board-armadillo800eva.cの1213行目にこんな記述があります。

gpio_request(GPIO_PORT167, NULL); /* SDHI0_CD */
gpio_direction_input(GPIO_PORT167);

これだけですと、GPIOとして予約してカーネル内部で使用するよう設定する意味しか持ちません。
外部から制御可能な汎用GPIOとして使用するには、gpio_export関数を用いて属性をtrueにします。

gpio_request(GPIO_PORT167, NULL); /* SDHI0_CD */
gpio_export(GPIO_PORT167, true);
gpio_direction_input(GPIO_PORT167);

これでビルドしなおしてカーネルを書き換えると、/sys/class/gpio下に

/sys/class/gpio/export
/sys/class/gpio/unexport
/sys/class/gpio/gpiochip0
/sys/class/gpio/gpio167

が見えました。
gpio167ディレクトリ下には、
active_low direction power/ subsystem/ uevent value
といったものが並びます。

このような形で試してみてください。

oobu_eiichi

2014年11月10日 10時37分

花田様

日立産業制御ソリューションズ 大部です。

ご教授ありがとうございました。
確認できました。

> 花田です。
>
> > 現在、800EVAでGPIOをユーザーから制御するために、sys/class/gpio を使用し、
> > directionやHiまたはLoを出力しようとしていますが、sys/classの下にgpioが存在
> > しておらず、open("/sys/class/gpio/export", O_RDWR); でエラーとなっている状況です。
> > sys/classの下にgpioを作成するにはどうしたらよろしいでしょうか?
>
> Armadillo-800 EVAで使っているカーネル2.6.35におけるルネサスSoC向けgpioのコード、
> このボードではarch/arm/mach-shmobile/board-armadillo800eva.c内にあるのですが、
> これは/sys/devices/platform下に分類された形で使用されるものしかexportされてないですね。
>
> > ② make ARCH=arm menuconfig
> >   でDevice Drivers ---->
> >   を選択し、GPIO Support ----->
> >   を選択し、/sys/class/gpio/・・・(sysfs interface )
> >   を有効(チェックする)にし、最初のページまで戻り、
> >   save an Alternate Configuration File
> >   を選択し、Yesを選択し、保存する。  
>
> この設定自体はまったく正しいです。
> ただ汎用GPIOとしてexportされているGPOIが一つもないため、見えないのではないかと思います。
>
> 使用したいGPIOがどれか書かれていなかったので、ここではSDHI0_CD(SDカードスロット0の挿入検出)を例にとります。
> arch/arm/mach-shmobile/board-armadillo800eva.cの1213行目にこんな記述があります。
>
> gpio_request(GPIO_PORT167, NULL); /* SDHI0_CD */
> gpio_direction_input(GPIO_PORT167);
>
> これだけですと、GPIOとして予約してカーネル内部で使用するよう設定する意味しか持ちません。
> 外部から制御可能な汎用GPIOとして使用するには、gpio_export関数を用いて属性をtrueにします。
>
> gpio_request(GPIO_PORT167, NULL); /* SDHI0_CD */
> gpio_export(GPIO_PORT167, true);
> gpio_direction_input(GPIO_PORT167);
>
> これでビルドしなおしてカーネルを書き換えると、/sys/class/gpio下に
>
> /sys/class/gpio/export
> /sys/class/gpio/unexport
> /sys/class/gpio/gpiochip0
> /sys/class/gpio/gpio167
>
> が見えました。
> gpio167ディレクトリ下には、
> active_low direction power/ subsystem/ uevent value
> といったものが並びます。
>
> このような形で試してみてください。