Armadilloフォーラム

Armadillo-840でArmadillo-200シリーズと同様にioctlでGPIOを操作したい

tomishi

2017年2月23日 20時43分

お世話になります。イシヤマと申します。

Armadillo-840で、Armadillo-200シリーズと同様にioctlでGPIOを操作したいと思っています。
https://users.atmark-techno.com/blog/750/1074
に従ってドライバをインストールし、
コマンドラインからのコマンドで、
gpioctrl --get=gpio0 等でエラーが出ないことまでは確認しています。

ところが、Armadillo-200シリーズで正常に動作していた
アプリケーションプログラムのソースコードを
ATDE5でbuildし(エラーなくビルドできた)、
Armadillo-840で動作させたところ、
Ioctl()で「Invalid argument」のエラーが返ってきます。

このとき、Argumentは以下を設定していました。
ハンドラ(3)・・・ open(”/dev/gpio”,O_RDWR) で取得したハンドラ
no(80H)
mode (0)
エラーとなった原因、および対処方法について、教えていただけないでしょうか。

コメント

at_takashi.sasayama

2017年2月24日 10時27分

笹山です。

> Armadillo-840で動作させたところ、
> Ioctl()で「Invalid argument」のエラーが返ってきます。

どのような ioctl 引数で EINVAL が返却されたかを
教えていただけないでしょうか?

可能なら現象を再現可能な最小セットのソースをいただけると解析がしやすく有り難いです。

また、ご参照になられている以下トピックの手順7で
linux-3.4-at10/arch/arm/mach-shmobile/board-armadillo840.c をどのように設定されているかも
教えていただけないでしょうか?
https://users.atmark-techno.com/blog/750/1074

どうぞよろしくお願い致します。

イシヤマです。
お世話になります。

ソースは別途お送りできるかもしれませんが、引数は以下です。

ret = ioctl( 3, PARAM_SET, param_list);

param_list は gpio_param型の構造体のポインタ。

各メンバは以下です。
next=Null
no = 0x80
mode = 0
data.o.value=1

linux-3.4-at10/arch/arm/mach-shmobile/board-armadillo840.c
については、何も変更していません。
ドライバが使用可能であることを確認することを目的としていたため、
実際のピンアサインに合わせた変更はしていません。

at_takashi.sasayama

2017年2月24日 14時08分

笹山です。

> linux-3.4-at10/arch/arm/mach-shmobile/board-armadillo840.c
> については、何も変更していません。

ということは、GPIO0~4 までが定義されているということですね。
それでしたら、問題の原因は下記の gpio no ですね。

> no = 0x80

0x80 は、GPIO7 に相当するので、現状の未定義の状態では、
ioctl でエラーとなります。
(現状の定義で gpio no に指定できるのは 0x01 0x02 0x04 0x08 0x10 のみとなります)

例として、 下記の様に GPIO4 を GPIO7 に変更すると
示していただきましたコードはエラーとはならなくなります。
(代わりに、0x10 がエラーになりますが)

board-armadillo840.c

static struct armadillo2x0_gpio_info armadillo400_a2x0_compat_gpio_info[] = {
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO0,  GPIO_PORT182, 1), // EXT CON13 pin7
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO1,  GPIO_PORT181, 1), // EXT CON13 pin8
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO2,  GPIO_PORT180, 1), // EXT CON13 pin9
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO3,  GPIO_PORT179, 1), // EXT CON13 pin10
        ARMADILLO2X0_GPIO_PIN_INPUT(GPIO7,  GPIO_PORT178, 1), // EXT CON13 pin11 #GPIO4 を GPIO7 に変更
};

イシヤマです。

board-armadillo840.c
を適切に修正することによりエラーがなくなることを確認できました。
ありがとうございました。