Armadilloフォーラム

IoTA6の拡張I/OボードでGPIO sysfs割り込み

y.nakamura

2021年8月25日 2時47分

中村です。

IoT A6のマニュアルに、拡張I/Oボード01の入出力には
IOエキスパンダを使用しているとの説明がありますが、
この入力ポートでsysfs割り込みを使用できますか?

--
なかむら

コメント

古関です。

IOエキスパンダとSoC間はi2c接続なので
エキスパンダの入力を直接SoCで割り込みとして受けることはできません。

エキスパンタが出力する割り込み信号をSoCのPINに入力する回路になっており、
エキスパンタの入力ポートに変化があった時に、この割り込みが立つため、
これをSoC側で検出することは可能です。

ただ、エキスパンダ側には割り込みマスク等の機能がないため、
複数ある入力ポートのどれに変化があっても割り込みが立ってしまう制約があります。

そのため、無視したいポートに対しては、
いったん割り込みを受けてからソフト側でポートの値を読み
無視する・しないを判断する機構が必要になります。

中村です。

古関さん、丁寧な説明をいただき、ありがとうございます。

ある開発案件の打診があり、sysfsの割り込みを使えるかを
事前検討している段階で、私自身はA6を所有していません。
(受注になればお客様から借りるか自分で購入するかのどちらか)

このため、A6のマニュアルだけしか情報を持っていないのですが、
マニュアルに拡張ボードのGPIOでスリープからのwakeupができる
という説明がありましたので、現状のGPIOのドライバそのままでは
無理だとしても、なんらかの方法はあるかな?と思い、
質問をさせていただきました。
(これを最初に書いておけばよかったですね)

> エキスパンタが出力する割り込み信号をSoCのPINに入力する回路になっており、
> エキスパンタの入力ポートに変化があった時に、この割り込みが立つため、
> これをSoC側で検出することは可能です。

一番知りたかったのは、これです。ありがとうございます。

> そのため、無視したいポートに対しては、
> いったん割り込みを受けてからソフト側でポートの値を読み
> 無視する・しないを判断する機構が必要になります。

入力ポートは2つしかないので、この制限は、
負荷をそれほどかけることなくなんとかなるかな、と思いました。

ありがとうございました。

--
なかむら

中村です。

少し前にA6拡張ボードのIOエキスパンダでのGPIO-sysfsの割り込みについての質問で、
> ただ、エキスパンダ側には割り込みマスク等の機能がないため、
> 複数ある入力ポートのどれに変化があっても割り込みが立ってしまう制約があります。
>
> そのため、無視したいポートに対しては、
> いったん割り込みを受けてからソフト側でポートの値を読み
> 無視する・しないを判断する機構が必要になります。
との回答をいただいておりました。

また、フォーラムでのこのやりとりがベースになっているものと思いますが、
A6の最新のマニュアル(Version 1.3.1,2021/09/29)にも次のような記載が
追加されていました。

表20.9「拡張I/OボードCON3ピンとGPIO 番号の対応」に示したGPIOは、I2C GPIO Expander の
全入力ポートのどれかに変化があった際、割り込みが発生します。ピン単位での割り込み指定・検出はできま
せん。 そのため、入力値の変化を無視したいポートに対しては、いったん割り込みを受けてからソフト側で
ポートの値を読み、無視する・しないを判断する機構が必要となります。

さてどうするかな?(カーネルソースをどう改造するかなど)と、
カーネルソースを見てみたところ、IOエキスパンダのドライバにこの仕組みが
組み込まれているようでしたので、まずは試しに・・・と、
カーネルは何も手を入れずに、テストプログラムを動かしてみました。
結果はポートの識別やエッジの判断など、すべてうまく動いてくれました。

テストプログラムは、
[Armadillo-IoT G3/X1: GPIO sysfsの割り込みを利用する]
https://armadillo.atmark-techno.com/blog/750/2713
を元にして、コマンドライン引数でGPIOポート(gpio504,gpio505)や
エッジの設定(rising,falling,both)をできるようにしたものです。
ソースを添付しておきます。

gpio504とgpio505に対してそれぞれ1つずつ、
同時に2つ実行するという方法で確認しました。

--
なかむら

ファイル ファイルの説明
sysfs-intr-test.c