Então você adquiriu um OrangePi? Hora de colocar ele para funcionar com alguma coisa que não seja Linux por… razões. Não é meu problema.

Eu sei minhas razões, foi por simples vontade de usar algo diferente do sistema operacional que trabalho faz anos. E que seja compilado pelo fonte, afinal ir ao http://www.armbsd.org/arm/ é fácil demais. Tem de aprender como é feito, vai ser útil na sua vida algum dia.

Sem delongas, vamos agora para a prática.

Conseguir os fontes

Primeiro, instale um cliente de CVS, não irei entrar em detalhes. És usuário de Ubuntu? apt install cvs. Gentoo? emerge –ask -v dev-vcs/cvs.

Feito isto, escolha uma pasta para seu NetBSD. Irei chamar a minha de NetBSD_9 e estará em ~/Projects/Personal/NetBSD_9 no meu sistema. Ao curso do tutorial, altere esse caminho para a pasta de sua escolha.

Ela irá conter os fontes dos dois repositório que serão necessários. Entre nesta pasta e siga a sequencia de comandos abaixo:

export CVS_RSH=ssh
cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot co -r netbsd-9-2-RELEASE -P src
cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot co -r netbsd-9-2-RELEASE -P xsrc

Ao final, terá duas pasta, uma src e outra xsrc.

Compilar a imagem

Infelizmente, o NetBSD 9.2 está usando usa compilador de DeviceTree que falha o build com GCC acima da versão 10.

Entre em sua pasta src, e abra usando seu editor de texto favorito o seguinte arquivo: ./external/gpl2/dtc/dist/dtc-lexer.l

Altere a linha 43 para o seguinte: extern YYLTYPE yylloc;

Salve e feche o arquivo.

Ainda na pasta src, digite o seguinte comando para baixar as ferramentas de cross-compilação, iremos usar a pasta “obj” que irá residir no mesmo nível da usr dentro de nossa pasta de projeto “NetBSD_9”:

(o argumento -j é número de processos em paralelo, use o número de núcleos do seu processador)

./build.sh -U -u -O ../obj.earmv7hf  -j10 -m evbarm -a earmv7hf tools

Feito esse passo, copie os dados do sumário final, serão necessários para compilar pacotes do NetBSD em sua maquina Linux. Duas informações são de especial importância, o DESTDIS e o TOOLDIR.

===> Tools built to /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/tooldir.Linux-5.15.11-gentoo-dist-x86_64
===> build.sh ended:      Fri Feb 11 16:50:47 -03 2022
===> Summary of results:
         build.sh command:    ./build.sh -U -u -O ../obj.earmv7hf -j10 -m evbarm -a earmv7hf tools
         build.sh started:    Fri Feb 11 16:45:41 -03 2022
         NetBSD version:      9.2
         MACHINE:             evbarm
         MACHINE_ARCH:        earmv7hf
         Build platform:      Linux 5.15.11-gentoo-dist x86_64
         HOST_SH:             /bin/sh
         No $TOOLDIR/bin/nbmake, needs building.
         Bootstrapping nbmake
         MAKECONF file:       /etc/mk.conf (File not found)
         TOOLDIR path:        /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/tooldir.Linux-5.15.11-gentoo-dist-x86_64
         DESTDIR path:        /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/destdir.evbarm
         RELEASEDIR path:     /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/releasedir
         Created /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/tooldir.Linux-5.15.11-gentoo-dist-x86_64/bin/nbmake
         Updated makewrapper: /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/tooldir.Linux-5.15.11-gentoo-dist-x86_64/bin/nbmake-evbarm
         Tools built to /home/fbugno/Projects/Personal/NetBSD_9/src/../obj.earmv7hf/tooldir.Linux-5.15.11-gentoo-dist-x86_64
         build.sh ended:      Fri Feb 11 16:50:47 -03 2022
===> .

Ao final terá em sua pasta obj tudo que é necessário para cross compilar um sistema NetBSD a partir de seus Linux.

Hora de partir para a compilar o sistema em si utilizando isto. Ainda dentro de sua pasta src, digite o comando:

./build.sh -U -u -O ../obj.earmv7hf  -j10 -m evbarm -a earmv7hf release

Este passo levará um tempo considerável dependendo da velocidade de seu sistema.

Agora hora de um passo adicional mas recomendável: X11 e parte gráfica. Mesmo que não vá utilizar, o fato é que para usar os ports do NetBSD (seja direto do fonte ou binários de aplicativos), muitos dependem dessas bibliotecas e aplicativos e assumem que eles estejam no sistema.

./build.sh -U -u -O ../obj.earmv7hf  -j10 -x -X ../xsrc -m evbarm -a earmv7hf release
cd ..

Hora de compilar o uboot para a OrangePi. Para isso iremos precisar das receitas do pkgsrc do NetBSD. Em sua pasta usr dentro da NetBSD_9.

Preparando o pkgsrc

O NetBSD faz uso de um sistema de pacotes multiplataforma chamado pkgsrc. Temos que preparar ele para uso em Linux.

Comece por pegar uma listagem de pacotes. Na época que este tutorial foi redigido era a 2021Q4.

cd ..
cvs -d anoncvs@anoncvs.NetBSD.org:/cvsroot co -r pkgsrc-2021Q4 -P pkgsrc

Então vá em pkgsrc/bootstrap e abra o arquivo bootstrap no nano ou outro editor de seu gosto. Adicione na linha 1304 o seguinte: –without-libb2

Ficará assim:

$shprog ./configure $configure_quiet_flags --enable-static --disable-shared \
--disable-bsdtar --disable-bsdcpio --disable-posix-regex-lib --disable-xattr \
--disable-maintainer-mode --disable-acl --without-zlib --without-bz2lib \
--without-iconv --without-lzma --without-lzo2 --without-lz4 --without-libb2 \
--without-nettle --without-openssl --without-xml2 --without-expat --without-zstd \

Salve, e execute o comando abaixo, o argumento prefix tem de ser absoluto invés de relativo (ou seja, não usar ../../):

./bootstrap --prefix ~/Projects/Personal/NetBSD_9/pkg --unprivileged --cwrappers no --workdir /tmp/bootwork

Ao final, ele emitirá a seguinte mensagem:

===========================================================================

Please remember to add /home/fbugno/Projects/Personal/NetBSD_9/pkg/bin to your PATH environment variable
and /home/fbugno/Projects/Personal/NetBSD_9/pkg/man to your MANPATH environment variable, if necessary.

An example mk.conf file with the settings you provided to "bootstrap"
has been created for you. It can be found in:

      /home/fbugno/Projects/Personal/NetBSD_9/pkg/etc/mk.conf

You can find extensive documentation of the NetBSD Packages Collection
in /home/fbugno/Projects/Personal/NetBSD_9/pkgsrc/doc/pkgsrc.txt.

Thank you for using pkgsrc!

===========================================================================

===> bootstrap started: qui 07 out 2021 23:24:21 -03
===> bootstrap ended:   qui 07 out 2021 23:27:05 -03

Seguindo o que foi pedido na mensagem, adicione o /home/fbugno/Projects/Personal/NetBSD_9/pkg/bin e sbin no PATH de seu ~/.bashrc:

export PATH=~/Projects/Personal/NetBSD_9/pkg/bin:~/Projects/Personal/NetBSD_9/pkg/sbin:$PATH

Feche e abra seu terminal novamente para o PATH ser aplicado, ou caso não queira essa mudança permanente, apenas digite na linha comando o export acima.

Veja se ele encontra o comando bmake agora:

fbugno@Wilhelm ~ $ bmake
bmake: no target to make.

bmake: stopped in /home/fbugno
fbugno@Wilhelm ~ $

Edite o arquivo ~/Projects/Personal/NetBSD_9/pkg/etc/mk.conf, comente a linha do “ABI” com um “#” e CFLAGS += -fcommon no arquivo:

#ABI=			64

CFLAGS += -fcommon

Compilando o uboot pra OrangePi Zero

Estamos prontos para cross compilar o uboot para o Orange Pi Zero!

Vá para a pasta do seu pkgsrc e e então em sysutils/u-boot-orangepi-zero, e então dê o seguinte comando para gerar um pacote para NetBSD. Nem tente usar cross compilação para isso pois parte do processo envolve compilar o GCC para armnone, e executar ele.

bmake package

Isto pode levar um tempo, pois todas as dependências também serão compiladas.

Se ele falhar com multiple definition of `yylloc’; scripts/dtc/dtc-lexer.lex.o: Abra o arquivo work/u-boot-2018.11/Makefile e adicione “-fcommon” no fim da lista do primeiro HOSTCFLAGS que achar. Então tem compilar novamente com bmake package

Isso se deve a muitas distribuições Linux já usarem GCC com versão superior a 10, onde -fno-common é o padrão, e isto dá problemas com DTC antigo. No futuro, o próprio DTC que vem com o pkgsrc pode ser atualizado com o ultimo upstream disponível onde a versão do compilador não é mais problema.

Após a compilação encerrar, ele lhe dará o caminho para um pacote que foi gerado.

=> Creating binary package /home/fbugno/Projects/Personal/NetBSD_9/pkgsrc/packages/All/u-boot-orangepi-zero-2018.11nb4.tgz

Instale ele em seu pkg com o commando

pkg_add /home/fbugno/Projects/Personal/NetBSD_9/pkgsrc/packages/All/u-boot-orangepi-zero-2018.11nb4.tgz

Agora ele foi instalado na pasta ~/Projects/Personal/NetBSD_9/pkg/share/u-boot/orangepi-zero. Ele é o bootloader de sua OrangePi Zero.

Fazer o flash da imagem em um SDCard

Supondo que tudo tenha dado certo até agora, você tem uma imagem do NetBSD pronta e um bootloader para sua OrangePi zero! Hora de testar. Copie a imagem do NetBSD e o u-boot-sunxi-with-spl.bin para sua pasta home.

cp ~/Projects/Personal/NetBSD_9/pkg/share/u-boot/orangepi-zero/u-boot-sunxi-with-spl.bin ~
cp /home/fbugno/Projects/Personal/NetBSD_9/obj.earmv7hf/releasedir/evbarm/binary/gzimg/armv7.img.gz ~

Com isto, o bootload e a imagem devem estar no mesmo local. Hora de copiá-los para um cartão SD, e usa-lo em sua OrangePi Zero.

Em meu PC Linux, o SD card é mapeado em /dev/sda. Veja em qual está eu seu sistema com o comando “dmesg” verificando as ultimas linhas.

[ 4045.924901] scsi 6:0:0:0: Direct-Access              SD Card Reader   1.00 PQ: 0 ANSI: 6
[ 4045.925410] sd 6:0:0:0: Attached scsi generic sg0 type 0
[ 4045.926277] sd 6:0:0:0: [sda] 31116288 512-byte logical blocks: (15.9 GB/14.8 GiB)
[ 4045.927062] sd 6:0:0:0: [sda] Write Protect is off

Agora transfira a imagem e o bootload para o sdcard com os seguintes comandos (talvez seja necessário usar sudo em sua máquina antes do comando dd):

gzip -df armv7.img.gz
dd if=./armv7.img of=/dev/sda bs=1M
dd if=./u-boot-sunxi-with-spl.bin of=/dev/sda bs=1K seek=8 conv=sync
sync

Insira o sdcard em sua OrangePi Zero devidamente preparada com um cabo de console, e o console aberto em seu linux com um aplicativo como putty, minicom ou picocom. Então veja a mágica acontecer.

Utilizarei picocom nessa desmonstração. NetBSD9.2 boot demo

Congratulações! Você acabou de aprender como crosscompilar uma imagem de NetBSD em seu Linux.