A arte do xamanismo ou firmware personalizado para o Olinuxino. UBOOT Parte 2

Tudo isso foi coletado no Ubuntu 16.04.

A decisão de construir o firmware nasceu devido à falta de acesso gratuito à imagem para esta placa (Olimex A13-Olinuxino). E o fabricante se ofereceu para comprar um cartão SD com uma imagem e custou cerca de 10 euros na época, o que realmente não funcionou e, além disso, foi projetado para um monitor.

Vamos definir a configuração do carregador de inicialização para inicializar a partir do cartão SD. Como não há memória NAND na placa e todas as outras opções de inicialização estão um pouco tortas (quem pode montar o uboot para inicializar a partir da mídia USB, deixe-o dar dois passos à frente e compartilhar). O algoritmo de carregamento do processador allwinner a13 pode ser encontrado no site do fabricante. Ou aqui está um recorte de uma folha de dados.



É claramente visto a partir do algoritmo que o gerenciador de inicialização é verificado primeiro no cartão SD, depois o restante é verificado e, somente no final, o gerenciador de inicialização é verificado quanto a USB. Portanto, tablets e smartphones podem ser feitos com o Ubuntu se eles deslizarem o cartão SD da maneira apropriada. E, aparentemente, aproximadamente esse algoritmo será, se não for para todos, para muitos fabricantes de processadores de braço.

Primeiro, você precisa quebrar o cartão SD, para isso, para não cometer erros no processo de digitar comandos, reduziremos todo o processo para um arquivo de script (eu prefiro reduzir tudo para esses arquivos, pois você precisará executá-lo mais de uma vez).

#!/bin/sh DEViCELINK=/dev/sdb fdisk $DEViCELINK <<EOF n #    p #   1 #   2048 #     2MiB +64M #  ,    kernel     dts  n p 2 +2G #    ubuntu n p 3 +2G #         n p 4 #         w EOF mkfs.ext2 /dev/sdb1 << EOF #   kernel    fat16  ext2 y EOF mkfs.ext4 /dev/sdb2 << EOF y EOF mkfs.ext4 /dev/sdb3 << EOF y EOF mkfs.ext4 /dev/sdb4 << EOF y EOF 

Construção do UBOOT


Vamos nos debruçar sobre o gerenciador de inicialização com mais detalhes e, ao selecionar UBOOT, desenvolvemos a versão do u-boot-2018.05, a última na época.

Supõe-se que todo o software necessário para a montagem já esteja instalado. E inicie a construção configurando o gerenciador de inicialização.

Para iniciar a configuração, você precisa ir para a pasta com UBOOT e executar o comando:

 make O=../olimex-uboot #       -j4 #     ARCH=arm #      CROSS_COMPILE=arm-linux-gnueabihf- #    xconfig #   GUI  

Como resultado da execução, obtemos essa janela.



Esta é a versão X do configurador, eles costumam usar a opção de console, mais informações são fornecidas, mas são mais visuais e cobrem completamente nossas necessidades.

E então, se você tiver muito tempo ou não se importa, pode configurar o gerenciador de inicialização do zero. No entanto, é melhor fazer o download da configuração final desta placa através do menu Arquivo. Na pasta com a fonte do carregador de inicialização em /u-boot-2018.05/configs/, selecione o arquivo A13-OlinuXino_defconfig, esta é a nossa configuração, onde tudo já está instalado. Em seguida, clique em salvar e feche a janela, porque nada precisa ser alterado aqui.

Resta executar o comando de construção:

 make O=../olimex-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

Neste comando, os elementos são todos iguais aos do anterior, apenas sem o parâmetro xconfig, que é o que significa configuração. Isso é tudo, o gerenciador de inicialização está montado.

Após a conclusão da montagem, na pasta especificada no comando, precisamos encontrar este arquivo “u-boot-sunxi-with-spl.bin”, este é o carregador de inicialização desejado.

Em seguida, para carregar o carregador de inicialização no cartão SD, use o comando:

 dd if=../olimex-uboot/u-boot-sunxi-with-spl.bin #      of=/dev/sdb #     SD  bs=1024 seek=8 #  8KiB  ,      

O carregador de inicialização que acabou de ser gravado após a inicialização apontará para a próxima seção do cartão SD / dev / sdb1, e procurará um arquivo de script com variáveis ​​de ambiente que contém instruções para carregamento adicional.

Esse arquivo deve ter o nome boot.scr, um arquivo com esse nome está procurando pelo uboot após o download. Obviamente, o nome do arquivo pode ser alterado, assim como o método de download, se você entrar na configuração do UBOOT, mas vamos nos debruçar sobre essa opção.

Você também deve compilar arquivos devicetree, por exemplo, eles estão na fonte com o gerenciador de inicialização em /u-boot-2018.05/arch/arm/dts/. Estamos interessados ​​no arquivo sun5i-a13-olinuxino.dts. Representa uma configuração de registradores e periféricos do processador. Este é um arquivo de configuração universal, portanto, a opção é possível quando um carregador de inicialização uboot é usado para diferentes processadores, mas diferentes arquivos dts são usados. Os mesmos arquivos dts também estão no código-fonte do kernel do Linux, eles são basicamente os mesmos, apenas escritos um pouco diferente, e você pode escolher de onde obter a árvore de dispositivos montada. Em geral, para criar arquivos dts, você precisa executar este comando:

 make O=../olimex-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs #      dts  

O arquivo compilado estará em ../olimex-uboot/arch/arm/dts/.
Considere obter o arquivo boot.scr com mais detalhes.
Primeiro, crie o arquivo boot.cmd com o conteúdo:

 load mmc 0 0x43000000 sun5i-a13-olinuxino.dtb load mmc 0 0x42000000 uImage setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 rw rootwait console=ttyS0,115200 bootm 0x42000000 – 0x43000000 

Mas, para que o uboot entenda as instruções, esse arquivo deve estar na forma de um script e, para isso, você precisa executar o comando:

  mkimage -C none -A arm -T script -d boot.cmd boot.scr 

Onde boot.scr é o arquivo necessário.

A primeira linha de carregamento mmc 0 0x43000000 sun5i-a13-olinuxino.dtb carrega o arquivo em árvore do dispositivo no endereço especificado na RAM. load mmc 0 indica que você precisa baixar o arquivo da primeira seção do cartão SD, enquanto a numeração para o uboot é zero e não uma.

A segunda linha carrega mmc 0 0x42000000 uImage carrega o kernel Linux montado no endereço especificado.

Para nossa versão, a variável do modo de vídeo setenv, que geralmente é usada posteriormente, não é necessária, pois o monitor não está planejado para ser usado.

Terceira linha:

 setenv bootargs #    root=/dev/mmcblk0p2 #    SD    rootfs rootfstype=ext4 #    rootfs rw #    rootwait console=ttyS0,115200 #    uart0 

Bem, o último comando bootm carrega o kernel do carregado anteriormente na memória.

No próximo artigo, a última parte que deve ser colocada na primeira seção do cartão SD será a formação do kernel do Linux.

A primeira parte do artigo
A terceira parte do artigo

Source: https://habr.com/ru/post/pt434942/


All Articles