Embos RTOS no Raspberry Pi

imagemOlá!

Muitas vezes nos perguntam se a Embox suporta Raspberry Pi. Sim existe. Descrição de como executar agora aqui . Neste artigo, quero falar um pouco mais sobre isso.

Nós compramos a placa Raspberry Pi Modelo B rev 2.0 por um longo tempo (este é o primeiro Rpi 1) e até demos os primeiros passos na portabilidade: o UART, o controlador de interrupção, o temporizador e até o framebuffer foram implementados de alguma forma. Mas os dados sobre como iniciá-lo foram perdidos, então tive que lembrar / entender novamente.

Primeiro, eles foram lançados no emulador QEMU. O QEMU regular possui suporte a máquina raspi2, mas não raspi. Mas quando houve um processo de portabilidade, apenas o suporte ao raspi foi adicionado. Ainda temos a versão em nosso repositório, embora tenhamos que redigir commits para compilá-la no ambiente moderno, mas no final obtivemos uma versão do emulador QEMU que tem suporte para rpi1 - a máquina “-M raspi” (você pode ver como executá-la em nosso wiki)) Como resultado, a Embox foi lançada lá e desenhou um gradiente na memória de vídeo.

Havia uma pergunta sobre começar com ferro. Como inicializar não estava claro no começo, então decidimos experimentar o Raspbian padrão. 2020-02-13-raspbian-buster-lite.img é baixado do site oficial . Todos os downloads ocorrem a partir de um cartão microSD, então nós o preparamos - copie a imagem resultante
dd bs=4M if=2020-02-13-raspbian-buster-lite.img of=/dev/sdb conv=fsync
onde “/ dev / sdb” é o cartão SD.

Se você olhar para lsblk agora, haverá algo como isto:


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

Vamos montar o sdb1 e ver o que está lá:


$ 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

Como você pode ver, existe todo um conjunto de * .dtb para todas as ocasiões - para diferentes versões do Raspberry. Também vemos o carregador de inicialização - bootcode.bin, e o kernel.img é o Linux.

Conectamos o monitor via HDMI à placa, inicializamos, vi Raspbian, está tudo bem. Em seguida, precisamos copiar nosso binário com o Embox no kernel.img para que o carregador de inicialização o carregue.
Crie Embox:


make confload-arm/rpi1-model-b
make

Copie o binário resultante:


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

Nós inserimos o cartão SD novamente no Rpi e ligamos o monitor - o quadrado que deveria ter sido desenhado pela Embox não apareceu. Bem, vamos tentar conectar via porta serial e depurar nosso binário. Para fazer isso, use o adaptador RDC1-USB-UART. Nós o conectamos à placa da seguinte maneira:


RDC1      Rapi

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

Aqui você pode ver a pinagem na imagem para que ela seja perdoada. Agora, verifica-se que a energia do adaptador USB vem do hub USB do PC, e a energia do Rpi, por sua vez, é fornecida pelo adaptador USB.



Ligar. Conecte-se via minicom:


sudo minicom -d /dev/ttyUSB0

Nenhuma conclusão é visível. Deve haver algum tipo de problema com o driver da porta serial. Tentamos desativar a inicialização do registro e, usando o que foi configurado pelo carregador de inicialização, preenche uma nova imagem no cartão SD - a saída apareceu. Tudo está claro, significa que foi conectado corretamente, mas o driver da porta serial não é programável corretamente. Não falarei sobre como reparamos o driver da porta serial PL011, mas observarei alguns pontos que podem ser úteis ao desenvolver para esta plataforma. Primeiramente, os endereços base no Rpi são computados de alguma maneira confusos, eles não podem ser encontrados imediatamente na documentação, portanto, uma boa maneira de verificar o endereço base dos registradores é observá-los no Linux:


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

Vemos que o endereço é 0x20201000.

O segundo ponto é que não há Linux modificado para RPI, que pode ser montado e copiados para kernel.img - www.raspberrypi.org/documentation/linux/kernel/building.md

No caso da porta serial, ele realmente ajudou a compreender a frequência de entrada UARTCLK, necessário para programar a taxa de transmissão - basta inserir printk () no lugar certo em drivers / tty / serial / amba-pl011.c.

Como resultado, sem alterações significativas, conseguimos lançar a mesma imagem do QEMU no ferro.

Provavelmente é tudo, pois não faz sentido desmontar as fontes de driver, porque você pode apenas estudá-las em nosso repositório. Em geral, parece que no Raspberry existem muito poucas portas de outros sistemas operacionais não Linux. Por exemplo, eu não encontrei o FreeRTOS (verificou-se que algum tipo de repositório está no GitHub, mas não em versões oficiais), nem no NuttX, nem em algo assim. Sim, e as discussões nos fóruns sugerem que o RTOS supostamente não é necessário lá e é melhor jogar o Arduino - www.raspberrypi.org/forums/viewtopic.php?t=201540 O

exemplo do Osdev acabou por ser inoperante, por isso, se alguém quiser algo- em seguida, faça-o no bare metal, e veja exemplos melhores de nós :)

O suporte total para o novo Rpi 2/3/4 ainda está em nossos planos. Mas é provável que algum apoio seja fornecido como parte do GSoC 2020, uma das idéias mais populares entre os estudantes. Na verdade, para o GSoC, restauramos o suporte ao Rpi1 na Embox. Se alguém pensar sobre o porquê de precisar do Rpi RTOS, escreva nos comentários, ficaremos felizes :)

Além disso, se você estudar as fontes do RaPi ou apenas da Embox, teremos o maior prazer em responder às perguntas:
Newsletter: embox-ru@googlegroups.com
Bate-papo por telegrama: t.me/embox_chat

All Articles