U-boot na VIM3 (SD Card)
baseado no tutorial do próprio u-boot no readthedocs
Organizando a estrutura de pastas
Serão necessários vários arquivos e pastas durante esse post. Devido isso, iremos usar a seguinte estrutura de pastas
.
├── fip
├── toolchain
├── u-boot-mainline
└── u-boot-vim3
Elas serão criadas ao longo deste post.
Baixando o u-boot Mainline
O u-boot possui um repositório no github. Vamos baixa-lo dentro da pasta u-boot-mainline:
git clone https://github.com/u-boot/u-boot.git u-boot-mainline
Para fazer o cross compile é necessário baixar as toolchain. As versões novas do u-boot precisam de versões novas de toolchain, que podem ser encontradas no site da ARM. Nesse post estou usando a versão gcc-arm-10.3-2021.07 (meu link de backup).
Compilando o u-boot mainline
Uma vez baixado a toolchain (gcc-arm-10.3-2021.07), vamos criar a pasta toolchain e mover a toolchain baixada para dentro dela.
Agora, precisamos descompactar a toochain e adicionar os binários ao path do sistema. Para isso
export PATH=CAMINHO_ABSOLUTO/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin:$PATH
Observe que a pasta /bin
está sendo adicionada ao path. Nela estão os executáveis que serão utilizados durante o processo de build.
Volte para a pasta do u-boot-mainline e execute os seguintes comandos:
make khadas-vim3_defconfig O=out/
make CROSS_COMPILE=aarch64-none-elf- O=out/
O parâmetro
O
define a pasta onde os arquivos compilados serão salvos.
O argumento CROSS_COMPILE=aarch64-none-elf-
informa qual toolchain será utilizada no momento da compilação, essa toolchain precisa estar no path do sistema (como fizemos anteriormente). Dentro os vários compiladores disponíveis, podemos ver que existem alguns bem conhecidos: c++
, cpp
, g++
e muitos outros.
toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin
├── aarch64-none-elf-addr2line
├── aarch64-none-elf-ar
├── aarch64-none-elf-as
├── aarch64-none-elf-c++
├── aarch64-none-elf-c++filt
├── aarch64-none-elf-cpp
├── aarch64-none-elf-elfedit
├── aarch64-none-elf-g++
...
Se tudo ocorrer como o esperado, uma mensagem similar a essa:
aarch64-none-elf-ld.bfd: warning: -z norelro ignored
OBJCOPY lib/efi_loader/initrddump.efi
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot-nodtb.bin
RELOC u-boot-nodtb.bin
CAT u-boot-dtb.bin
COPY u-boot.bin
SYM u-boot.sym
LD u-boot.elf
make[1]: Leaving directory 'CAMINHO_ABSOLUTO/u-boot-mainline/out'
O arquivo u-boot.bin
deve ter sido gerado dentro da pasta out
.
Baixando u-boot VIM3
A Khadas também possui um repositório com as versões do u-boot para as diversas placas que eles produzem. Vamos baixar o brach khadas-vims-v2015.01
dentro da pasta u-boot-vim3
git clone https://github.com/khadas/u-boot.git -b khadas-vims-v2015.01 u-boot-vim3
none-elf
e none-eabi
):
- gcc-linaro-aarch64-none-elf-4.8-2013.11 - Linaro
- gcc-linaro-aarch64-none-elf-4.8-2013.11 (backup).
- gcc-linaro-arm-none-eabi-4.8-2013.11 - Linaro
- gcc-linaro-arm-none-eabi-4.8-2013.11 (backup).
Compilando o u-boot VIM3
Antes de adicionar as novas toolchain ao path, limpe o terminal (abra um novo terminal). A versão utilizada no u-boot-mainline não é compatível com a versão da VIM3
Com as 2 toolchain baixadas, mova-as para a pastas toolchain e descompacte cada uma em sua respectiva pasta. Por fim, adicionar os binários dos 2 toolchain ao path do sistema
export PATH=CAMINHO_ABSOLUTO/toolchain/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux/bin:$PATH
export PATH=CAMINHO_ABSOLUTO/toolchain/gcc-linaro-arm-none-eabi-4.8-2013.11_linux/bin:$PATH
Com os caminhos adicionados, podemos compilar o u-boot-vim3:
make kvim3_defconfig O=out/
make CROSS_COMPILE=aarch64-none-elf- O=out/
O parâmetro
O
define a pasta onde os arquivos compilados serão salvos.
Se tudo ocorrer bem, uma mensagem similar deve aparecer:
LD CAMINHO_ABSOLUTO/u-boot-vim3/out/board/khadas/kvim3/firmware/acs.elf
OD CAMINHO_ABSOLUTO/u-boot-vim3/out/board/khadas/kvim3/firmware/acs.dump
BIN CAMINHO_ABSOLUTO/u-boot-vim3/out/board/khadas/kvim3/firmware/acs.bin
Built CAMINHO_ABSOLUTO/u-boot-vim3/out/board/khadas/kvim3/firmware/acs.bin successfully
CPP task_entry.s
CPP user_task.lds
CC task_entry.o
CC user_task.o
CPP misc.s
CC misc.o
CC uart.o
CC suspend.o
CC lib/string.o
CC lib/delay.o
LD CAMINHO_ABSOLUTO/u-boot-vim3/out/scp_task/bl301.out
OBJDUMP CAMINHO_ABSOLUTO/u-boot-vim3/out/scp_task/bl301.dis
OBJCOPY CAMINHO_ABSOLUTO/u-boot-vim3/out/scp_task/bl301.bin
Juntando tudo
O primeiro passo é criar a pasta fip.
Segundo, é preciso baixar esse script da BayLibre ou no meu backup e mover para dentro da pasta fip
Para mais informações sobre o que é, acesse: FIP + compilados
Terceiro, é preciso copiar vários arquivos para dentro da pasta fip:
# Arquivos compilados no u-boot-VIM3
cp u-boot-vim3/out/scp_task/bl301.bin fip
cp u-boot-vim3/out/board/khadas/kvim3/firmware/acs.bin fip
# Copia o u-boot.bin (mainline) e renomeia para bl33.bin
cp u-boot-mainline/out/u-boot.bin fip/bl33.bin
# Arquivos pré-compilados (são fornecidos pela khadas)
cp u-boot-vim3/fip/g12b/bl2.bin fip
cp u-boot-vim3/fip/g12b/bl30.bin fip
cp u-boot-vim3/fip/g12b/bl31.bin fip
cp u-boot-vim3/fip/g12b/ddr3_1d.fw fip
cp u-boot-vim3/fip/g12b/ddr4_1d.fw fip
cp u-boot-vim3/fip/g12b/ddr4_2d.fw fip
cp u-boot-vim3/fip/g12b/diag_lpddr4.fw fip
cp u-boot-vim3/fip/g12b/lpddr3_1d.fw fip
cp u-boot-vim3/fip/g12b/lpddr4_1d.fw fip
cp u-boot-vim3/fip/g12b/lpddr4_2d.fw fip
cp u-boot-vim3/fip/g12b/piei.fw fip
cp u-boot-vim3/fip/g12b/aml_ddr.fw fip
cp u-boot-vim3/fip/g12b/aml_encrypt_g12b fip
Concatenando os arquivos
Pra concatenar as informações, vamos utilizar o script da baylibre (dentro da pasta fip)
# Adiciona um padding no bl30.bin e bl301.bin
# depois concatena os dois, gerando bl30_new.bin
bash blx_fix_g12a.sh bl30.bin zero_tmp bl30_zero.bin bl301.bin bl301_zero.bin bl30_new.bin bl30
# Adiciona um padding no bl2.bin e acs.bin
# depois concatena os dois, gerando bl2_new.bin
bash blx_fix_g12a.sh bl2.bin zero_tmp bl2_zero.bin acs.bin bl21_zero.bin bl2_new.bin bl2
Encriptando os arquivos
Para mais informações, acesse: link
# Adiciona assinatura no cabeçalho do binário
./aml_encrypt_g12b --bl2sig --input bl2_new.bin --output bl2.n.bin.sig
# Adiciona assinatura no cabeçalho do binário
./aml_encrypt_g12b --bl3sig --input bl31.bin --output bl31.img.enc --level v3 --type bl3
# Adiciona e encripta a assinatura no cabeçalho do binário
./aml_encrypt_g12b --bl30sig --input bl30_new.bin --output bl30_new.bin.g12a.enc --level v3
./aml_encrypt_g12b --bl3sig --input bl30_new.bin.g12a.enc --output bl30_new.bin.enc --level v3 --type bl301
# Adiciona a assinatura no cabeçalho, um padding no final do binário e comprime o binário
./aml_encrypt_g12b --bl3sig --input bl33.bin --compress lz4 --output bl33.bin.enc --level v3 --type bl33 --compress lz4
# Gera o binário do u-boot com as assinaturas concatenadas
./aml_encrypt_g12b --bootmk --output u-boot-bin --bl2 bl2.n.bin.sig --bl30 bl30_new.bin.enc --bl31 bl31.img.enc \
--bl33 bl33.bin.enc --ddrfw1 ddr4_1d.fw --ddrfw2 ddr4_2d.fw \
--ddrfw3 ddr3_1d.fw --ddrfw4 piei.fw --ddrfw5 lpddr4_1d.fw \
--ddrfw6 lpddr4_2d.fw --ddrfw7 diag_lpddr4.fw --ddrfw8 aml_ddr.fw \
--ddrfw9 lpddr3_1d.fw --level v3
Passando o u-boot para o SD Card
$ DEV=/dev/your_sd_device
$ dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=512 skip=1 seek=1
$ dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=1 count=444