Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Обслуживание периферийных устройств | Вперед |
Устройства USB
Схема идентификации устройства парой индексов VendorID — DeviceID, показанная для устройств PCI, оказалась настолько плодотворной, что подобный ей же вариант используется для устройств USB (пара цифр, выводимая после ID):
$ lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 003: ID 0461:4d17 Primax Electronics, Ltd Optical Mouse Bus 004 Device 002: ID 0458:0708 KYE Systems Corp. (Mouse Systems) Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 006: ID 08ff:2580 AuthenTec, Inc. AES2501 Fingerprint Sensor Bus 001 Device 003: ID 046d:080f Logitech, Inc. Bus 001 Device 002: ID 0424:2503 Standard Microsystems Corp. USB 2.0 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Список идентификаторов USB (производитель:устройство) поддерживается в файле с именем usb.ids, в некоторых дистрибутивах он может присутствовать в системе, в других нет, но, в любом случае, лучше воспользоваться самой свежей копией этого файла, например по URL: http://www.linux-usb.org/usb.ids. Для одного из приведенных выше устройств (WEB-камеры), для которого мы будем проводить тест:
# List of USB ID's # Date: 2011-04-14 20:34:04 046d Logitech, Inc. ... 080f Webcam C120 ...
Подключение (отключение) и регистрацию USB-устройства показывает модуль (архив usb.tgz) lab1_usb.ko (заимствован из [6] при замене, естественно, в коде ID USB устройства на наблюдаемые выше):
lab1_usb.c :
#include <linux/module.h> #include <linux/init.h> #include <linux/usb.h> #include <linux/slab.h> struct my_usb_info { int connect_count; }; static int my_usb_probe( struct usb_interface *intf, const struct usb_device_id *id ) { struct my_usb_info *usb_info; struct usb_device *dev = interface_to_usbdev(intf); static int my_counter = 0; printk( KERN_INFO "\nmy_usb_probe\n" ); printk( KERN_INFO "devnum=%d, speed=%d\n", dev->devnum, (int)dev->speed ); printk( KERN_INFO "idVendor=0x%hX, idProduct=0x%hX, bcdDevice=0x%hX\n", dev->descriptor.idVendor, dev->descriptor.idProduct, dev->descriptor.bcdDevice ); printk( KERN_INFO "class=0x%hX, subclass=0x%hX\n", dev->descriptor.bDeviceClass, dev->descriptor.bDeviceSubClass ); printk( KERN_INFO "protocol=0x%hX, packetsize=%hu\n", dev->descriptor.bDeviceProtocol, dev->descriptor.bMaxPacketSize0 ); printk( KERN_INFO "manufacturer=0x%hX, product=0x%hX, serial=%hu\n", dev->descriptor.iManufacturer, dev->descriptor.iProduct, dev->descriptor.iSerialNumber); usb_info = kmalloc( sizeof( struct my_usb_info ), GFP_KERNEL ); usb_info->connect_count = my_counter++; usb_set_intfdata( intf, usb_info ); printk( KERN_INFO "connect_count=%d\n\n", usb_info->connect_count ); return 0; } static void my_usb_disconnect( struct usb_interface *intf ) { struct my_usb_info *usb_info; usb_info = usb_get_intfdata(intf); printk( KERN_INFO "\nmy_usb_disconnect\n" ); kfree( usb_info ); } static struct usb_device_id my_usb_table[] = { { USB_DEVICE( 0x046d, 0x080f ) }, // Logitech, Inc. - Webcam C120 {} // Null terminator (required) }; MODULE_DEVICE_TABLE( usb, my_usb_table ); static struct usb_driver my_usb_driver = { .name = "usb-hotplug", .probe = my_usb_probe, .disconnect = my_usb_disconnect, .id_table = my_usb_table, }; static int __init my_init_module( void ) { int err; printk( KERN_INFO "Hello USB\n" ); err = usb_register( &my_usb_driver ); return err; } static void my_cleanup_module( void ) { printk( KERN_INFO "Goodbye USB\n" ); usb_deregister( &my_usb_driver ); } module_init( my_init_module ); module_exit( my_cleanup_module ); MODULE_AUTHOR( "Terry Griffin" ); MODULE_DESCRIPTION( "LDD:1.0 s_28/lab1_usb.c" ); MODULE_LICENSE( "GPL v2" );
Работа полученного модуля:
$ sudo insmod lab1_usb.ko.
$ lsmod | grep lab
lab1_usb 1546 0.
$ dmesg | tail -n 10
Hello USB usbcore: registered new interface driver usb-hotplug
... размыкаем кабель USB-камеры :
$ dmesg | tail -n 3
Hello USB usbcore: registered new interface driver usb-hotplug usb 1-3: USB disconnect, address 3
... снова подключаем кабель USB-камеры :
$ dmesg | tail -n 10
Hello USB
usbcore: registered new interface driver usb-hotplug usb 1-3: USB disconnect, address 3 usb 1-3: new high speed USB device using ehci_hcd and address 7 usb 1-3: New USB device found, idVendor=046d, idProduct=080f usb 1-3: New USB device strings: Mfr=0, Product=0, SerialNumber=2 usb 1-3: SerialNumber: 1DC23270 usb 1-3: configuration #1 chosen from 1 choice uvcvideo: Found UVC 1.00 device <unnamed> (046d:080f) input: UVC Camera (046d:080f) as /devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/input/input13
$ sudo rmmod lab1_usb
$ dmesg | tail -n 2
Goodbye USB usbcore: deregistering interface driver usb-hotplug
Предыдущий раздел: | Оглавление | Следующий раздел: |
DMA | Запуск процессов из ядра |