Introdução aos Sistemas Operacionais/Exemplo de Drivers USB em Linux: Mouse USB
Informações gerais
editar- Autores:
- -Marcos André Oliveira
- -Murilo Adriano Vasconcelos
- -Paulo Cezar P. Costa
- -Vinícius Vieira Pessoni
- Versão do kernel:
- Linux Kernel versão 2.6.36 20-Oct-2010 21:15 67M
- Arquivos Fontes do Kernel Disponíveis em: http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.tar.bz2
- Representação em páginas web do Kernel do Linux: Linux Cross-Reference (LXR) http://lxr.linux.no/+trees
- Identificação do driver analisado:
O driver analisado é intintitulado “usbmouse.c” presente na pasta:
- /linux-2.6.36/drivers/hid/usbhid/usbmouse.c
- ou diretamente na web pelo link:
- http://lxr.linux.no/linux+*/drivers/hid/usbhid/usbmouse.c
- Lista de arquivos de códigos-fontes analisados:
- usbmouse.c
- Outras informações relevantes:
Introdução
editarEste trabalho tem como objetivo uma breve análise sobre o funcionamento do driver para mouse USB presente no Linux. Serão feitas algumas descrições e comentários sobre funções e macros presentes no driver. Importante notar que o mouse é um dispositivo de interface humanda, enquadrado na classe de dispositivos HID, assim sendo, qualquer dispositivo do tipo mouse que não seja reconhecido pelo módulo mais geral HID é passado o seu reconhecimento ao driver usbmouse.c .
Um pouco sobre USB
- USB significa Universal Serial Bus e trata-se basicamente de um padrão de interface externa que permite a comunicação entre computador e uma alta gama de periféricos. Alguns dos dispositivos USB's mais comuns são teclado, mouse, pen drives, impressoras, cameras digitais, entre vários outros.
- Existem atualmente duas versões de USB em uso, e são elas a USB 1.1 e USB 2.0. Elas se diferem por suas traxas de transmissão de dados, sendo 60 MBps a taxa do USB 1.1 e 480 MBps do USB 2.0.
- A vantagem da utilização do padrão USB é que os dispositivos são hot-pluggable isso significa que o sistema não precisa ser reiniciado a cada conexão de um novo dispositivo.
Mais informações sobre USB em:
- http://www.usb.org/home [Inglês]
- http://www.guiadohardware.net/tutoriais/usb-firewire-dvi/ [português]
Drivers
- No linux é possível escolher entre dois drivers de dispositivos para o subsistema USB:
- 1- usb-ohci.o
- 2- usb-uhci.o
Seja qual deles for escolhido, o módulo “usbcore.o” é requerido para que seja possível o carregamento do driver para o hardware desejado.
- Quando um dispositivo é conectado ao barramento USB esse é identificado dentre uma série de classes de periféricos. Para utilizar esse dispositivo é necessário o carregamento do driver que possui a propriedade do determinado dispositivo ou que consegue lidar com o protocolo a ele associado.
- Quando se compila o subsistema USB para Linux como módulos estará disponível ao usuário vários módulos de kernel.
- Quando se compila o driver usbmouse.c como um módulo será obtido um módulo para mouses USB chamado “usbmouse.o” o qual possui as seguintes funções utilizadas em tempo de carregamento e em tempo de execução:
- usb_register();
- usb_submit_urb();
- input_register_device();
- input_event();
Essas funçoes serão detalhadas a seguir.
Carga (load ou init)
editar- Módulos Carregados:
- Processo de carga do módulo
Reconhecimento ou detecção (probe)
editar- Dispositivos que podem ser reconhecidos segundo o fabricante:
- Esse driver reconhece apenas dispositivos do tipo mouse que sejam USB. Mouses de outros tipo ( PS/2, Serial... ) são reconhecidos por outros módulos.
- Dispositivos que não podem ser reconhecidos:
- Qualquer dispositivo do tipo mouse que não seja USB não será reconhecido por esse driver
- Como se processa a identificação do dispositivo
- O dispositivo é reconhecido da seguinte forma:
- I: Bus=0003 Vendor=192f Product=0416 Version=0111
- N: Name="USB Optical Mouse"
- P: Phys=usb-0000:00:1d.0-1.2/input0
- S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/input/input6
- U: Uniq=
- H: Handlers=mouse1 event6
- B: EV=17
- B: KEY=70000 0 0 0 0 0 0 0 0
- B: REL=143
- B: MSC=10
- O que ocorre quando o driver não é reconhecido (erro), etc;
Inicialização de estruturas
editar- Quais estruturas são inicializadas
- Tipo de estruturas inicializadas (buffer, por exemplo)
- Registro de URB;
Registro do driver (register)
editar- Como o driver é reconhecido
- Quais procedimentos (comandos) para verificar qual dispositivo específico que foi reconhecido
- Quais drivers que foram carregados para o dispositivo, etc;
Comunicação
editar- Arquivos especiais de dispositivo (/proc, /dev e /sys)
- /dev/input/mice
- Essa é a representação genérica de todos os tipos de mouses conectados ao pc.
- Essa é a representação genérica de todos os tipos de mouses conectados ao pc.
- /dev/input/mouse0
- É possível que exista mais de um mouse conectado ao sistema. Essa representação ocorre uma instância para cada dispositivo do tipo mouse, sendo "mousen" o nome de cada um deles, a partir do zero.
- Criação de interface
- Criação de endpoint
- Criação de configuração (configuration)
- Tipos de comunicação utilizados pelo driver (control, bulk, etc);
- INTERRUPT ENDPOINT (endpoint de interrupção)
- Endpoints de interrupção transferem pequenas quantidades de dados a uma taxa fixa toda vez que um host USB pergunta por dados desse dispositivo. Esses endpoints ::são o método primário de transporte para teclados e mouse's USB.
Finalização
editar- Mensagens de remoção do dispositivo
- Desalocação/liberação de estruturas;
Considerações finais
editar- Informações gerais do driver
- Conclusões
- Mapa conceitual sobre o driver estudado;
Bibliografia/Referências
editarArquivos do Linux
- /linux-2.6.36/Documentation/driver-model/device.txt
Links
- http://www.mjmwired.net/kernel/Documentation/input/
- http://www.usb.org/developers/hidpage/
- http://www.linux.org/dist/kernel.html
- http://www.hugoazevedo.eti.br/html/xorg.html
- http://lwn.net/Kernel/LDD3/
- http://www.freesoftwaremagazine.com/articles/drivers_linux?page=0%2C1
- http://www.ppgia.pucpr.br/~maziero/doku.php/pua:acesso_a_dispositivos
- http://www.linux.it/~rubini/docs/usb/usb.html
- http://mirror.linux.org.au/linux-mandocs/2.6.12.6/usb_register.html
- http://www.mjmwired.net/kernel/Documentation/input/
- http://www.linux.it/~rubini/docs/input/input.html
- http://acapulco.dyndns.org/manual/src/linux26/usbmouse_8c.htm