Apprendimento dello sviluppo di driver Linux con Raspberry Pi


13

Vorrei scrivere un driver di dispositivo Linux per qualche dispositivo hardware reale. Quali periferiche Raspberry Pi sono adatte? Fondamentalmente ho bisogno di quanto segue:

  1. Deve essere abbastanza piccolo per un principiante (pochi mesi al massimo, poche settimane migliori).

  2. La scheda tecnica deve essere disponibile. All'inizio stavo pensando all'adattatore USB-Ethernet, ma sembra che abbia un foglio dati molto limitato.

Qualche idea? Potrebbe essere qualcosa come far funzionare la console seriale su GPIO?


2
I driver Linux sono moduli del kernel e tecnicamente non hanno assolutamente nulla a che fare con l'hardware, quindi la prima cosa che vuoi provare è probabilmente un'interfaccia del dispositivo char - cioè qualcosa che fornisce un file del dispositivo char che può essere letto e / o scritto su (in modo molto simile al materiale in proc) per scopi banali.
Riccioli d'oro

Ho fatto tutto ciò, completato tutorial e scritto moduli kernel per pseudo-dispositivi, insieme a leggere libri sullo sviluppo di kernel / driver. Va tutto bene, ma ora voglio lavorare con hardware reale ..
Ivan

Greg KH ha scritto questo un po 'di tempo fa (forse per alcuni aspetti è leggermente obsoleto): linuxjournal.com/article/7353 Quindi ci sono dispositivi USB con schede pubbliche in giro. Ha alcuni consigli di reverse engineering lì (non vorrei farlo con qualcosa di troppo complicato). Roba per i pin GPIO Immagino che generalmente funzionasse usando i driver I2C ecc. Esistenti, ma potresti semplicemente ignorarlo e fare qualcosa da solo.
Riccioli d'oro

Risposte:


4

Può essere difficile imparare a scrivere i driver quando si interfaccia con dispositivi complicati e / o bus complicati. Per questo motivo, consiglierei di utilizzare alcuni dispositivi semplici e ben noti (ignorando l'implementazione esistente dei loro driver nel kernel) come i dispositivi I²C / SPI che vengono solitamente utilizzati con i microcontrollori. Ad esempio, potresti trovare qualsiasi dispositivo "supportato" dalla community di Arduino (nel senso che esiste una libreria / documentazione per esso) e provare ad usarlo con RaspberryPi.

Se ciò non bastasse o non desideri acquistare troppi componenti hardware, puoi crearne uno tu stesso. Prendi un microcontrollore (come atmega o qualcosa del genere), crea un programma affinché diventi un dispositivo e quindi prova a interfacciarlo con i driver Linux. In questo modo è possibile creare facilmente programmi che emuleranno diverse classi di dispositivi. E poiché scriverai il tuo "firmware" da solo, ti aiuterà a eseguire il debug dei problemi.

Per questo sono necessarie alcune capacità di programmazione del microcontrollore, ma non è difficile imparare a programmare con Arduino e credo che sia comunque utile per i programmatori di driver.


Che ne dici di implementare la comunicazione seriale nel software tramite pin GPIO? Ad esempio, collegare seriale al PC e provare almeno a inviare qualcosa alla console. È praticabile?
Ivan

@ivan: non sono sicuro di aver capito bene. Se per seriale si intende UART / rs232 e per software si intende il bitbanging, non è possibile a causa di vincoli di temporizzazione. Se, d'altra parte, vuoi dire (ri) implementare un dispositivo seriale Linux usando l'hardware UART RaspberryPi, allora è ovviamente fattibile. Credo che tutte le informazioni necessarie su questo hardware possano essere trovate nel BCM2835 ARM Peripheralsdocumento. Ma ricorda che per usarlo, devi prima disabilitare il driver esistente nel kernel.
Krzysztof Adamski,

Grazie, ma sei sicuro dell'impossibilità di UART bit-banging? Ho trovato questo link: ganssle.com/articles/auart.htm, quindi sembra potenzialmente fattibile per una bassa velocità di trasmissione e almeno per l'implementazione della parte di invio (che è più semplice).
Ivan

@ivan: questo articolo non sembra riguardare sistemi con sistemi operativi generici come Linux. In UART hai vincoli di tempismo molto rigidi che sono molto difficili da incontrare senza sistema operativo in tempo reale. Detto questo, potrebbe essere possibile farlo a basso baudrate ma potrebbe non essere davvero affidabile.
Krzysztof Adamski il

Sembra che tu abbia ragione: raspberrypi.stackexchange.com/questions/1987/… (comunque c'è una soluzione interessante lì). Grazie ancora per il vostro aiuto.
Ivan

3

Personalmente vorrei iniziare con un dispositivo molto semplice, come uno o più LED collegati direttamente ai pin GPIO.

Puoi acquistare un dispositivo pronto per il collegamento o cablare il tuo.

Il motivo per cui suggerirei questo è che il debug dei driver è generalmente molto più difficile di un normale programma, quindi una semplice sfida per iniziare è utile, inoltre puoi usare quel codice come metodo di debug per dispositivi più complessi (stato un pin GPIO da collegare a un oscilloscopio) dove il tempismo è importante.

Se è di interesse ci sia un driver kernel per LedBorg disponibili qui , questa dovrebbe essere ragionevolmente semplice esempio per la guida pin GPIO ad intervalli regolari.


Ciao @PiBorg. puoi dire alcune risorse che mi aiutano a imparare a codificare un semplice driver per un dispositivo come uno o più LED collegati direttamente ai pin GPIO?
Sagar,

0

Il "dispositivo" più semplice per cui puoi scrivere un driver hardware (se lo sviluppo del driver hardware è la tua cosa) può anche essere semplice come un LED (ho aggiunto le virgolette perché tecnicamente un LED non è un dispositivo ma è ancora un pezzo di hardware) come ha suggerito @PiBorg.

Altre opzioni potrebbero essere alcuni dispositivi / componenti di facile interfaccia come fotoresistori, sensori a infrarossi passivi (corto: PIR), sensori di temperatura, ventole per PC (preferibilmente una ventola a 4 fili che consente non solo di monitorare ma anche di controllare il RPM), matrici di punti LED e così via. Fondamentalmente tali dispositivi semplici ti permetteranno di avere il minimo sull'hardware (in modo da poter vedere e toccare ciò che hai effettivamente realizzato) e allo stesso tempo puoi imparare molti argomenti che vengono utilizzati per dispositivi molto più complessi in cui la complessità deriva principalmente dal protocollo che usano.

Ricorda anche che non è necessario fare il possibile per scavare nei moduli del kernel. Ovviamente se vuoi farlo, nessuno ti sta fermando. :)

Ecco un esempio di interfacciamento di un sensore a infrarossi passivo (lo testerò presto alla consegna del mio PIR: 3). Puoi prenderlo e iniziare a scavare più a fondo nel mondo del kernel Linux per vedere come, ad esempio, puoi creare un driver del kernel, che funziona con il PIR.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.