U-boot não conseguiu encontrar uma árvore de dispositivos válida

1

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):

  1. 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.
  2. 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.
  3. 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.
  4. Verifiquei o tamanho do arquivo DTB com o comando file , que dizia ser o DTB de 30796 bytes.
  5. exibi o DTB aos dispositivos com o utilitário SAM-BA , que foi bem-sucedido , mas relatou que 30976 bytes foram exibidos.
  6. 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:

  1. O tamanho errado: tentei usar 0x7900 no bootcmd (correspondendo aos 30976 bytes que o SAM-BA reportou), mas isso não ajudou.
  2. 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.
  3. 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.
    
por Ludo 27.01.2017 / 15:56

1 resposta

1

Erro do usuário.

Descobri que o SAM-BA também tem um método de verificação:

# sam-ba -p serial:ttyACM0:115200 -b sama5d2-xplained -a serialflash -c verify:at91-sama5d2_xplained_custom.dtb:0x70000
Opening serial port 'ttyACM0'
Connection opened.
Detected memory size is 4194304 bytes.
Executing command 'verify:at91-sama5d2_xplained_custom.dtb:0x70000'
Added 180 bytes of padding to align to page size
Error: Command 'verify:at91-sama5d2_xplained_custom.dtb:0x70000': Failed verification. First error at file offset 0x00000000
Connection closed.

Não é bom. Acontece que o passo 5 estava faltando um passo muito importante: primeiro você precisa apagar a memória flash antes de escrevê-la (eu não fazia ideia; aparentemente sempre usei ferramentas que cuidavam disso para mim):

# sam-ba -p serial:ttyACM0:115200 -b sama5d2-xplained -a serialflash -c erase:0x70000:0x8000
Opening serial port 'ttyACM0'
Connection opened.
Detected memory size is 4194304 bytes.
Executing command 'erase:0x70000:0x8000'
Erased 32768 bytes at address 0x00070000 (100.00%)
Connection closed.

# 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 -p serial:ttyACM0:115200 -b sama5d2-xplained -a serialflash -c verify:at91-sama5d2_xplained_custom.dtb:0x70000
Opening serial port 'ttyACM0'
Connection opened.
Detected memory size is 4194304 bytes.
Executing command 'verify:at91-sama5d2_xplained_custom.dtb:0x70000'
Added 180 bytes of padding to align to page size
Verified 30976 bytes at address 0x00070000 (100.00%)
Connection closed.
    
por 30.01.2017 / 09:37