Device Drivers em Linux Embarcado - Uma aplicação utilizando a Friendly ARM Mini 2440

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:

 

fig1

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.

 

fig2

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 

 

Blog Software Livre

Profile de Vinicius

Blog do Sergio Prado

Mini2440

Boa Webserver

https://github.com/priscila225/DeviceDrivers

 PDF do TCC

Originalmente publicado em: http://debuggingcode.blogspot.com.br/2011/08/device-drivers-em-linux-embarcado.html

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Priscila Apocalypse
Priscila Pereira Apocalypse é formada em Engenharia da computação no Inatel - Instituto Nacional de Telecomunicações (Julho de 2011). Trabalha atualmente com desenvolvimento de Android applications/services na área de mobile solutions, tem interesse em diversos assuntos no mundo dos embarcados. Aproveita seu tempo livre para criar tutoriais e postar novidades dentro da área.

5
Deixe um comentário

avatar
 
4 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
Francisco Erivaldo Fernandes JuniorWillian HenriqueAndre TenorioHenrique RossiNeuber Jose de Sousa Sousa Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Neuber Jose de Sousa Sousa
Visitante
neuber jose sousa

Onde acho código?

Henrique Rossi
Visitante

Olá Neuber,

A Priscila disponibilizou o projeto em https://github.com/priscila225/DeviceDrivers. Precisa de algo mais?

Abraços

Francisco Erivaldo Fernandes Junior
Visitante
Erivaldo Junior

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.

Willian Henrique
Visitante
Willian Henrique

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 »

Andre Tenorio
Visitante
( André Tenório )

Muito legal mesmo! Uso as mesmas fontes de pesquisa que você Priscila... fazem parte do meu dia a dia!
Abs!