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キーボードとマウスを使用できなくなると思います)。それから私はカーネル構成で遊び始め、それらのいくつかを(いくつかはモジュールとして)有効にしました。カーネルをコンパイルしてインストールし、再起動しました。その後、ドライバーはエラーや警告なしでコンパイルされ、デバイスを使用できるようになりました。
問題は、どの特定のオプションがドライバーのコンパイルを「有効」にしたかを知るにはどうすればよいですか?どのオプションが変更されたかはわかりますが、ドライバーに必要のないものは有効にしたくありません。そして、オプションの可能なすべての組み合わせを使用してカーネルを構成およびコンパイルすることはしたくありません。
さらに実験を重ねた後、コメントの1つで主張を確認できます。CONFIG_USB
オプションの値はY
である必要があります。 m
は「十分ではありません」。ちなみに、openSUSE11.4のカーネルにはデフォルトでY
があり、SLES11SP3のカーネルにはm
があります。
エラーメッセージに明確に記載されていないのは残念です。
設定する簡単な方法は、make menuonfig
を使用し、オプションホスト側USBのサポートの下でY
を選択することですデバイスドライバー-> USBサポート。
問題のドライバーはモジュールとしてコンパイルされていると思います。前提条件もモジュールとして作成した場合は、簡単に見つけることができます。すべてのモジュールとそれに対応するオプションは、カーネルのメイクファイルに記載されています。したがって、モジュール名としてこれらを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
これは、私のドライバーがモジュールrt2x00usb
、rt2800lib
、rt2x00lib
、および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
そして、それらのモジュールを構築するために必要な構成オプションがあります。すぐに原因を見つけることができない場合は、レベルを深くして、依存関係の依存関係を検索してみてください...名前を推測できる場合は、組み込みオブジェクトにも役立つ可能性があります(モジュールとは異なります)。
(この投稿のすべてのコマンドライン出力は、読みやすくするためにわずかに凝縮され、再フォーマットされています。)
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データを含めて、ソースツリーに無意識に挿入し、通常の方法で構成できるようにします。それを探してください。依存関係を追跡できるはずです。