char ドライバーについて質問があります。GPIO ピンを使用して、割り込みインターフェイスを含むハードウェア デバイスと通信する char ドライバー。ドライバーの "release ()" メソッドがありません。関数要素はどのような順序で配置する必要がありますか?
A. cdev を削除してデバイスを登録解除する
B. 無料の GPIO リソース
C. IRQ リソースの解放
D. メジャー/マイナー番号の登録解除
「release()」メソッドの順序は?
ありがとう
char ドライバーについて質問があります。GPIO ピンを使用して、割り込みインターフェイスを含むハードウェア デバイスと通信する char ドライバー。ドライバーの "release ()" メソッドがありません。関数要素はどのような順序で配置する必要がありますか?
A. cdev を削除してデバイスを登録解除する
B. 無料の GPIO リソース
C. IRQ リソースの解放
D. メジャー/マイナー番号の登録解除
「release()」メソッドの順序は?
ありがとう
私の理解によると、正しい順序はC、B、A、Dのように見えます:-)。説明: gpio ピン (割り込みピンとして使用) から IRQ を解放する必要があります。IRQ 番号は、この gpio ピンをgpio_to_irqに渡すことで得られます。この後、gpio のものを解放することができます。その後、cdev を削除すると、デバイス ノード情報 ( dev_t、32 ビットの符号なし整数。12 ビットがメジャー番号に使用され、残りの 20 ビットがマイナー番号に使用されます) およびマイナー番号情報 (マイナー番号の開始) が明らかになります。値と何個のマイナー番号が要求されるか) が関連付けられています。最後に、ドライバの登録を解除してください。
実際には、これらのことのいくつかは関数で行うことができ、これらのことのいくつかは関数で行う必要があります。それはすべて、どこで何をするかによって異なります。release()
module_exit()
まず、いくつかの用語: module_init()
モジュールが insmod でロードされたときに呼び出されます。反対の関数はmodule_exit()
、モジュールが rmmod でアンロードされたときに呼び出されます。 open()
ユーザープロセスがシステムコールでデバイスファイルを開こうとすると呼び出され、デバイスファイルを開いたプロセス (およびその元のプロセスから分岐したすべてのプロセス) がシステムコールをopen()
呼び出すと、反対の関数が呼び出されます。ファイル記述子。release()
close()
module_exit() 関数は、module_init() 関数の反対です。CDev API を使用していると仮定すると、モジュールの init 関数で、最初にメジャー/マイナー番号 (D) を登録する必要があります。alloc_chrdev_region()
register_chrdev_region()
cdev_init()
cdev_add()
が呼び出されたときにmodule_exit()
、行ったことを逆の順序で元に戻す必要があるのは当然のことです。つまり、最初に cdev を削除してcdev_del()
から、メジャー/マイナー番号を で登録解除しunregister_chrdev_region()
ます。
module_init()
関数のある時点で、&でGPIO リソースを要求し、次に で IRQ リソースを要求することができます。一方、代わりに関数で GPIO リソースと IRQ リソースを要求することもできます。request_mem_region()
ioremap()
request_irq()
open()
関数でこれらのリソースをリクエストする場合は、module_init()
関数でこれらのリソースを解放する必要がありmodule_exit()
ます。ただし、これを行う場合open()
は、デバイス ファイルを開いているプロセスの数を追跡し、すべてのプロセスがデバイス ファイルを解放したら、release()
関数内のリソースを解放する必要があります。
繰り返しになりますが、リソースを要求した順序が何であれ、通常は逆の順序でリソースを解放する必要があります。ただし、ほとんどの場合、IRQ リソースを解放する前にメモリ リソース (この場合は GPIO リソース) を解放するのは正しくありません。下半分のハンドラー。
要約すると、最初にリソースを要求するためにドライバーをどのように実装したかによって順序が異なりますが、私のようにドライバーを実装する場合は、一般に C を実行してから B をrelease()
実行し、A を実行してから D を実行しmodule_exit()
ます。