工業用 I/O (IIO) の「プロデューサー」であるドライバーを作成しました (ADC の読み取り値を提供します)。モジュールとしてコンパイルしました。最初のドライバーからのADC入力を使用するIIO「コンシューマー」である別のドライバーがあります(iio_channel_get()
そのprobe()
関数を呼び出します)。
これらのドライバーは両方ともモジュールとしてコンパイルされ、一緒に問題なく動作します。rmmod
しかし、2 番目のドライバーがロードされて ADC を使用している場合でも、最初のドライバーで可能であることがわかりました。2番目のドライバーが使用している間に最初のドライバーがアンロードされるのを防ぐのは素晴らしいことです。つまり、2 番目のrefcnt
ドライバーが を呼び出したときに最初のモジュールの値を増やし、 2 番目のドライバーが を呼び出したときにiio_channel_get()
を減らします。これは、概念的には、開いているプロセスごとに増加する char デバイスのモジュールに似ています。したがって、すべてのプロセスが開いている char デバイス ファイルを閉じるまで、アンロードできません。refcnt
iio_channel_release()
refcnt
しかし、IIO プロデューサーでこれを実現する方法がわかりません (たとえば、2 番目のドライバーが を呼び出したときに呼び出される可能性のある ops 関数がわかりませんiio_channel_get()
)。どうすればそれができますか?
これは、あるモジュールが別のモジュールによって提供される関数/シンボルに依存する、従来の意味でのモジュールの依存関係ではないことに注意してください。これは、IIO コンシューマー/プロデューサーの依存関係です。相互の依存関係はハードウェア固有であり、ハードウェアのデバイス ツリーで指定されます。異なるハードウェアでは、消費者/生産者の依存関係に別の IIO 生産者モジュールが含まれる場合があります。