keywords:
linux 驱动匹配
这两天因为手上杂牌pad adb驱动的问题看了些linux驱动的东西,不过问题还是没解决……,总结一下,如有错误希望指正。
首先 设备(Device) 与驱动(Driver) 是多对一的关系 ,一个Device同一时间只能由一个Driver驱动 ,但一个Driver同一时间可以控制多个Device。
Device是挂载总线(Bus)上的,比如PCI总线、USB总线等,一个Device插入后,内核会检测到这个Device,调用Bus的match函数来搜索这个Device的Driver,每个Driver中都有一个内置支持的Device列表和一个动态的列表(我猜就是sysfs里new_id添加的),Bus得到所有匹配的Driver后依次调用probe函数以确认确实可以驱动这个Device,probe成功后即返回,否则调用下一个Driver的probe直到找到一个合适的Driver。
设备号是Driver返回的,所以一个设备号对应什么驱动不是固定的,要看系统当时的状态,举个例子:
usb转串口驱动,常见的有2个:pl2303和FT232芯片,他们返回的主设备号都是188 ttyUSB 但这个188的设备结点到底用的什么驱动就要看是哪个驱动返回的设备号了
douniwan@ubuntu:/sys/bus/usb/drivers$ ll ftdi_sio/
总用量 0
drwxr-xr-x 2 root root 0 2012-05-22 17:28 ./
drwxr-xr-x 12 root root 0 2012-05-22 17:27 ../
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 4-2:1.0 -> ../../../../devices/pci0000:00/0000:00:1a.1/usb4/4-2/4-2:1.0/
--w------- 1 root root 4096 2012-05-22 17:28 bind
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 module -> ../../../../module/ftdi_sio/
--w------- 1 root root 4096 2012-05-22 17:28 remove_id
--w------- 1 root root 4096 2012-05-22 17:28 uevent
--w------- 1 root root 4096 2012-05-22 17:28 unbind
douniwan@ubuntu:/sys/bus/usb/drivers$ ll pl2303/
总用量 0
drwxr-xr-x 2 root root 0 2012-05-22 17:27 ./
drwxr-xr-x 12 root root 0 2012-05-22 17:27 ../
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 6-2:1.0 -> ../../../../devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.0/
--w------- 1 root root 4096 2012-05-22 17:28 bind
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 module -> ../../../../module/pl2303/
--w------- 1 root root 4096 2012-05-22 17:28 remove_id
--w------- 1 root root 4096 2012-05-22 17:27 uevent
--w------- 1 root root 4096 2012-05-22 17:28 unbind
douniwan@ubuntu:/sys/bus/usb/drivers$ ll /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 2012-05-22 17:27 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 2012-05-22 17:28 /dev/ttyUSB1
1/usb4/4-2/4-2:1.0/
--w------- 1 root root 4096 2012-05-22 17:28 bind
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 module -> ../../../../module/ftdi_sio/
--w------- 1 root root 4096 2012-05-22 17:28 remove_id
--w------- 1 root root 4096 2012-05-22 17:28 uevent
--w------- 1 root root 4096 2012-05-22 17:28 unbind
douniwan@ubuntu:/sys/bus/usb/drivers$ ll pl2303/
总用量 0
drwxr-xr-x 2 root root 0 2012-05-22 17:27 ./
drwxr-xr-x 12 root root 0 2012-05-22 17:27 ../
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 6-2:1.0 -> ../../../../devices/pci0000:00/0000:00:1d.0/usb6/6-2/6-2:1.0/
--w------- 1 root root 4096 2012-05-22 17:28 bind
lrwxrwxrwx 1 root root 0 2012-05-22 17:28 module -> ../../../../module/pl2303/
--w------- 1 root root 4096 2012-05-22 17:28 remove_id
--w------- 1 root root 4096 2012-05-22 17:27 uevent
--w------- 1 root root 4096 2012-05-22 17:28 unbind
douniwan@ubuntu:/sys/bus/usb/drivers$ ll /dev/ttyUSB*
crw-rw---- 1 root dialout 188, 0 2012-05-22 17:27 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 2012-05-22 17:28 /dev/ttyUSB1