Manual
do
Maker
.
com
Já há muito tempo eu conhecia o U-boot. Ele sempre foi bastante difundido no mundo dos embarcados, mas sei lá por qual razão, justamente o Raspberry não o usa por padrão (será só por questão de tempo de boot?). Mas tudo bem, vai dar um trabalhinho para usar o u-boot no Raspberry, mas o faremos.
Mostrei outro modo de fazer boot, ainda vou escrever mais a respeito, mas nesse outro caso é iniciado um kernel e um sistema inicial para gerenciar outros sistemas, possibilitando ter diversos sistemas no cartão SD do Raspberry.
Vale no mínimo a leitura (Colocar múltiplos sistemas no SD do Raspberry).
Enfim, foi publicado meu primeiro curso na Udemy! \o/
Não é um curso para torná-lo hacker, mas é bem interessante.
No momento em que decidi produzir o curso, pensei o que seria interessante e essencial para agradar de algum modo hobistas e profissionais minimamente. Então formei a ideia de que é necessário conseguir se divertir e trabalhar no Raspberry sem precisar consultar o Google a cada passo. Daí formei um singelo curso de 3 horas com o conteúdo seguindo o raciocínio que utilizo para fazer os projetos para meus clientes. Escolher o sistema e gravá-lo a partir de algum sistema operacional, acessá-lo remotamente para não ter a necessidade de ficar conectando monitor e teclado, personalizar comandos, automatizar predefinições de ambiente e - não poderia deixar de mostrar o poder do shell script, que vai ajudar a resolver muitas coisas. Inclusive tudo, em se tornando hábil.
Na interação com GPIO (com Shell Script, Python e C), aproveitei para mostrar a configuração e interação com I2C e expansor de IO, discorrendo também (com ênfase) sobre bitwise.
Depois do sistema instalado, configurado, serviços do systemd criados e habilitados, o que fazer? Bem, aí é hora de proteger o sistema contra surtos de energia, porque além da vida útil do SD ser curta, ainda tem a questão de desligamentos incorretos. Se deslocar ao cliente tem custo, então vamos evitar; e sério, a vida útil do seu cartão vai no mínimo quadruplicar. Daí finalizo com o backup, tornando o sistema replicável e reduzindo-o, porque se fizer um dump de um cartão de 32GB, seu sistema de 4GB vai ficar com 32GB.
Se gostou ou se quer dar "aquela" força, use o cupom de desconto "DOBITAOBYTE" (sem aspas) para obter o curso ao preço que eu defini (porque o menor valor da Udemy era maior do que o pretendido).
Link do curso.
Jabá feito, bora para o artigo.
O u-boot tem recursos bastante úteis, como opção de boot por rede, SD, USB e, vejam só, serial. Ele também suporta variáveis de ambiente, aquelas que são passadas para o sistema operacional e tem um terminal para interação bastante satisfatório.
Bem, não é o que faremos. A técnica consiste em fazer o "bostloader" do Raspberry carregar o u-boot, invés de carregar o kernel do Linux. Daí começa a brincadeira.
Pode parecer um processo estranho para quem nunca fez, mas é algo semelhante ao que faziamos antigamente em Linux, durante um dual boot que carregava o LiLo, então selecionávamos o Windows no menu de boot e posteriormente a versão do Windows que queríamos iniciar. Dá pra ir fazendo esses "saltos". Explico depois.
Já escrevi sobre cross compiling para Raspberry, mas o processo não precisa ser tão elaborado, vamos ser mais objetivos agora.
Vamos criar um diretório, baixar a toolchain, baixar o u-boot, colocar a toolchain no path do usuário e compilar. Só isso, é meio que padrão para qualquer cross compiling.
cd
mkdir bootloader
cd bootloader
Em nosso computador pessoal (pelo menos na maioria absoluta) utilizamos a arquitetura IBM x86 ou AMD64 (x86_64). O nome "AMD64" é porque a AMD que criou a arquitetura de 64 bits para computadores pessoais. Bem, vamos gerar binários para uma arquitetura diferente da utilizada em computadores pessoais, que é para ARM. Nesse caso, utilizaremos uma "toolchain", que é a ferramenta que produzirá o código do bootloader que utilizaremos. Isso é chamado de "cross compiling". Escrevi diversos artigos a respeito, se der uma navegada pelo blog vai achar bastante informação interessante relacionada.
Voltando ao Linaro, em download tem montes de variações. A que vamos utilizar é x86_64-arm-linux-gnueabihf, tenha isso em mente.
Vou citar o que lembro, mas nessa década não lembro de ter filosofado a respeito, então, posso estar errado. Mas para deixar alguma informação:
ABI - Application Binary Interface - padrão que define um mapeamento entre baixo e alto nível (falando da relação de hardware e sistema operacional). Como a interface das arquiteturas são diferentes, ARM ABI, para a arquitetura ARM, utilizada também no Raspberry.
EABI - Não sei o que significa o "E", mas é utilizado quando um processador carrega uma aplicação sem intermédio do kernel. "Acho" que o "E" é de ELF, o formato binário que é utilizado (por exemplo) no Linux, mas já disse nesse artigo sobre sistemas embarcados que o "E" é de "Embedded". E tinha também o OABI, onde o "O" era de "Old".
HF - Significa Hard Float, uma característica da ABI em questão, que passa argumentos de ponto flutuante para os registradores da FPU ou GP. Tem também o SF, mas os últimos 3 acrônimos já não vou explicar para evitar que fique muito chato o artigo.
wget -c https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz
O código fonte está disponível no Gitlab denx. Clone-o para dentro do diretório bootloader, que criamos para fazer o processo.
git clone https://gitlab.denx.de/u-boot/u-boot.git
Precisamos compilar o u-boot, primeiramente descomprimindo o compilador e configurando o path do sistema.
tar xvJf gcc*xz
export PATH=$PATH:$(pwd)/$(ls -d */|grep gcc)bin
cd uboot
make CROSS_COMPILE=arm-linux-gnueabihf- distclean
make rpi_3_32b_defconfig
make CROSS_COMPILE=arm-linux-gnueabihf- -j8 #(8 é o número de núcleos do seu computador)
Pode parecer estranho o comando do export, ainda mais se não tiver feito ainda o curso "Raspberry para hobistas e profissionais" (eita, jabá). Mas essa é uma forma de tornar o export genérico, dando a você a liberdade de escolher o nome do diretório e também mantendo o artigo atual para qualquer versão do linaro.
Compila extremamente rápido. O resultado é um pequeno arquivo de menos de 500KB:
A documentação é farta, mas é doloroso ler e absorver o tanto de coisa que tem. Daí, vou tentar escrever outro artigo mostrando outras formas de boot, por enquanto vamos fazer o boot básico - o que já é um grande começo, digo de passagem.
Crie um arquivo com algum nome que lembre boot, para receber comandos de um script binário que será utilizado pelo gerenciador de boot. Por exemplo, boot.cmd, e adicione o seguinte conteúdo:
mmc dev 0
fatload mmc 0:1 ${kernel_addr_r} kernel7.img
setenv bootargs console=tty1 earlyprintk root=/dev/mmcblk0p2 rootwait
bootz ${kernel_addr_r} - ${fdt_addr}
Agora, a partir desse arquivo devemos gerar o .scr:
tools/mkimage -A arm -C none -T script -d boot.cmd boot.scr
Estamos quase terminando. Vamos criar um arquivo config.txt novo contendo apenas isso:
kernel=u-boot.bin
max_framebuffers=2
#hdmi_safe=1
#disable_overscan=1
dtoverlay=vc4-fkms-v3d
Faça backup do config.txt que está no cartão e então copie os arquivos para lá. No meu caso, o Ubuntu monta as partições do cartão em /media/djames/, portanto:
cp {config.txt,boot.scr,u-boot.bin} /media/djames/boot/
O resultado do u-boot no Raspberry é a imagem de destaque do artigo. Depois disso, é o boot do sistema.
Onde mais senão na CurtoCircuito? Dê uma passada no site e aproveite a variedade enorme de sensores que eles tem.
O vídeo está disponível no nosso canal DobitAoByteBrasil no Youtube, onde passo novamente por todo o processo, mas de maneira bastante breve e, por fim, mostro a tela de boot.
Eu tive um problema com a tela, testei alguns parâmetros, mas não consegui resolver ainda. Tenho um monitor de 7 polegadas HDMI para o Raspberry, mas tenho um monitor ultra wide para o notebook, então fiz o teste em ambos e o problema é o mesmo que você verá no vídeo. Como instalo para fazer acesso por SSH, para mim não incomoda em nada, mas vou tentar descobrir que configuração mais precisa ser feita.
Se não for inscrito, inscreva-se e clique no sininho para receber notificações. E não se esqueça de deixar um like!
Em breve escreverei um artigo bem legal, mostrando como fazer boot do sistema pela rede, é só acompanhar! Enquanto isso, vá aproveitando o Curso de Raspberry, é só pular o Mc Donalds um dia que já se paga, valeu?
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.