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

editar

Este 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.
/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

editar

Arquivos 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