uboot grava o kernel na partição mmc

1

Eu quero escrever um kernel Linux com U-Boot em uma partição mmc de um armazenamento eMMC em uma placa i.MX6:

TX6UL U-Boot > mmc info
Device: FSL_SDHC
Manufacturer ID: 11
OEM: 100
Name: 004G6 
Tran Speed: 52000000
Rd Block Len: 512
MMC version 5.0
High Capacity: Yes
Capacity: 8 MiB
Bus Width: 4-bit
Erase Group Size: 4 MiB
HC WP Group Size: 4 MiB
User Capacity: 8 MiB WRREL
Boot Capacity: 2 MiB ENH
RPMB Capacity: 512 KiB ENH
GP1 Capacity: 8 MiB WRREL
GP2 Capacity: 1.8 GiB ENH WRREL

A hwpartition GP1 de uso geral foi planejada para ser usada no kernel. Geralmente, os seguintes comandos são usados para gravar a imagem (assumindo que um servidor tftp esteja rodando e hospedando a imagem como arquivo uImage_txul):

TX6UL U-Boot > tftp ${loadaddr} uImage_txul
TX6UL U-Boot > mmc write ${loadaddr} 0xXXXX 0xYYYY

Como descobrir os endereços necessários 0xXXXX 0xYYYY para gravar a imagem no hwpartition GP1?

    
por Achim 07.09.2016 / 22:41

1 resposta

2

A resposta curta para queimar o u-boot no mmc é provavelmente

tftp ${loadaddr} u-boot.bin
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fileaddr} 0 800
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0

mas depende de como você configurou o mmc. Este comando irá escrever 1048576 (0x800 * 512) bytes de $ {fileaddr} para o mmc iniciando no endereço 0.

Para uma resposta mais longa e completa ao escrever o mmc. Vamos dizer que você vai configurar o mmc da maneira que o fabricante sugere.

| u-boot[0] | DT[0x680] | Kernel[0x800] | FS[0x8000] |

Vamos supor que você já tenha os arquivos necessários, caso contrário, você pode construir esses arquivos com o Yocto. Eu posso fornecer detalhes sobre isso, se quiser.

u-boot.bin, imx6ul-txul-0011.dtb, uImage, rootfs.tar.bz2, modules.tgz

Vamos supor também que você já tenha, pelo menos, s-carregado o u-boot, parece que você está rodando de alguma forma.

A primeira coisa que você precisa para particionar o mmc. Você não pode fazer isso a partir do u-boot, então você precisa configurar uma inicialização de rede. Parece que você já tem um servidor tftp com seus arquivos nele, você também precisará configurar um servidor nfs e extrair rootfs para lá. Digamos que você configure seu sistema de arquivos do servidor nfs em / nfsroot. Defina as seguintes variáveis para ativar o net boot.

env default -a
env set bootdelay 3
env set serverip 192.168.1.99
env set nfs_server 192.168.1.99
env set ipaddr 192.168.1.90
env set netmask 255.255.255.0
env set bootfile uImage
env set nfsroot /nfsroot
env set boot_mode net
env set default_bootargs setenv bootargs init=/bin/sh console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save

Inicialize o prompt do Linux e, a partir daí, execute

fdisk /dev/mmcblk0

e partições de configuração da seguinte forma

Partition   Start Cyl   End Cyl     Start Sector    End Sector  Type
1           33          512         2048            32767       0x0c
2           513         -           32768           -           0x83

Volte para o u-boot e agora você poderá ver suas partições

> mmc part

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     2048            30720           00ee66ee-01     0c
  2     32768           7700480         00ee66ee-02     83

Observe que a partição 1 começa no setor 2048, que é 0x800. Partição 2 inicia em 32768 que é 0 x 8000. Agora você deve ver de onde vêm esses números.

Atualizamos o u-boot.bin com os comandos acima, mas observe que ele também sobrescreve a Tabela de Dispositivos (DT). Então, para atualizar o DT, use

tftp ${fdtaddr} imx6ul-txul-0011.dtb
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 1
mmc write ${fdtaddr} 0x680 80
mmc partconf 0 ${emmc_boot_ack} ${emmc_boot_part} 0

Também pode haver uma variável de ambiente definida com estes comandos, $ {fdtsave} , se assim for, você pode usar apenas

run fdtsave

Para atualizar as partições, você precisará criar as imagens de disco na sua caixa linux, então tftp para o TX6UL e gravá-las com o comando mmc write. Para criar a imagem para a primeira partição, você poderia usar esses comandos na sua caixa linux.

dd if=/dev/zero of=part1.image bs=15728640 count=0 seek=1
/sbin/mkfs -t vfat part1.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part1.image /mnt/mkpart
cp uImage /mnt/mkpart/uImage
sudo umount /mnt/mkpart

Então, no u-boot

tftp ${loadaddr} part1.image
mmc write ${fileaddr} 800 7800

Você pode ver o conteúdo da partição usando o u-boot usando

> fatls mmc 0:1

  3676512   uimage 

1 file(s), 0 dir(s)

Similarmente para a segunda partição, da sua caixa linux use algo como

dd if=/dev/zero of=part2.image bs=64M count=0 seek=1
/sbin/mkfs -t ext3 part2.image
sudo mkdir /mnt/mkpart
sudo mount -o loop part2.image /mnt/mkpart
sudo tar -C /mnt/mkpart -xjf rootfs.tar.bz2
sudo tar -C /mnt/mkpart -xzf modules.tgz
ln -s sbin/init /mnt/mkpart/linuxrc
sudo umount /mnt/mkpart

E a partir do u-boot

tftp ${loadaddr} part2.image
setexpr fs ${filesize} + 1ff
setexpr fs ${fs} / 200
mmc write ${fileaddr} 8000 ${fs}

Se você quiser ver o conteúdo da segunda partição do u-boot

> ext2ls mmc 0:2

Para inicializar a partir das novas partições, configure init de volta ao normal nos argumentos de inicialização

env set default_bootargs setenv bootargs init=/linuxrc console=ttymxc0,115200 ro debug panic=1 ${append_bootargs}
save

E não se esqueça de alterar o id da partição ou a variável env para apontar para o novo sistema de arquivos. Neste caso,

env set rootpart_uuid 00ee66ee-02
save

Espero que isso ajude.

    
por 29.12.2016 / 17:17