Eu tenho um problema: meu dispositivo (uma placa Atmel SAMA5D27 Xplained ) não inicializa após minha tentativa para piscar uma nova árvore de dispositivos.
Veja o que fiz (os detalhes estão no final desta mensagem):
- Eu baixei a árvore fonte Linux4SAM do Github (tag linux4sam_5.3) . Eu usei essa tag, já que é aquela que foi instalada quando recebi o dispositivo.
- Eu fiz alterações no arquivo
arch/arm/boot/dts/at91-sama5d2_xplained.dts
para ativar o dispositivo SPI1 (e desative o dispositivo SDMMC1, pois ele está em conflito com os pinos SPI1). Salvei o arquivo no mesmo diretório que at91-sama5d2_xplained_custom.dts
e modifiquei o Makefile de acordo.
- Eu compilei (do diretório raiz da árvore de origem) com o seguinte comando:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
. Um novo DTB foi gerado.
- Verifiquei o tamanho do arquivo DTB com o comando
file
, que dizia ser o DTB de 30796 bytes.
- exibi o DTB aos dispositivos com o utilitário SAM-BA , que foi bem-sucedido , mas relatou que 30976 bytes foram exibidos.
- Eu reiniciei o dispositivo, que ficou preso no ambiente de inicialização. Isso era de se esperar, já que o DTB foi alterado. Eu atualizei o
bootcmd
para refletir o novo tamanho do DTB (30796 = 0x784c), mas ele ainda não inicializa.
Este é o resultado de printenv
após minha atualização (que salvei com saveenv
):
=> printenv
bootargs=console=ttyS0,115200 root=/dev/mmcblk0p1 rw rootfstype=ext4 rootwait
bootcmd=sf probe 0; sf read 0x21000000 0x70000 0x784c; sf read 0x22000000 0x7c000 0x3636a8; bootz 0x22000000 - 0x21000000
bootdelay=1
ethact=gmac0
ethaddr=fc:c2:3d:02:f4:e9
stderr=serial
stdin=serial
stdout=serial
Environment size: 309/8188 bytes
Observe que atualizei apenas o tamanho no primeiro comando sf read
de bootcmd
. Ele costumava ler sf read 0x21000000 0x70000 0x77c8
, que corresponde ao tamanho do DTB obtido do arquivo at91-sama5d2_xplained.dts
original.
Aqui está o erro que recebi:
SF: Detected AT25DF321 with page size 256 Bytes, erase size 4 KiB, total 4 MiB
device 0 offset 0x70000, size 0x784c
SF: 30796 bytes @ 0x70000 Read: OK
device 0 offset 0x7c000, size 0x3636a8
SF: 3552936 bytes @ 0x7c000 Read: OK
Kernel image @ 0x22000000 [ 0x000000 - 0x3636a8 ]
ERROR: Did not find a cmdline Flattened Device Tree
Could not find a valid device tree
Naturalmente, minha pergunta é: o que eu fiz de errado?
Eu tenho algumas hipóteses, que eu tentei:
- O tamanho errado: tentei usar 0x7900 no
bootcmd
(correspondendo aos 30976 bytes que o SAM-BA reportou), mas isso não ajudou.
- Acionei o endereço incorreto: não sei ao certo qual é o endereço
0x21000000
em sf read
em bootcmd
, mas a partir dos arquivos de exemplo fornecidos com o SAM-BA, deduzi que 0x70000 estava correto . Alterar 0x21000000
para 0x0
não ajuda. Alterar o comando de gravação do SAM-BA para gravar em 0x21070000
resulta em um erro que não pode ser gravado após o final da memória.
- Meu DTB está errado. Eu não acho que estou fazendo coisas particularmente estranhas no meu arquivo DTS, e desde que ele compila, presumo que seja pelo menos em um formato que deve ser legível.
Qualquer ajuda / conselhos / ponteiros / etc. é muito apreciado, pois agora tenho um dispositivo que não pode ser inicializado ... Também estou preocupado que, se eu passasse para o endereço errado, quebrei todos os tipos de coisas que não conheço.
Detalhes
Arquivo DTS:
/dts-v1/;
#include "at91-sama5d2_xplained_common.dtsi"
/ {
model = "Atmel SAMA5D2 Xplained";
compatible = "atmel,sama5d2-xplained", "atmel,sama5d2", "atmel,sama5";
ahb {
sdmmc1: sdio-host@b0000000 {
status = "disabled"; /* conflict with spi1 */
};
apb {
can0: can@f8054000 {
status = "okay";
};
can1: can@fc050000 {
status = "okay";
};
spi1: spi@fc000000 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1_default>;
status = "okay";
};
pinctrl@fc038000 {
pinctrl_spi1_default: spi1_default {
pinmux = <PIN_PA22__SPI1_SPCK>,
<PIN_PA23__SPI1_MOSI>,
<PIN_PA24__SPI1_MISO>,
<PIN_PA25__SPI1_NPCS0>;
bias-disable;
};
};
};
};
};
Compilação do DTB:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
CHK include/generated/bounds.h
CHK include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
DTC arch/arm/boot/dts/at91-sama5d2_xplained_custom.dtb
Verificação do tamanho do arquivo DTB:
$ file arch/arm/boot/dts/at91-sama5d2_xplained_custom.dtb
arch/arm/boot/dts/at91-sama5d2_xplained_custom.dtb: Device Tree Blob version 17, size=30796, boot CPU=0, string block size=1692, DT structure block size=29048
Saída do comando flash SAM-BA:
# sam-ba -p serial:ttyACM0:115200 -b sama5d2-xplained -a serialflash -c write:at91-sama5d2_xplained_custom.dtb:0x70000
Opening serial port 'ttyACM0'
Connection opened.
Detected memory size is 4194304 bytes.
Executing command 'write:at91-sama5d2_xplained_custom.dtb:0x70000'
Added 180 bytes of padding to align to page size
Wrote 30976 bytes at address 0x00070000 (100.00%)
Connection closed.
SAM-BA tentando escrever após o final da memória:
# sam-ba -p serial:ttyACM0:115200 -b sama5d2-xplained -a serialflash -c write:at91-sama5d2_xplained_custom.dtb:0x21070000
Opening serial port 'ttyACM0'
Connection opened.
Detected memory size is 4194304 bytes.
Executing command 'write:at91-sama5d2_xplained_custom.dtb:0x21070000'
Added 180 bytes of padding to align to page size
Error: Command 'write:at91-sama5d2_xplained_custom.dtb:0x21070000': Cannot write past end of memory, only -549912576 bytes remaining at offset 0x21070000 (requested 30976 bytes)
Connection closed.