Device-Drivers no Linux

Projete um device-driver USB para o Linux.

Introdução: Descreva a importância de device-drivers e a arquitetura de device-drivers do Linux.

Não seria natural se esperar que o sistema núcleo do sistema operacional(kernel) gerisse por completo todos os dispositivos existentes. Device driver é um software que de em linhas gerais faz o papel pesado na comunicação com um dispositivo físico ou virtual que quase sempre tem uma natureza complexa. Assim, o device driver atua abstraindo as funcionalidades de modo a tornas o mais simples possível. Por exemplo, temos device drivers para timers, adaptadores de rede, tansmissores e receptores assíncronos, que ilustram os dispostivos físicos citados. Um sistema de arquivos, que, em geral, tende a ter uma considerável complexidade, pode ter um device driver que simplifica o trabalho com o mesmo. Assim, o device driver possibilita que as funcionalidades do dispositivo sejam facilmente utilizadas por outros aplicativos e por outras partes do sistema operacional. Assim, ao desenvolver um device driver, devemos procurar explorar ao máximo as ferramentas fornecidas pelo sistena. O kernel apenas estabelece as operações e o device driver é a implementação em si. O Linux utiliza amplamente a abstração envolvida nos device drivers, e permite que os mesmo sejam carregados em tempo de execução. No Linux, device driver geralmente possui um nível privilegiado de acesso, sendo executado no kernel space. Em geral, muitos device drivers são construídos na forma de módulos para o kernel(kernel modules), o que facilita sensivelmente a tarefa de gerenciamento, pois esses módulos funcionam como se fossem parte do kernel.

Requisitos: O que é desejável de um device-driver?

Em um device driver as aplicações no espaço do usuário devem ser capazes de controlar todas as funcionalidades do dispositivo em questão e também devem poder determinar o estado do dispositivo de forma síncrona. O device driver também pode especificar e definir a freqüência de funcionamento do dispositivo. Também é importante que o programa seja robusto, absorvendo problemas de corrida que podem acontecer. Em um device driver devemos ter funções de inicialização e de finalização, assim como chamadas de leitura e escrita que possibilitem a comunicação indireta com os dispositivos.

Ferramentas: O que é necessário para poder desenvolver um device-driver no Linux?

Para desenvolver um Device Driver para o Linux, é necessário incialmente uma experiência em programação com Lingagem C. São importantes os conceitos de endereço de memória, de ponteiros e o uso em alocação dinâmica de memória. São utilizadas estruturas clássicas de dados, como linked lists e buffers. Também é importante o conhecimento de macros (pré-processador) e da sintaxe GNU Make. Além disso, é extremamente importante um conhecimento, mesmo que básico, do sistema operacional Linux. Como conhecer o ambiente de terminal, e como saber configurar e compilar o kernel. Também são utilizados kernel modules. Fora esses conhecimentos mais específicos, alguns conceitos gerais de sistemas operacionais também são fundamentais. Saber trabalhar com processos e threads. E ter conhecimento de chamadas de sistema, de compartilhamento de memória e de mult-tasking pode ser muito vantajoso para uma boa implementação.

Desenvolvimento: Descreva uma implementação de driver USB?

Em Linux, há um subsistema chamado de "The USB Core" com uma API específica para o suport de dispositivos USB. O USB Core possui rotinas comuns a todos os dispositivos USB. Estas funções podem ser agrupadas nas de API alta e baixa, como mostrado na figura abaixo:

usb.jpg

O framework de desenvolvimento USB em Linux fornece pontos de entrada e funções da API. Os dispositivos USB podem funcionar como mestres ou escravos. A escolha dos dois depende da funcionalidade do dispositivo e serve como parâmetro básico para o desenvolvedor do dispositivo.
O projetista do driver deve compreender que este deverá serguir os padrões estabelecidos pelo protocolo USB.

Instalação: Descreva como instalar um device-driver?

Primeiramente entre na página onde estão localizados os arquivos do driver. Então iremos compilar o driver, mas antes devemos ter certeza que as ferramentas para compilação deverão estar instaladas. Assim, execute o comando:
$ sudo apt-get install build-essential linux-headers-`uname -r`
Assim, para compilar, execute o comando:
$ make
Depois de compilado, podemos instalar:
$ sudo make install 
Agora, com o driver compilado, já estamos prontos para carregá-lo na memória. E para isso:

  1. modprobe “nome_do_módulo”

Por fim, para verificar se o módulo foi carregado corretamante, podemos utilizar:
$ lsmod

Testes: Como testar o device-driver?

Uma possível maneira de se testar device-drivers é a utilização de "stubs", que simulam o funcionamento dos dispositivos. Criam-se processos no sistema operacional de formar a gerar as interrupções por software, ao invés de serem geradas por hardware, como no caso dos dispositivos usb.

Referências.
http://www.vivaolinux.com.br/artigo/Instalando-drivers-no-Linux-Placa-wireless-Atheros-para-notebooks
http://pcworld.uol.com.br/dicas/2008/12/05/saiba-o-que-sao-e-como-instalar-drivers-em-um-sistema-com-linux/
http://pt.tech-faq.com/device-drivers.shtml&prev=hp
http://lwn.net/Kernel/LDD3/
http://www.adassumpcao.net/ILDD/pt

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License