どのカーネル設定オプションが私のドライバを有効にしているかどうかはどうすればわかりますか?

どのカーネル設定オプションが私のドライバを有効にしているかどうかはどうすればわかりますか?

重要な要約:
USB DAQデバイス用のドライバをコンパイルしようとしたときにカーネルを再設定しました。ドライバはデフォルトのディストリビューションのカーネルでコンパイルすることを拒否しましたが、すべてが私が調整したカーネルで動作しました。

ドライバは2つのカーネルモジュールで構成されています。どのオプションを変更したかを知っていますが、どの特定の設定オプションが私のドライバを有効にしたかを知りたいです。可能なすべてのオプションの組み合わせを試みる(カーネルを構成してコンパイルする)ことなくこの問題を解決する方法はありますか?

より長いストーリー:
openSUSE 11.4などのさまざまなデプロイ用ドライバに付属のAdvantech USB-4702 DAQデバイスがあります。ソースでコンパイルし、サポートされているディストリビューションで正しくコンパイルする必要があります(カーネル2.6.37.6-24-desktopでopenSUSE 11.4 32ビットを試しました)。

SLES 11 SP 3(64ビット、カーネル3.0.76-0.11 - デフォルト)で動作しようとすると、コンパイルエラーが発生します。そのうちの1つは、ソースコードの次のコードによって引き起こされます。

#ifndef CONFIG_USB
#  error "This driver needs to have USB support."
#endif

そのため、実行中のカーネル(/proc/config.gzで)の設定オプションを調べたところ、CONFIG_USBが有効になっていることがわかりました(無効にするとUSBキーボードとマウスが使用できなくなるようです)。その後、カーネル構成の使用を開始し、その一部(一部はモジュロ)を有効にしました。カーネルをコンパイル、インストール、再起動しました。これにより、ドライバはエラーや警告なしにコンパイルされ、デバイスを使用できるようになります。

問題は、ドライバのコンパイルを「有効にする」特定のオプションが何であるかをどうやって知ることができますか?どのオプションが変更されたかを知っていますが、ドライバに必要でないものは有効にしたくありません。私は可能なすべてのオプションの組み合わせでカーネルを設定してコンパイルしたくありません。

答え1

私は問題のドライバがモジュールにコンパイルされたと仮定します。必要なコンポーネントもモジュールとしてビルドすると簡単に見つけることができます。すべてのモジュールとそのオプションはカーネルmakefileに文書化されています。したがって、grepを使用してモジュール名を見つけることができます。

ただし、まずドライバがどのモジュールに依存しているかを調べる必要があります。したがって、aを発行lsmodし、特にColumnでドライバを検索してくださいUsed by。ドライバを例に挙げてみましょうrt2800usb

$ lsmod | grep rt2800usb
rt2800usb  15392   0  
rt2x00usb  8306    1  rt2800usb
rt2800lib  59262   1  rt2800usb
rt2x00lib  34431   3  rt2x00usb,rt2800lib,rt2800usb
usbcore    146570  7  rt2x00usb,rt2800usb

rt2x00usbこれは私のドライバにモジュールとrt2800libが必要であることを伝えますrt2x00libusbcoreこれでMakefileで検索します。.o検索文字列の前後にスペースに注意してください。

$ fgrep -r --include=Makefile ' usbcore.o'
drivers/usb/core/Makefile:obj-$(CONFIG_USB) += usbcore.o

$ grep -Pr --include=Makefile ' rt2(x|8)00(usb|lib)\.o'
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB) += rt2x00lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2X00_LIB_USB) += rt2x00usb.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800_LIB) += rt2800lib.o
drivers/net/wireless/rt2x00/Makefile:obj-$(CONFIG_RT2800USB) += rt2800usb.o

これには、これらのモジュールを構築するために必要な設定オプションがあります。犯人がすぐに見つからない場合は、依存関係の依存関係をもう少し詳しく調べてください。名前を推測できる場合は、組み込みオブジェクト(モジュールとは反対)にも役立ちます。

(この記事のすべてのコマンドライン出力は読みやすくするために軽く圧縮され、フォーマットされています。)

答え2

追加の実験では、コメントの1つで私が主張した内容を確認できます。 CONFIG_USBオプションには値が必要ですYm十分ではありません。しかし、openSUSE 11.4のカーネルにはYデフォルトでこのオプションがあり、SLES11SP3のカーネルにはm

残念ながら、エラーメッセージは明確ではありません。

設定する簡単な方法はオプションをmake menuonfig選択することです。Yホスト側USB対応下にデバイスドライバ->USBサポート

答え3

make config(or or)を使用したときに表示されるmake menuconfigメッセージと質問は、make xconfig次のようになります。カーネルの設定ソースツリーのファイル。それらがたくさんあります。find . -name Kconfig木の頂上でそれらを見てください。

以下は3.10.1/drivers/misc/Kconfigの例です:

config AD525X_DPOT_I2C
        tristate "support I2C bus connection"
        depends on AD525X_DPOT && I2C
        help
          Say Y here if you have a digital potentiometers hooked to an I2C bus.

          To compile this driver as a module, choose M here: the
          module will be called ad525x_dpot-i2c.

分野について議論があります。ここしかし、十分に使用すると、何が起こっているのかを確認するのは難しくありませんmenuconfig。通常、ヘルプに提供されているバージョンがあり、検索機能を使用すると(押す/)、返されたクリックもそれを報告します。たとえば、make menuconfig「AD525」を検索すると、次のようになります。

│ Symbol: AD525X_DPOT_I2C [=n]                                                                                                                                         │  
│ Type  : tristate                                                                                                                                                     │  
│ Prompt: support I2C bus connection                                                                                                                                   │  
│   Location:                                                                                                                                                          │  
│     -> Device Drivers                                                                                                                                                │  
│       -> Misc devices                                                                                                                                                │  
│ (1)     -> Analog Devices Digital Potentiometers (AD525X_DPOT [=n])                                                                                                  │  
│   Defined at drivers/misc/Kconfig:34                                                                                                                                 │  
│   Depends on: AD525X_DPOT [=n] && I2C [=y]   

「Tristate」は、オプションが yes/no/module で、「bool」型と「int」型があることを意味します。ここで、「依存先」(Kconfigファイルのソースに対応)には、正しい依存関係を選択したかどうかを示すインジケータが含まれています([=n] [=y])。これは非常に便利な情報です。オプションとして表示されません正しい前提条件を選択するまで。

理想的には、モジュールを作成する人は以下を含める必要があります。カーネルの設定データをソースツリーにシームレスに挿入し、一般的な手段で構成できるようにします。これを見ると、依存関係を追跡できるはずです。

関連情報