2

char ドライバーについて質問があります。GPIO ピンを使用して、割り込みインターフェイスを含むハードウェア デバイスと通信する char ドライバー。ドライバーの "release ()" メソッドがありません。関数要素はどのような順序で配置する必要がありますか?

A. cdev を削除してデバイスを登録解除する

B. 無料の GPIO リソース

C. IRQ リソースの解放

D. メジャー/マイナー番号の登録解除

「release()」メソッドの順序は?

ありがとう

4

2 に答える 2

1

私の理解によると、正しい順序はC、B、A、Dのように見えます:-)。説明: gpio ピン (割り込みピンとして使用) から IRQ を解放する必要があります。IRQ 番号は、この gpio ピンをgpio_to_irqに渡すことで得られます。この後、gpio のものを解放することができます。その後、cdev を削除すると、デバイス ノード情報 ( dev_t、32 ビットの符号なし整数。12 ビットがメジャー番号に使用され、残りの 20 ビットがマイナー番号に使用されます) およびマイナー番号情報 (マイナー番号の開始) が明らかになります。値と何個のマイナー番号が要求されるか) が関連付けられています。最後に、ドライバの登録を解除してください。

于 2013-05-31T17:51:07.897 に答える
0

実際には、これらのことのいくつかは関数で行うことでき、これらのことのいくつかは関数で行う必要があります。それはすべて、どこで何をするかによって異なります。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()ます。

于 2013-06-01T07:28:20.327 に答える