Armadilloフォーラム

Armadillo640:GPIOの同時制御方法について

masahide

2018年12月5日 9時33分

お世話になっております。赤坂と申します。

Armadillo640で開発を行ってます。

初歩的な質問かもしれませんが、GPIOの制御方法について質問させて下さい。

sysfsを使い複数のGPIOピンを制御する場合に、
以下の様にwrite()コマンドで順次実行していくことになりますが
μsecオーダーでのズレが生じると思います。

複数ピンの制御タイミングを同時に行いたい場合に
順次実行ではなく、まとめて制御する方法はあるでしょうか?
もしありましたらご教示お願い致します。

write(fd1, "1", 1);
write(fd2, "0", 1);
write(fd3, "1", 1);


※参考記事
sysfs経由のGPIO制御が低速。高速に制御できる方法を知りたい。
https://armadillo.atmark-techno.com/forum/armadillo/1066

コメント

at_ohsawa

2018年12月5日 11時22分

面倒ですが、GPIO1_IO01, GPIO1_IO02のように一つのGPIOレジスタに操作したい対象が
まとまっている場合に限って、GPIOレジスタを直接操作すれば同時に変更できると思います。

GPIOレジスタのアドレスは i.MX 6ULL Applications Processor Reference Manual参照
https://www.nxp.com/jp/products/processors-and-microcontrollers/arm-bas…

(あるいはarch/arm/boot/dts/imx6ul.dtsiを見るとGPIO1のレジスタが0x209c000,GPIO2が0x20a0000..のようにアドレスがわかります)

GPIOレジスタの複数のビットをまとめて操作する手段は、専用にデバイスドライバを書くか、
コンフィグでCONFIG_DEVMEMを有効にして/dev/memからメモリ空間に直接アクセスして書き込むことで可能になります。
しかし、他のデバイスドライバの制御を無視して操作するので、同じGPIOレジスタに含まれるピンの状態を壊さないように
注意が必要なのでお勧めしかねます。
/dev/memからレジスタを操作する方法は検索すると色々出てくると思います。

しかし、GPIO1_IO01とGPIO2_IO02のように異なるGPIOレジスタであれば、どうやっても2命令以上必要なので同時に
操作することは不可能です。

masahide

2018年12月5日 14時08分

早速のご回答、有難うございました。

/dev/memについては調べて、方法を検討してみます。