180 likes | 331 Views
[ Linux ] USB Device Drivers. Por: Augusto Farina. KIT LAB. PROCESSADORES. Processador MSC1213Y4 da Texas, núcleo 8051 Chip FT232R da FTDI – conversor USB para serial UART. SUPORTE A USB NO LINUX. USB HOST DRIVERS. Interagem com o hardware de controle USB
E N D
[ Linux ]USB Device Drivers Por: Augusto Farina
KIT LAB. PROCESSADORES • Processador MSC1213Y4 da Texas, núcleo 8051 • Chip FT232R da FTDI – conversor USB para serial UART
USB HOST DRIVERS • Interagem com o hardware de controle USB • São dependentes da arquitetura e plataforma • OHCI, UHCI e EHCI
USB CORE DRIVERS • Implementam a especificação USB • São independentes da arquitetura do sistema
USB DEVICE DRIVERS • São drivers para os dispositivos USB • Em geral são específicos para cada equipamento (câmeras, teclados e etc)
UDEV É um gerenciador dinâmico de dispositivos para o linux 2.6 • Sucessor do devfs e do hotplug • Executado inteiramento no espaço de usuário • Fica escutando eventos que o kernel envia quando um dispositivo é inserido ou removido do sistema • Criação de regras através de arquivo texto
REGRAS DO UDEV • /etc/udev/rules.d/ • ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe –Q $env{MODALIAS}“ • MODALIAS: usb:v0403p6001d*dc*dsc*dp*ic*isc*ip* • Modprobe procura o MODALIAS fornecido nos módulos do kernel e carrega os que coincidirem # modinfo ftdi_sio.ko ... alias: usb:v0403p6001d*dc*dsc*dp*ic*isc*ip ...
ESTRUTURA DOS DRIVERS • Includes importantes • Informações sobre o driver #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/usb.h> #define DRIVER_VERSION "v.0.0.1" #define DRIVER_AUTHOR "Augusto Farina <augustofr@gmail.com>" #define DRIVER_DESC "USB Data Aquisition - MSC1213 Board"
ESTRUTURA DOS DRIVERS • Definição dos IDs, é através deles que o udev saberá qual driver inserir ou remover • Podem ser comprados em www.usb.org #define FTDI_VID 0x0403 /* Vendor Id */ #define FTDI_PID 0x6001 /* Product Id */
ESTRUTURA DOS DRIVERS • Criação da tabela de IDs • As estruturas então são registradas static struct usb_device_id id_table [] = { { USB_DEVICE(FTDI_VID, FTDI_PID) }, { } }; MODULE_DEVICE_TABLE(usb, id_table);
ESTRUTURA DOS DRIVERS • Registro do driver static int usbdaq_probe() { info("usbdaq now attached"); } static struct usb_driver usbdaq_driver = { .name = "usbdaq", .probe = usbdaq_probe, .disconnect = usbdaq_disconnect, .id_table = id_table, }; static int __init usbdaq_init() { usb_register(&usbdaq_driver); }
ESTRUTURA DOS DRIVERS • Desregistro do driver static void usbdaq_disconnect() { info("usbdaq now disconnected"); } static void __exit usbdaq_exit() { usb_deregister(&usbdaq_driver); }
ESTRUTURA DOS DRIVERS • Indicação das funções de início (quando inserido) e fim (quando removido) do driver e registro das informações sobre o mesmo module_init(usbdaq_init); module_exit(usbdaq_exit); MODULE_VERSION(DRIVER_VERSION); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL")
ESTRUTURA DOS DRIVERS • Makefile obj-m := usbdaq.o KDIR := /lib/modules/`uname -r`/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
RESULTADO # tail -f /var/log/messages kernel: usb 3-1: new full speed USB device using ohci_hcd kernel: usb 3-1: configuration #1 chosen from 1 choice kernel: usbdaq now attached kernel: usbcore: registered new interface driver usbdaq kernel: usbdaq now disconnected kernel: usb 3-1: USB disconnect