Aprendendo o desenvolvimento de drivers Linux com Raspberry Pi

13

Eu gostaria de escrever um driver de dispositivo Linux para algum dispositivo de hardware real. Quais periféricos do Raspberry Pi são adequados? Basicamente, preciso do seguinte:

  1. Deve ser pequeno o suficiente para um iniciante (alguns meses no máximo, semanas melhores).

  2. A folha de dados deve estar disponível. No começo, eu estava pensando no adaptador USB-Ethernet, mas parece que ele tem uma folha de dados muito limitada.

Alguma ideia? Pode ser algo como fazer o console serial funcionar em GPIO?

ivan
fonte
2
Os drivers do Linux são módulos do kernel e, tecnicamente, eles não têm nada a ver com hardware, então a primeira coisa que você quer tentar é provavelmente uma interface de dispositivo char - ou seja, algo que forneça um arquivo de dispositivo char que possa ser lido e / ou escrito para (bem como as coisas em proc) para algum propósito trivial.
goldilocks
Fiz tudo isso, concluí os tutoriais e escrevi módulos do kernel para pseudo-dispositivos, além de ler livros sobre o desenvolvimento do kernel / driver. Isso tudo é bom, mas agora eu quero trabalhar com hardware real ..
ivan
Greg KH escreveu isso há algum tempo (talvez seja um pouco desatualizado em alguns aspectos): linuxjournal.com/article/7353 Portanto, existem dispositivos USB com folhas de dados públicas por perto. Ele tem algumas dicas de engenharia reversa lá (eu não gostaria de fazer isso com algo muito complicado). Coisas para os pinos GPIO Eu acho que geralmente funcionam usando os drivers I2C etc. existentes, mas você pode simplesmente ignorar isso e fazer alguma coisa sozinho.
goldilocks

Respostas:

4

Pode ser difícil aprender a escrever drivers ao interagir com dispositivos complicados e / ou barramentos complicados. Por isso, eu recomendaria o uso de alguns dispositivos simples e conhecidos (ignorando a implementação existente de seus drivers no kernel), como dispositivos I²C / SPI que geralmente são usados ​​com microcontroladores. Por exemplo, você pode encontrar qualquer dispositivo "suportado" pela comunidade Arduino (o que significa que há uma biblioteca / documentação para ele) e tentar usá-lo com o RaspberryPi.

Se isso não for suficiente ou você não quiser comprar muito hardware, você mesmo pode criar um. Basta adquirir um microcontrolador (como o atmega ou algo assim), criar um programa para que ele se torne um dispositivo e tente fazer interface com ele usando drivers do Linux. Dessa forma, você pode criar facilmente programas que emularão diferentes classes de dispositivos. E como você mesmo escreverá o seu "firmware", ele ajudará a depurar problemas.

Você precisa de algumas habilidades de programação de microcontroladores para isso, mas não é difícil aprender a programar com o Arduino e acredito que seja útil para o programador de drivers.

Krzysztof Adamski
fonte
Que tal implementar a comunicação serial em software via pinos GPIO? Por exemplo, conecte serial ao PC e tente pelo menos produzir algo para o console. Isso é viável?
ivan
@ivan: Não sei se entendi direito. Se, por série, você quer dizer UART / rs232 e por software, você quer dizer bitbanging, isso não é possível devido a restrições de tempo. Se, por outro lado, você quer dizer (re) implementar o dispositivo serial Linux usando o hardware RaspberryPi UART, é claro que é possível. Acredito que todas as informações necessárias sobre esse hardware podem ser encontradas no BCM2835 ARM Peripheralsdocumento. Mas lembre-se de que, para usá-lo, primeiro você precisa desativar o driver existente no kernel.
precisa saber é o seguinte
Obrigado, mas você tem certeza da impossibilidade de UART? Encontrei este link: ganssle.com/articles/auart.htm, portanto parece potencialmente viável para baixa taxa de transmissão e pelo menos apenas para implementar a parte de envio (o que é mais fácil).
ivan
@ivan: Este artigo não parece ser sobre sistemas com sistemas operacionais de uso geral como o Linux. No UART, você tem restrições de tempo estritas reais que são muito difíceis de encontrar sem o sistema operacional em tempo real. Dito isto, pode ser possível fazê-lo em baixa taxa de transmissão, mas pode não ser realmente confiável.
Krzysztof Adamski
Parece que você está certo: raspberrypi.stackexchange.com/questions/1987/… (no entanto, há uma solução interessante lá). Obrigado novamente por sua ajuda.
ivan
3

Pessoalmente, eu começaria com um dispositivo muito simples, como um ou mais LEDs conectados diretamente aos pinos GPIO.

Você pode comprar um dispositivo pronto para conectar ou conectar o seu próprio.

A razão pela qual eu sugeriria isso é que os drivers de depuração geralmente são muito mais difíceis do que um programa normal; portanto, um simples desafio para começar é útil; também é possível usar esse código como um método de depuração para dispositivos mais complexos. um pino GPIO para conectar a um osciloscópio) onde o tempo é importante.

Se for interessante que exista um driver de kernel para o LedBorg disponível aqui , a fonte deve ser um exemplo razoavelmente simples para acionar pinos GPIO em intervalos regulares.

PiBorg
fonte
Olá @PiBorg. você pode contar alguns recursos que me ajudaram a aprender a codificar um driver simples para um dispositivo como um ou mais LEDs conectados diretamente aos pinos GPIO?
Sagar
0

O "dispositivo" mais simples para o qual você pode escrever um driver de hardware (se o desenvolvimento do driver de hardware é seu) também pode ser tão simples quanto um LED (eu adicionei as aspas porque tecnicamente um LED não é um dispositivo, mas ainda é um pedaço de hardware) como o @PiBorg sugeriu.

Outras opções seriam alguns dispositivos / componentes de fácil interface, como fotorresistores, sensores infravermelhos passivos (curto: PIR), sensores de temperatura, ventiladores de PC (de preferência um ventilador de 4 fios que permite não apenas monitorar, mas também controlar o RPM), matrizes de pontos de LED e assim por diante. Basicamente, esses dispositivos simples permitem que você tenha o mínimo de hardware (para que você possa ver e tocar o que realmente conseguiu) e, ao mesmo tempo, pode aprender sobre muitos tópicos usados ​​para dispositivos muito mais complexos, onde a complexidade vem principalmente do protocolo que eles usam.

Lembre-se também de que você não precisa se esforçar muito para cavar nos módulos do kernel. É claro que se você quiser fazer isso, ninguém está parando você. :)

Aqui está um exemplo de interface de um sensor infravermelho passivo (vou testá-lo em breve quando meu PIR for entregue: 3). Você pode pegar isso e começar a se aprofundar no mundo do kernel do Linux para ver como, por exemplo, criar um driver do kernel, que funciona com o PIR.

rbaleksandar
fonte