Habilitando o env.txt com tfpt
Introdução
Nas versões mais atuais do u-boot não é possível usar nativamente o arquivo env.txt
, que facilitava a criação do script de inicialização do bootloader. Essa abordagem era bem útil pois não era necessário recompilar o u-boot para mudar o script de execução. Com o intuito apenas de facilitar os testes na placa, acabei reabilitando esse arquivo.
Cuidado
Esse post é apenas para fins de teste. Essa abordagem teve motivos para ser descontinuada.
Use por sua conta e risco!
Setup
Para tentar aumentar as chances de reprodução dos passos, segue o setup utilizado:
- Distro: Linux Mint 21.1
- Kernel: Linux 6.3.7-060307-generic
- Toolchain: gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf
- U-boot: u-boot-mainline-2023.04
Modificação
Existem várias formas de habilitar o env.txt
, uma delas é alterando a variável CONFIG_BOOTCOMMAND
no defconfig am335x_evm_defconfig
. Por padrão essa variável vem com os seguintes comandos:
CONFIG_BOOTCOMMAND="run findfdt; run init_console; run finduuid; run distro_bootcmd"
Ela executa as funções findfdt
, init_console
, finduuid
e distro_bootcmd
respectivamente.
Info
Para saber onde essas funções foram criadas é necessário dar uma olhada mais a fundo no arquivo:
include/configs/am335x_evm.h
e seus includes.
Para reativar o env.txt
, podemos fazer a seguinte alteração:
CONFIG_BOOTCOMMAND="setenv serverip 192.168.0.203; setenv ipaddr 192.168.0.104; if tftpboot 0x80000000 env.txt; then env import -t 0x80000000 ${filesize}; run agora_vai; fi;"
Para facilitar o entendimento do código, segue o mesmo indentado:
1 2 3 4 5 6 |
|
- Na linha 1: É setado a variável de ambiente
serverip
que será o ip do servidor tftp. - Na linha 2: É setados a variável de ambiente
ipaddr
que será o ip da placa. - Na linha 3: O arquivo
env.txt
é buscado no servidor e armazenado na memória ram da placa no endereço 0x80000000. - Na linha 4: Se tudo ocorrer corretamente, o u-boot carrega o conteúdo do arquivo
env.txt
nas variáveis de ambiente. - Na linha 5: Executa a função
agora_vai
que foi escrita dentro do arquivoenv.txt
.
O arquivo env.txt
Até o momento o u-boot está preparado para buscar no servidor tftp um arquivo com o nome env.txt
. Agora, vamos checar o conteúdo desse arquivo:
1 2 3 4 5 6 7 8 9 10 |
|
A função boot_args
adiciona algumas variáveis de ambiente que serão passadas ao kernel, relacionadas a Network File System (NFS). A função load_kernel
busca no servidor tftp pelo arquivo zImage= (imagem do kernel) e carrega no endereço de memória 0x82000000. Em seguida a função load_dtb
carrega no endereço de memória 0x88000000 o arquivo am335x-boneblack.dtb (device tree blob). Em boot_command
o u-boot executa o que está nas regiões de memória 0x82000000 (zImage) e 0x88000000 (dtb). Por fim, a função agora_vai
executa as funções descritas acima.
Perceba que esse arquivo não é executado imediatamente, ele apenas é carregado em memória. O script só será executado de fato, quando a função agora_vai
for invocada (descrita na seção anterior na linha 5).
Conclusão
Se tudo ocorrer corretamente o kernel Linux será carregado e executado, mas se o NFS ainda não estiver configurado irá ocorrer um kernel panic devido não ser possível encontrar o init
.