我如何知道哪個核心配置選項啟用了我的驅動程序?
TL;DR:
當我嘗試為 USB DAQ 設備編譯驅動程序時,我重新配置了核心。該驅動程序拒絕在預設發行版的核心下編譯,但一切都適用於我調整過的核心。
該驅動程序由 2 個核心模組組成。我知道我更改了哪些選項,但我想知道哪個特定配置選項啟用了我的驅動程序。有沒有辦法在不嘗試(配置和編譯核心)所有可能的選項組合的情況下弄清楚它?
更長的故事:
我有一個 Advantech USB-4702 DAQ 設備,它帶有適用於各種發行版的驅動程序,例如 openSUSE 11.4。它必須從原始碼編譯,並且在受支持的發行版上編譯良好(我嘗試使用核心 2.6.37.6-24-desktop 的 openSUSE 11.4 32 位)。
當我試圖讓它在 SLES 11 SP 3(64 位,核心 3.0.76-0.11-default)下工作時,我遇到了編譯錯誤。其中一個是由原始碼中的這個片段引起的:
#ifndef CONFIG_USB # error "This driver needs to have USB support." #endif
因此,我查看了正在執行的核心的配置選項(來自 /proc/config.gz),發現 CONFIG_USB 被啟用(我想如果它被禁用,我將無法使用我的 USB 鍵盤和滑鼠)。然後我開始使用核心配置並啟用(一些作為模組)其中一些。我編譯核心,安裝它,重新啟動。然後驅動程序編譯沒有任何錯誤或警告,我現在可以使用該設備。
問題是,**如何找出驅動程序的哪個特定選項“啟用”編譯?**我知道哪些選項已更改,但我不想啟用驅動程序不需要的任何東西。而且我不想通過所有可能的選項組合來配置和編譯核心。
經過進一步的實驗,我可以確認我在其中一條評論中的主張:
CONFIG_USB
期權必須有價值Y
;m
是不足夠的”。順便說一句,openSUSE 11.4 中Y
的核心預設具有它,而 SLES11SP3 中的核心具有m
.遺憾的是錯誤資訊沒有明確說明。
一種簡單的設置方法是通過
make menuonfig
,然後在Device Drivers -> USB Support下Y
選擇Support for host-side USB選項。
我假設,有問題的驅動程序被編譯為一個模組。如果您還將先決條件建構為模組,則可以輕鬆找到它們。所有模組及其相應的選項都記錄在核心 makefile 中。因此,您可以將這些 grep 用於模組名稱。
但首先,您需要找出您的驅動程序依賴於哪些模組。因此,發出
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
和. 現在我在 Makefiles 中搜尋它們。注意搜尋字元串中的前導空格和尾隨rt2x00lib``usbcore``.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
我們有建構這些模組所需的配置選項。如果您無法立即找到罪魁禍首,請嘗試更深入地搜尋依賴項的依賴項…如果您能猜到名稱,這也可能對內置對像有所幫助(與模組相反)。
(這篇文章中的所有命令行輸出都略微壓縮並重新格式化以提高可讀性。)