Embox RTOS sur Raspberry Pi

imagesalut!

On nous demande souvent si Embox prend en charge Raspberry Pi. Oui il y a. Description de comment exécuter maintenant ici . Dans cet article, je veux en parler un peu plus.

Nous avions acheté la carte Raspberry Pi Model B rev 2.0 depuis longtemps (c'est le premier Rpi 1) et avons même fait les premiers pas dans le portage: l'UART, le contrôleur d'interruption, le minuteur et même le framebuffer ont été implémentés sous une forme ou une autre. Mais les données sur la façon de le démarrer ont été perdues, j'ai donc dû me souvenir / comprendre à nouveau.

Tout d'abord, ils ont lancé l'émulateur QEMU. QEMU standard prend en charge la machine raspi2, mais pas de raspi. Mais quand il y avait un processus de portage, seule la prise en charge de raspi était ajoutée. Nous avons toujours la version dans notre référentiel, même si nous avons dû rédiger des commits pour la compiler dans l'environnement moderne, mais à la fin nous avons obtenu une version de l'émulateur QEMU qui prend en charge rpi1 - la machine «-M raspi» (vous pouvez voir comment l'exécuter sur notre wiki) En conséquence, Embox a été lancé là-bas et a dessiné un dégradé dans la mémoire vidéo.

Il y avait une question à propos de commencer avec du fer. Comment démarrer n'était pas clair au début, nous avons donc décidé d'essayer le Raspbian standard. 2020-02-13-raspbian-buster-lite.img est téléchargé sur le site officiel . Tous les téléchargements se produisent à partir d'une carte microSD, nous la préparons donc - copiez l'image résultante
dd bs=4M if=2020-02-13-raspbian-buster-lite.img of=/dev/sdb conv=fsync
où «/ dev / sdb» est la carte SD.

Si vous regardez lsblk maintenant, il y aura quelque chose comme ceci:


sdb      8:16   1  14,6G  0 disk 
├─sdb1   8:17   1   256M  0 part 
└─sdb2   8:18   1  14,3G  0 part

Montons sdb1 et voyons ce qui s'y trouve:


$ sudo mount /dev/sdb1 /mnt
$ ls /mnt/
bcm2708-rpi-b.dtb       bcm2710-rpi-3-b.dtb       COPYING.linux  fixup_db.dat      start_db.elf
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-3-b-plus.dtb  fixup4cd.dat   fixup_x.dat       start.elf
bcm2708-rpi-cm.dtb      bcm2710-rpi-cm3.dtb       fixup4.dat     issue.txt         start_x.elf
bcm2708-rpi-zero.dtb    bcm2711-rpi-4-b.dtb       fixup4db.dat   kernel.img
bcm2708-rpi-zero-w.dtb  bootcode.bin              fixup4x.dat    LICENCE.broadcom
bcm2709-rpi-2-b.dtb     cmdline.txt               fixup_cd.dat   overlays
bcm2710-rpi-2-b.dtb     config.txt                fixup.dat      start_cd.elf

Comme vous pouvez le voir, il existe tout un ensemble de * .dtb pour toutes les occasions - pour différentes versions de Raspberry. Nous voyons également le chargeur de démarrage - bootcode.bin, et kernel.img est Linux.

Nous avons connecté le moniteur via HDMI à la carte, démarré, vu Raspbian, tout va bien. Ensuite, nous devons copier notre binaire avec Embox dans kernel.img afin que le chargeur de démarrage le charge.
Construire Embox:


make confload-arm/rpi1-model-b
make

Copiez le binaire résultant:


cp build/base/bin/embox.bin /mnt/kernel.img

Nous réinsérons la carte SD dans Rpi et allumons le moniteur - le carré qui aurait dû être tracé par l'Embox n'apparaissait pas. Eh bien, essayons de nous connecter via le port série et de déboguer notre binaire. Pour ce faire, utilisez l'adaptateur RDC1-USB-UART. Nous le connectons à la carte comme suit:


RDC1      Rapi

GND <---> GND
5V  <---> 5V
RX  <---> TXD0/GPIO14
TX  <---> RXD0/GPIO15

Ici, vous pouvez voir le brochage sur l'image afin qu'il soit pardonné. Il s'avère maintenant que l'alimentation de l'adaptateur USB provient du concentrateur USB du PC et que l'alimentation du Rpi, à son tour, est fournie par l'adaptateur USB.



Allumer. Connectez-vous via minicom:


sudo minicom -d /dev/ttyUSB0

Aucune conclusion n'est visible. Il doit y avoir une sorte de problème avec le pilote du port série. Nous essayons de désactiver l'initialisation du registre et utilisons ce qui a été configuré par le chargeur de démarrage, remplissons une nouvelle image sur la carte SD - la sortie est apparue. Tout est clair, cela signifie qu'il était correctement connecté, mais le pilote du port série n'est pas programmable correctement. Je ne parlerai pas de la façon dont nous avons réparé le pilote du port série PL011, mais je noterai quelques points qui peuvent être utiles lors du développement de cette plate-forme. Premièrement, les adresses de base sur Rpi sont calculées de manière confuse, elles ne peuvent pas être trouvées immédiatement dans la documentation, donc un bon moyen de vérifier l'adresse de base des registres est de les regarder sous Linux:


pi@raspberrypi:~$ ls /sys/bus/amba/devices/20201000.serial

Nous voyons que l'adresse est 0x20201000.

Le deuxième point est qu'il y a Linux modifié pour Rpi, qui peut être assemblé et copié dans kernel.img - www.raspberrypi.org/documentation/linux/kernel/building.md

Dans le cas du port série, cela a vraiment aidé à comprendre la fréquence d'entrée UARTCLK, nécessaire pour programmer la vitesse de transmission - insérez simplement printk () au bon endroit dans les pilotes / tty / serial / amba-pl011.c.

En conséquence, sans aucun changement significatif, nous avons réussi à lancer la même image que pour QEMU sur le fer.

C'est probablement tout, car cela n'a aucun sens de démonter les sources du pilote, car vous pouvez simplement les étudier dans notre référentiel. En général, il semble que sous Raspberry, il existe très peu de ports d'autres systèmes d'exploitation non Linux. Par exemple, je n'ai trouvé ni FreeRTOS (il s'est avéré qu'une sorte de référentiel se trouve sur GitHub, mais pas dans les versions officielles), ni pour NuttX, ni rien de ce genre. Oui, et les discussions sur les forums suggèrent que RTOS n'est censé pas être nécessaire là-bas et qu'il vaut mieux jouer à Arduino - www.raspberrypi.org/forums/viewtopic.php?t=201540 L'

exemple Osdev s'est avéré être inopérant, donc si quelqu'un veut quelque chose - faites-le sur du métal nu, puis voyez de meilleurs exemples de notre part :)

Le support complet du nouveau Rpi 2/3/4 est toujours dans nos plans. Mais un certain soutien sera très probablement fourni dans le cadre du GSoC 2020, l'une des idées les plus populaires parmi les étudiants. En fait, pour GSoC, nous avons restauré le support Rpi1 dans Embox. Si quelqu'un réfléchit à la raison pour laquelle il a besoin de Rpi RTOS, écrivez dans les commentaires, nous serons heureux :)

De plus, si vous étudiez les sources de RaPi ou tout simplement Embox, nous serons heureux de répondre aux questions:
Newsletter: embox-ru@googlegroups.com
Chat télégramme: t.me/embox_chat

All Articles