===== 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の存在を知った。 [[https://qiita.com/ | Qiita]]にでも記事をアップしようかと思ったら、[[libgpiod]]自体については、[[https://qiita.com/wancom/items/b041ee7408a87fabf48e | libgpiodの使い方]]を書いている人がいることに気づいた。 __//我ながら、libgpiodにたどり着くの、遅い。 振り返ってみると、Jetson NanoでGPIOと格闘していたのは...2021年1月ごろ。そのときにはlibgpiodの存在に気づきたかった。 結構試行錯誤したような記憶が。。。// __ なので、JetsonシリーズのGPIO制御ということでQiitaに投稿([[https://qiita.com/MakotoA67/items/cf506337f3cee867a5f2| この記事]])。 また、Jetson NanoとJetson Xavier NXだけでなく、Raspberry Pi 4でも動作確認を取ることで、ポータビリティも確認できた。 ざっくりとした応答時間を計測してみたので、以下に紹介する。 * Nanoは**3~7usec** * Xavier NXは**15usec**前後 * Raspberry Pi4では**5~10usec** というところ。 ちなみに、この時間は、トリガとなる入力ポートの変化から、それを検知して他のポートの出力ポートに出力するまでの時間をオシロで計測した時間。 この計測をした際に、特に、他のプロセスを動かしていたわけではないが、何か動いていたかもしれないので、参考値ということで。