# Informações gerais

* 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

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)

* Módulos Carregados:
* Processo de carga do módulo

# Reconhecimento ou detecção (probe)

* 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

* Quais estruturas são inicializadas
* Tipo de estruturas inicializadas (buffer, por exemplo)
* Registro de URB;

# Registro do driver (register)

* 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

* 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

* Mensagens de remoção do dispositivo
* Desalocação/liberação de estruturas;

# Considerações finais

* Informações gerais do driver
* Conclusões
* Mapa conceitual sobre o driver estudado;

# Bibliografia/Referências

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