GPIO制御
とあるイメージセンサを用いた撮像部を作ることになった。 イメージセンサの撮像開始をGPIO入力でタイミングを取る必要があった。 sysfs経由のGPIO制御だと応答速度が遅い。また、PythonのライブラリJetson.GPIOはよくみかけた。 プロジェクトの要求仕様的に、その遅い応答速度では満足できなかった。 本当は、
- GPIOへの切替え
- 出力/入力の切替え
などもすべて自作のGPIO制御部にて実施したかったが、GPIO系の制御レジスタの制御のみでは駄目で(仕様としてはできそうだったのだが)、結局、sysfsの助けを借りて、初期化時はsysfsを用いてポートの初期化を行い、ポートの変化の箇所だけmmap経由でのGPIOレジスタReadとすることで応答速度を確保。
今回、Jetson Xavier NXへのプロジェクト一式を移植する際に、GPIOポートの制御部分のXavier NX対応を検討した。 Jetson Nanoでは、Tegra X1のTRMで確認できたGPIOレジスタの詳細情報が、Xavier NXでは見つからず。
結局、「シェルで/sys/class/gpio経由でポートを制御しながら、mmapでマッピングして値の変化を見るプログラムを動かして」というかなり泥臭い手法で、ようやく、GPIOのReadデータがこのオフセットに、Writeデータはこのオフセットに、などという位置がわかって来て、gpio-tegra186.cも読んで大体把握。ようやく、制御できる目処が立って来たあたりで、、
たまたま、libgpiodの存在を知った。
Qiitaにでも記事をアップしようかと思ったら、libgpiod自体については、 libgpiodの使い方を書いている人がいることに気づいた。
我ながら、libgpiodにたどり着くの、遅い。 振り返ってみると、Jetson NanoでGPIOと格闘していたのは…2021年1月ごろ。そのときにはlibgpiodの存在に気づきたかった。 結構試行錯誤したような記憶が。。。
なので、JetsonシリーズのGPIO制御ということでQiitaに投稿( この記事)。
また、Jetson NanoとJetson Xavier NXだけでなく、Raspberry Pi 4でも動作確認を取ることで、ポータビリティも確認できた。 ざっくりとした応答時間を計測してみたので、以下に紹介する。
- Nanoは3~7usec
- Xavier NXは15usec前後
- Raspberry Pi4では5~10usec
というところ。
ちなみに、この時間は、トリガとなる入力ポートの変化から、それを検知して他のポートの出力ポートに出力するまでの時間をオシロで計測した時間。
この計測をした際に、特に、他のプロセスを動かしていたわけではないが、何か動いていたかもしれないので、参考値ということで。