酷!學園

技術討論區 => Embedded 討論版 => 主題作者是: id4fox 於 2010-08-12 21:22

主題: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: id4fox2010-08-12 21:22
請問我要怎麼知道機器所連結的硬體是由哪一個module作控管的?
比如 USB 鍵盤、螢幕~

我在 Ubuntu 連了個 USB 鍵盤,但是卻沒有在 lsmod  看到預期的 usbkbd.ko  讓我很納悶,
而 USB 鍵盤還是跑的好好的~不知道到底是哪個 module 在提供 USB 鍵盤的控制?
我修改 usbkbd.c 自己編了一個 kbd_test.ko 安裝,結果也是沒反應(Used by == 0)

此外,請問 module 間有沒有優先權呢?
好奇的是,如果兩個 module 都對同一組 device id 支援,只有一個會有 device 的控制權嗎?
有辦法查知某個設備的 device id 嗎?

麻煩學長姐指點一下,謝謝 Thx

(補充:我是在 Vista 運作 VirtualBox 跑 Ubuntu 9.04,希望這不會影響到這個討論)
主題: 回覆: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: harrier2010-08-13 11:45
請問我要怎麼知道機器所連結的硬體是由哪一個module作控管的?
比如 USB 鍵盤、螢幕~
我在 Ubuntu 連了個 USB 鍵盤,但是卻沒有在 lsmod  看到預期的 usbkbd.ko  讓我很納悶,
而 USB 鍵盤還是跑的好好的~不知道到底是哪個 module 在提供 USB 鍵盤的控制?
我修改 usbkbd.c 自己編了一個 kbd_test.ko 安裝,結果也是沒反應(Used by == 0)
此外,請問 module 間有沒有優先權呢?
好奇的是,如果兩個 module 都對同一組 device id 支援,只有一個會有 device 的控制權嗎?
有辦法查知某個設備的 device id 嗎?

去找對應的 Ubuntu kernel source,找到 Ununtu kernel 的 config,make xconfig 之後載入設定值,
看看是不是編譯到核心裡面了。

一些基本的驅動模組會編譯到核心裡面,避免開機的一些困擾。而且隨著記憶體越來越多,預設也會
編入越多的基本模組。

另外,類似 pointer 一類的設備,是會同時擁有控制權的,pointer 指的是滑鼠、touchpad、wacom
繪圖板一類。不過鍵盤我不確定。
主題: 回覆: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: id4fox2010-08-13 13:54
去找對應的 Ubuntu kernel source,找到 Ununtu kernel 的 config,make xconfig 之後載入設定值,
看看是不是編譯到核心裡面了。

一些基本的驅動模組會編譯到核心裡面,避免開機的一些困擾。而且隨著記憶體越來越多,預設也會
編入越多的基本模組。

另外,類似 pointer 一類的設備,是會同時擁有控制權的,pointer 指的是滑鼠、touchpad、wacom
繪圖板一類。不過鍵盤我不確定。

謝謝 harrier 回答,我來多跟 make config 認識 認識。
主題: 回覆: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: id4fox2010-08-16 14:13
我發覺我的問題可能跟"裝置模型"有比較大的關聯性,
sysfs、udev、kobject ...
比如一旦我的 usb 鍵盤 被連結,/sys/bus/usb/devices 下會冒出
2-1、2-1:1.0
翻一翻會找到 /sys/bus/usb/devices/2-1\:1.0/input/input6/id/
裡面包含著 vender、product 檔,cat 一下可以看到 id。

這也只是亂模的結果,基礎不夠,學習 學習
主題: 回覆: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: id4fox2010-08-16 18:20
針對我的問題,大概整理一下目前我所瞭解的,
Ubuntu 9.04 ,Kernel:2.6.31-22-generic

先由 /proc 下手,
$cat /proc/bus/input/devices
可以列出所有 input 設備的資訊 如:
-------------------------------------------------------
I: Bus=0003 Vendor=413c Product=2003 Version=0110
N: Name="Dell Dell USB Keyboard"
P: Phys=usb-0000:00:06.0-1/input0
S: Sysfs=/devices/pci0000:00/0000:00:06.0/usb2/2-1/2-1:1.0/input/input9
U: Uniq=
H: Handlers=kbd event5
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
-------------------------------------------------------
這就是我要的USB鍵盤資訊,其中可以看到 Vender、Product 等各個識別 ID
接下來看 "Sysfs" 後面的資訊代表該設備在 /sys/ 下的路徑,也就是
/sys/devices/pci0000:00/0000:00:06.0/usb2/2-1/2-1:1.0/input/input9
其下的 ./device/driver 是一個 symbolic link,指向 /sys/bus/usb/drivers/usbhid/
這個 "usbhid" 便是控制這個 USB 鍵盤的名稱。

這時如果 $rmmod usbhid 則會發現 USB 鍵盤已經動不了拉~
而把自己編的 kbd_test.ko 來 insmod 進去,USB 鍵盤就可以動了!

而如果已經有一個 USB 鍵盤的驅動程式可以運作,那麼接下來的 USB 鍵盤驅動程式並不會得到控制權。
這點 usbhid 與 kbd_test 都一樣。
主題: 回覆: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: netman2010-08-17 10:14
如果有指定 module 的話,就用指定的。
要不然, 在 /lib/modules/<version>/ 目錄下應該有個 modules.alias ,可以根據 device ID 找到相應的 module 。
主題: 回覆: [Linux]請問怎麼知道連接的設備是由哪個module驅動的呢?
作者: id4fox2010-08-17 12:47
如果有指定 module 的話,就用指定的。
要不然, 在 /lib/modules/<version>/ 目錄下應該有個 modules.alias ,可以根據 device ID 找到相應的 module 。

謝謝 netman 大大的指點!
以前沒想過從 /lib/modules/<version>/ 作觀察,
跟G大神問一問發現有很多可以去瞭解的地方(也比較根本),
多些突破口真不錯 Thx!