Há alguns anos apresentei o tão esperado trabalho de conclusão de curso, onde tive a felicidade de poder escolher o tema que desejava. Eu escolhi na ocasião Device Drivers em Linux Embarcado. O desafio estava lançado. A ideia era conseguir explicar o que são device drivers, porém voltado para um projeto prático colocando todos os detalhes de implementação neste documento.
Bibliografia
Como já não é novidade, a maioria dos materiais que encontramos sobre device drivers é em inglês, bem como a maioria dos livros que abordam especificamente esse tema. Somente alguns artigos na internet e alguns sites e blogs contêm alguma informação útil e válida para um projeto maior. Hoje em dia temos o site Embarcados como uma das grandes referências no assunto no Brasil. O Blog do Software Livre também é referência nesse assunto e Vinicius, um dos responsáveis pelo site, colabora com o Embarcados. Além disso, na época do TCC utilizei diversas informações retiradas principalmente do site do Sergio Prado, grande fonte de informação sobre esse tema já há alguns anos. Como o projeto é uma monografia, devíamos evitar ao máximo sites. No meu caso eu utilizei somente sites referentes às especificações da placa que nós utilizamos e ao webserver.
Teoria
Primeiramente o desafio foi: Como abordar tal tema de uma forma que qualquer leitor entenda? Não é uma tarefa simples. Deveria seguir uma linha lógica de tópicos até chegar onde queria. No caso desse tema, primeiramente, a ideia foi especificar seus métodos de funcionamento, como é a estrutura básica de um device driver, a maneira que ele interage com o sistema (kernel space/user space), dentre outras características importantes para entendermos a parte prática.
Projeto Prático
O projeto prático foi feito da seguinte forma, com a ajuda do meu colega Ramon Chaib. Nós escolhemos o kit Friendly ARM Mini 2440, onde decidimos fazer um device driver para a porta GPIO, como podemos ver na figura abaixo:
Figura 1: Friendly ARM Mini 2440
O que esta porta irá controlar? Motores (carro)! Foi aí que a ideia se concretizou, e a batizamos de PorscheARM. A ideia era o seguinte: Controlar o carro via browser, ou seja, nós teríamos um webserver embarcado nesta placa. Portanto, tinha que ser utilizado um webserver que fosse pequeno e eficiente, o que nos direcionou para o uso do Boa webserver. O sistema que utilizamos foi baseado no Linux 2.6, baixado o último kernel do próprio site da ARM. Para mostrar didaticamente o funcionamento de um device driver criamos um device node para cada direção direita, esquerda, pra baixo e pra cima. A página web, feita em CGI, enviava os comandos para o device driver que controlava os motores. O fluxo era WEB -> DEVICE -> Motores. Veja abaixo fotos do projeto.
Figura 2: Carrinho
Utilizando o acelerômetro do iPhone como controle
Com o intuito de aprimorar mais o sistema, foi feito um código em javascript que capturava a posição X,Y,Z da tela do iPhone e enviava para o nosso webserver. Com isso, através do device driver instalado no carrinho, era realizada a comunicação com os motores, os quais assumiam suas direções conforme orientação do celular. Note que não observamos nenhum atraso com este teste.
Testes
Os testes do projeto foram feitos e filmados pelo Ramon Chaib, e podemos ver um deles no vídeo abaixo:
Para mais detalhes
Estou disponibilizando aqui o trabalho completo desse projeto, teoria e prática, onde os códigos fontes estão disponíveis no arquivo TCC_DeviceDrivers.pdf ou nos arquivos do github. Acesse o PDF em aqui.
Espero ter ajudado alguém com este post. É uma área na qual tenho muito interesse. Estou sempre disposta a compartilhar conhecimento sobre isto e espero que vocês compartilhem também! =)
Referências
Originalmente publicado em: https://debuggingcode.blogspot.com.br/2011/08/device-drivers-em-linux-embarcado.html







Saudações Priscila,
Vi que você possui uma placa FriendlyARM. Você já tentou instalar uma distribuição Linux custom nessa placa? Possuo uma placa Mini210S e gostaria de instalar um linux com um sistema de compilação mais completo, pretendo compilar o ROS nessa placa.
Bom tarde Priscila, Primeiramente parabéns pelo trabalho, ficou muito legal. Estou estudando um pouco de device driver resolvi dar uma fuçada no seu código para apreender melhor e então me surgiu uma dúvida, no datasheet do processador o endereço dos dados do port G é 0x56000054 (GPFDAT 0x56000054 Port G data) e no seu código você utiliza 0xFB000050 (GPF_BASE 0xFB000050), porque há essa diferença? Vi no seu trabalho que cita que este endereço é virtual (não seria mais o endereço física) onde que esta especificado o endereço virtual? normalmente eu utilizo a função ioremap para tornar o endereço virtual, tem… Leia mais »
Muito legal mesmo! Uso as mesmas fontes de pesquisa que você Priscila… fazem parte do meu dia a dia!
Abs!
Onde acho código?
Olá Neuber,
A Priscila disponibilizou o projeto em https://github.com/priscila225/DeviceDrivers. Precisa de algo mais?
Abraços