web-dev-qa-db-ja.com

どのカーネル構成オプションがドライバーを有効にしたかを知るにはどうすればよいですか?

TL; DR:
USB DAQデバイス用のドライバーをコンパイルしようとしたときに、カーネルを再構成しました。ドライバーはデフォルトのディストリビューションのカーネルでコンパイルすることを拒否しましたが、すべてが私の微調整されたカーネルで動作します。

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

長い話:
Advantech USB-4702 DAQデバイスがあり、さまざまなディストリビューション用のドライバーが付属しています。 openSUSE11.4。ソースからコンパイルする必要があり、サポートされているディストリビューションで適切にコンパイルされます(openSUSE 11.432ビットとカーネル2.6.37.6-24-desktopを試しました)。

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キーボードとマウスを使用できなくなると思います)。それから私はカーネル構成で遊び始め、それらのいくつかを(いくつかはモジュールとして)有効にしました。カーネルをコンパイルしてインストールし、再起動しました。その後、ドライバーはエラーや警告なしでコンパイルされ、デバイスを使用できるようになりました。

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

5
Peter Kovac

さらに実験を重ねた後、コメントの1つで主張を確認できます。CONFIG_USBオプションの値はYである必要があります。 mは「十分ではありません」。ちなみに、openSUSE11.4のカーネルにはデフォルトでYがあり、SLES11SP3のカーネルにはmがあります。

エラーメッセージに明確に記載されていないのは残念です。

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

1
Peter Kovac

問題のドライバーはモジュールとしてコンパイルされていると思います。前提条件もモジュールとして作成した場合は、簡単に見つけることができます。すべてのモジュールとそれに対応するオプションは、カーネルのメイクファイルに記載されています。したがって、モジュール名としてこれらをgrepするだけです。

ただし、最初に、ドライバーがどのモジュールに依存しているかを確認する必要があります。したがって、lsmodを発行し、特に列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

これは、私のドライバーがモジュールrt2x00usbrt2800librt2x00lib、およびusbcoreを必要としていることを示しています。次に、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

そして、それらのモジュールを構築するために必要な構成オプションがあります。すぐに原因を見つけることができない場合は、レベルを深くして、依存関係の依存関係を検索してみてください...名前を推測できる場合は、組み込みオブジェクトにも役立つ可能性があります(モジュールとは異なります)。

(この投稿のすべてのコマンドライン出力は、読みやすくするためにわずかに凝縮され、再フォーマットされています。)

4
XZS

make config(またはmake menuconfigまたはmake xconfig)を使用するときに表示される情報と質問は、ソースツリーのKconfigファイルから取得されます。それらはたくさんあります。ツリーの上からfind . -name Kconfigを試して、1つ見てください。

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]   

「トライステート」は、オプションがyes/no/moduleであることを示し、「bool」タイプと「int」タイプもあります。ここでの「依存関係」(Kconfigファイルのソースに対応)には、正しい依存関係が選択されているかどうかの表示が含まれていることに注意してください([=n][=y])。適切な前提条件を選択するまで、いくつかのものが選択肢として表示されないため、これは非常に役立つ情報です。

理想的には、モジュールを作成した人がKconfigデータを含めて、ソースツリーに無意識に挿入し、通常の方法で構成できるようにします。それを探してください。依存関係を追跡できるはずです。

0
goldilocks