重要な要約:
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
が必要であることを伝えます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
これには、これらのモジュールを構築するために必要な設定オプションがあります。犯人がすぐに見つからない場合は、依存関係の依存関係をもう少し詳しく調べてください。名前を推測できる場合は、組み込みオブジェクト(モジュールとは反対)にも役立ちます。
(この記事のすべてのコマンドライン出力は読みやすくするために軽く圧縮され、フォーマットされています。)
答え2
追加の実験では、コメントの1つで私が主張した内容を確認できます。 CONFIG_USB
オプションには値が必要ですY
。m
十分ではありません。しかし、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]
)。これは非常に便利な情報です。オプションとして表示されません正しい前提条件を選択するまで。
理想的には、モジュールを作成する人は以下を含める必要があります。カーネルの設定データをソースツリーにシームレスに挿入し、一般的な手段で構成できるようにします。これを見ると、依存関係を追跡できるはずです。