Apprentissage du développement de pilotes Linux avec Raspberry Pi

13

Je voudrais écrire un pilote de périphérique Linux pour un périphérique matériel réel. Quels périphériques Raspberry Pi conviennent bien? Fondamentalement, j'ai besoin des éléments suivants:

  1. Elle doit être suffisamment petite pour un débutant (quelques mois tout au plus, mieux quelques semaines).

  2. La fiche technique doit être disponible. Au début, je pensais à l'adaptateur USB-Ethernet, mais il semble que sa fiche technique soit très limitée.

Des idées? Peut être quelque chose comme faire fonctionner la console série sur GPIO?

ivan
la source
2
Les pilotes Linux sont des modules du noyau, et techniquement, ils n'ont rien à voir avec le matériel du tout, donc la première chose que vous voulez essayer est probablement une interface de périphérique char - c'est-à-dire quelque chose qui fournit un fichier de périphérique char qui peut être lu et / ou écrit (un peu comme les trucs de proc) dans un but trivial.
goldilocks
J'ai fait tout cela, terminé des didacticiels et écrit des modules de noyau pour les pseudo-périphériques, ainsi que la lecture de livres sur le développement du noyau / pilote. Tout cela est bien, mais maintenant je veux travailler avec du vrai matériel ..
ivan
Greg KH a écrit cela il y a quelque temps (c'est peut-être un peu dépassé à certains égards): linuxjournal.com/article/7353 Il y a donc des périphériques USB avec des fiches de données publiques. Il a quelques conseils d'ingénierie inverse là-bas (je ne voudrais pas le faire avec quelque chose de trop compliqué). Trucs pour les broches GPIO Je suppose que cela fonctionne généralement en utilisant les pilotes I2C, etc. existants, mais vous pouvez simplement ignorer cela et faire quelque chose vous-même.
goldilocks

Réponses:

4

Il peut être difficile d'apprendre à écrire des pilotes lors de l'interfaçage avec des périphériques et / ou des bus compliqués. Pour cette raison, je recommanderais d'utiliser des périphériques simples et bien connus (en ignorant l'implémentation existante de leurs pilotes dans le noyau) comme les périphériques I²C / SPI qui sont généralement utilisés avec des microcontrôleurs. Par exemple, vous pouvez trouver n'importe quel appareil "pris en charge" par la communauté Arduino (ce qui signifie qu'il existe une bibliothèque / documentation pour cela) et essayer de l'utiliser avec RaspberryPi.

Si cela ne suffit pas ou si vous ne voulez pas acheter trop de matériel, vous pouvez en créer un vous-même. Procurez-vous simplement un microcontrôleur (comme atmega ou quelque chose comme ça), créez un programme pour qu'il devienne un périphérique, puis essayez de vous connecter avec des pilotes Linux. De cette façon, vous pouvez facilement créer des programmes qui émuleront différentes classes d'appareils. Et puisque vous écrirez vous-même votre "firmware", cela vous aidera à déboguer les problèmes.

Vous avez besoin de certaines compétences en programmation de microcontrôleur pour cela, mais il n'est pas difficile d'apprendre la programmation avec Arduino et je crois que ce sont des connaissances utiles pour le programmeur de pilotes de toute façon.

Krzysztof Adamski
la source
Que diriez-vous de mettre en œuvre la communication série dans le logiciel via des broches GPIO? Par exemple, connectez la série au PC et essayez au moins de sortir quelque chose sur la console. Est-ce viable?
ivan
@ivan: Je ne sais pas si j'ai bien compris. Si, par série, vous voulez dire UART / rs232 et par logiciel, vous voulez dire le bitbang, alors ce n'est pas possible en raison de contraintes de temps. Si, d'autre part, vous voulez dire (ré) implémenter un périphérique série Linux en utilisant le matériel RaspberryPi UART, alors c'est bien sûr faisable. Je crois que toutes les informations nécessaires sur ce matériel peuvent être trouvées dans le BCM2835 ARM Peripheralsdocument. Mais rappelez-vous que pour l'utiliser, vous devez d'abord désactiver le pilote existant dans le noyau.
Krzysztof Adamski
Merci, mais êtes-vous sûr de l'impossibilité de frapper des bits UART? J'ai trouvé ce lien: ganssle.com/articles/auart.htm donc il semble potentiellement faisable pour un faible débit en bauds et pour au moins n'implémenter qu'une partie d'envoi (ce qui est plus facile).
ivan
@ivan: Cet article ne semble pas concerner les systèmes avec des systèmes d'exploitation à usage général comme Linux. Dans UART, vous avez de véritables contraintes de temps strictes qui sont très difficiles à respecter sans système d'exploitation en temps réel. Cela étant dit, il peut être possible de le faire à faible débit, mais il peut ne pas être vraiment fiable.
Krzysztof Adamski
On dirait que vous avez raison: raspberrypi.stackexchange.com/questions/1987/… (mais il y a là une solution intéressante). Merci encore pour votre aide.
ivan
3

Personnellement, je commencerais par un appareil très simple, comme une ou plusieurs LED connectées directement aux broches GPIO.

Vous pouvez soit acheter un appareil prêt à être branché, soit câbler le vôtre.

La raison pour laquelle je suggère cela est que le débogage des pilotes est généralement beaucoup plus difficile qu'un programme normal, donc un simple défi pour commencer est utile, vous pouvez également utiliser ce code comme méthode de débogage pour des appareils plus complexes (statut à une broche GPIO à fixer à un oscilloscope) où le timing est important.

S'il est intéressant de noter qu'un pilote de noyau pour LedBorg est disponible ici , la source devrait être un exemple assez simple pour piloter des broches GPIO à intervalles réguliers.

PiBorg
la source
Salut @PiBorg. pouvez-vous dire quelques ressources qui m'aident à apprendre à coder un pilote simple pour un périphérique tel qu'une ou plusieurs LED connectées directement aux broches GPIO?
Sagar
0

Le "périphérique" le plus simple pour lequel vous pouvez écrire un pilote matériel (si le développement du pilote matériel est votre truc) peut également être aussi simple qu'une LED (j'ai ajouté des guillemets parce que techniquement une LED n'est pas un périphérique mais c'est toujours un morceau de comme l'a suggéré @PiBorg.

D'autres choix seraient des dispositifs / composants faciles à interfacer comme des photorésistances, des capteurs infrarouges passifs (court: PIR), des capteurs de température, des ventilateurs PC (de préférence un ventilateur à 4 fils qui vous permet non seulement de surveiller mais aussi de contrôler le RPM), matrices de points LED et ainsi de suite. Fondamentalement, ces appareils simples vous permettront d'avoir le minimum de matériel (de sorte que vous puissiez voir et toucher ce que vous avez réellement accompli) et en même temps, vous pouvez en apprendre davantage sur de nombreux sujets qui sont utilisés pour des appareils beaucoup plus complexes où la complexité vient principalement du protocole qu'ils utilisent.

Sachez également que vous n'avez pas besoin d'aller plus loin pour creuser dans les modules du noyau. Bien sûr, si vous voulez le faire, personne ne vous arrête. :)

Voici un exemple d'interfaçage d'un capteur infrarouge passif (je vais le tester bientôt lorsque mon PIR sera livré: 3). Vous pouvez prendre cela et commencer à creuser plus profondément dans le monde du noyau Linux afin de voir comment vous pouvez par exemple créer un pilote de noyau, qui fonctionne avec le PIR.

rbaleksandar
la source