Site icon Embarcados – Sua fonte de informações sobre Sistemas Embarcados

Boot via microSD na Toradex Colibri i.MX7

Boot via microSD.

Introdução

No artigo Criando uma Distribuição Linux com Yocto Project para Toradex Colibri i.MX7 preparamos o ambiente Host e, utilizando Yocto Project, geramos uma Distribuição Linux customizada. Em outro artigo, Gravando imagem customizada Linux na Toradex Colibri i.MX7, foi descrito como gravar a imagem gerada na memória Flash eMMC, baseado nos scripts e ferramentas fornecidas pela Toradex e adequadas ao artigo.

Desta vez será descrito como gravar a imagem em um microSD e a configuração necessária para alterar a ordem de boot, de eMMC para microSD.

Yocto Project

A configuração mandatória para que este artigo flua foi realizada ao criarmos a distribuição. Customizamos o arquivo build-trdx-imx7/conf/local.conf para incluir o seguinte conteúdo na variável IMAGE_FSTYPES:

IMAGE_FSTYPES += "tar.gz ext4 wic.gz ubifs"

Wic

Na variável IMAGE_FSTYPES o destaque se dá para a opção wic.gz. Resumidamente, o wic é uma alternativa à substituição do sdcard utilizado em versões anteriores, e derivado do OpenEmbedded Image Creator (oeic). Porém, para uma melhor pronúncia, o ditongo “oe” foi alterado por “w”.

O wic também tem uma leve base no Meego image Creator (mic), no entanto, muitas modificações e reestruturação foram realizados para suportar os artefatos do OpenEmbedded.

Então, o comando wic gera imagens particionadas a partir de artefatos existentes do OpenEmbedded. Os comandos e instruções devem estar em um arquivo com extensão .wks, conhecido como OpenEmbedded Kickstarter. Podemos ver um wks da camada meta-freescale, que é uma das camadas utilizadas, imx-uboot-bootpart.wks.

Diretório “deploy” do Yocto

Após abordar sobre a configuração do Yocto Project e a ferramenta utilizada para criar uma imagem com as devidas partições, podemos acessar o diretório com o resultado dos trabalhos do build system. Na listagem pode-se visualizar o arquivo com extensão .wic.gz.

~/yocto/poky-sumo/build-trdx-imx7/tmp-glibc/deploy/images/colibri-imx7 $ ls -1 | grep wic
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.wic.gz
console-image-colibri-imx7.wic.gz

O arquivo gerado é o Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.wic.gz, o arquivo console-image-colibri-imx7.wic.gz é apenas um link-simbólico para o primeiro.

Para não usar o diretório de trabalho do Yocto Project, copie o arquivo console-image-colibri-imx7.wic.gz para o diretório de sua preferência ou de trabalho, no caso deste artigo será utilizado o ~/Toradex, equivalente a /home/seu_usuario/Toradex.

~/yocto/poky-sumo/build-trdx-imx7/tmp-glibc/deploy/images/colibri-imx7 $ cp console-image-colibri-imx7.wic.gz ~/Toradex/

Próxima etapa, acessar o diretório ~/Toradex e descompactar o arquivo wic.gz.

$ cd ~/Toradex

$ ls -l
-rw-r--r-- 1 cbueno cbueno  79407976 Jul 18 15:17 console-image-colibri-imx7.wic.gz

$ gzip -d console-image-colibri-imx7.wic.gz

$ ls -l
-rw-r--r-- 1 cbueno cbueno 1057808384 Jul 18 15:17 console-image-colibri-imx7.wic

Antes de gravar o wic, podemos verificar se ele possui as devidas partições. Para isso utilizamos o comando “fdisk” do Linux.

$ fdisk -l console-image-colibri-imx7.wic
Disk console-image-colibri-imx7.wic: 1008,8 MiB, 1057808384 bytes, 2066032 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x09b5e7e9

Dispositivo                     Inicializar Start     Fim Setores  Size Id Tipo
console-image-colibri-imx7.wic1 *               8   42605   42598 20,8M  c W95 FAT32 (LBA)
console-image-colibri-imx7.wic2             42608 2066031 2023424  988M 83 Linux

Pode-se notar que há duas partições: uma FAT32, contendo normalmente arquivos de bootloader, device-tree e kernel; e uma partição Linux, neste caso EXT4.

Gravando a imagem

Nesta etapa, após descompactar o wic.gz, deve-se inserir um microSD no computador, identificar o seu respectivo dispositivo (que pode ser feito com o comando “lsblk”), desmontar as partições e realizar a gravação da imagem através do comando “dd” do Linux.

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 931,5G  0 disk
├─sda1        8:1    0  46,6G  0 part /
├─sda2        8:2    0 232,9G  0 part /home
├─sda3        8:3    0 186,3G  0 part /opt
└─sda4        8:4    0 465,9G  0 part /data
sr0          11:0    1  1024M  0 rom  
mmcblk0     179:0    0   3,7G  0 disk
└─mmcblk0p1 179:1    0   3,7G  0 part /media/cbueno/TDX_UPGRADE

Após identificar o dispositivo, neste caso /dev/mmclk0, deve-se desmontar as partições. Caso tenha mais de 1, repetir o procedimento para demais partições.

$ sudo umount /dev/mmcblk0p1

Realizar a cópia, ou melhor, gravação no microSD:

$ sudo dd if=console-image-colibri-imx7.wic of=/dev/mmcblk0 bs=1M
1008+1 registros de entrada
1008+1 registros de saída
1057808384 bytes (1,1 GB, 1009 MiB) copied, 207,705 s, 5,1 MB/s

Pronto! MicroSD preparado e pronto para ser utilizado em uma das BaseBoards com Toradex Colibri i.MX7.

Acessando bootloader U-Boot

Para correta configuração e alterar a ordem do boot, é necessário acessar o console do bootloader U-Boot utilizando um cabo serial ou conversor USB-Serial. A seguir um vídeo explicativo da Toradex sobre esta etapa.

Após conectar o cabo serial, insira o microSD gravado, e utilizando qualquer programa para abrir e acessar portas seriais, como Putty para Windows, e minicom ou picocom para Linux, conecte ao dispositivo serial.

Neste artigo será utilizado o picocom, e após abrir a porta serial, alimente a placa. Logo no início uma mensagem com o dizer “Hit any key to stop autoboot:” será exibida e deverá pressionar qualquer tecla para interromper o bootloader e poder acessar o console como abaixo:

$ sudo picocom /dev/ttyUSB0 -b115200
picocom v1.7

port is        : /dev/ttyUSB0
flowcontrol    : none
baudrate is    : 115200
parity is      : none
databits are   : 8
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv
imap is        :
omap is        :
emap is        : crcrlf,delbs,

U-Boot 2016.11-2.7.4+g1b121c6 (Jul 03 2018 - 17:17:47 +0000)

CPU:   Freescale i.MX7D rev1.2 996 MHz (running at 792 MHz)
CPU:   Extended Commercial temperature grade (-20C to 105C) at 34C
Reset cause: POR
DRAM:  512 MiB
PMIC:  RN5T567 LSIVER=0x01 OTPVER=0x0d
NAND:  512 MiB
MMC:   FSL_SDHC: 0
*** Warning - bad CRC, using default environment

Video: 640x480x18
In:    serial
Out:   serial
Err:   serial
Model: Toradex Colibri iMX7 Dual 512MB V1.1C, Serial# 02910742
Net:   FEC0
Hit any key to stop autoboot:  0
Colibri iMX7 #

Neste momento, o que importa são duas variáveis, que seriam bootcmd e sdboot. bootcmd é procurada logo após expirar o tempo do bootdelay, como pode ser visto no autoboot.c do código-fonte do u-boot. Já sdboot contém os parâmetros e configurações para se realizar um boot através do microSD, quando suportado pelo fabricante.

Antes de realizar qualquer mudança, pode-se testar e validar utilizando o comando “run” do U-Boot. Então dentro do prompt do bootloader, irá executar “run sdboot” e verificar se o boot completo e com sucesso acontece.

Colibri iMX7 # run sdboot

Booting from MMC/SD card...
reading zImage
5933384 bytes read in 275 ms (20.6 MiB/s)
reading imx7d-colibri-eval-v3.dtb
45016 bytes read in 22 ms (2 MiB/s)
Kernel image @ 0x81000000 [ 0x000000 - 0x5a8948 ]
## Flattened Device Tree blob at 82000000
   Booting using the fdt blob at 0x82000000
   Using Device Tree in place at 82000000, end 8200dfd7
   Updating MTD partitions...

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.1.44-2.7.4+gb1555bf (oe-user@oe-host) (gcc version 7.3.0 (GCC) ) #1 SMP Mon Jul 2 16:52:19 UTC 2018
[    0.000000] CPU: ARMv7 Processor [410fc075] revision
…
…
…
The Angstrom Distribution colibri-imx7 ttymxc0
 
Angstrom v2018.06 - Kernel
 
colibri-imx7 login:

Baseado na saída acima, o boot ocorreu com sucesso, chegando até o prompt de login. Deve-se repetir o processo de ligar e acessar o bootloader U-boot para agora modificar e aplicar esta configuração.

Pode-se visualizar o conteúdo da variável bootcmd com o comando “printenv“.

Colibri iMX7 # printenv bootcmd
bootcmd=run ubiboot; setenv fdtfile ${soc}-colibri-${fdt_board}.dtb && run distro_bootcmd;

Deverá ser alterada a variável bootcmd para antes de “run ubiboot” tente “run sdboot”. Para modificar, utiliza-se o comando “setenv”, e para salvar a modificação utilizar o comando “saveenv”.

Colibri iMX7 # setenv bootcmd "run sdboot; run ubiboot; setenv fdtfile ${soc}-colibri-${fdt_board}.dtb && run distro_bootcmd;"
Colibri iMX7 # saveenv
Saving Environment to NAND...
Erasing NAND...
Erasing at 0x380000 -- 100% complete.
Writing to NAND... OK

Para validar pode-se desligar e ligar a placa, ou digitar o comando “reset”.

Colibri iMX7 # reset
resetting ...


U-Boot 2016.11-2.7.4+g1b121c6 (Jul 03 2018 - 17:17:47 +0000)

CPU:   Freescale i.MX7D rev1.2 996 MHz (running at 792 MHz)
CPU:   Extended Commercial temperature grade (-20C to 105C) at 44C
Reset cause: POR
DRAM:  512 MiB
PMIC:  RN5T567 LSIVER=0x01 OTPVER=0x0d
NAND:  512 MiB
MMC:   FSL_SDHC: 0
Video: 640x480x18
In:    serial
Out:   serial
Err:   serial
Model: Toradex Colibri iMX7 Dual 512MB V1.1C, Serial# 02910742
Net:   FEC0
Hit any key to stop autoboot:  0
Booting from MMC/SD card...
reading zImage
5933384 bytes read in 275 ms (20.6 MiB/s)
reading imx7d-colibri-eval-v3.dtb
45016 bytes read in 22 ms (2 MiB/s)
Kernel image @ 0x81000000 [ 0x000000 - 0x5a8948 ]
## Flattened Device Tree blob at 82000000
   Booting using the fdt blob at 0x82000000
   Using Device Tree in place at 82000000, end 8200dfd7
   Updating MTD partitions...

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.1.44-2.7.4+gb1555bf (oe-user@oe-host) (gcc version 7.3.0 (GCC) ) #1 SMP Mon Jul 2 16:52:19 UTC 2018
[    0.000000] CPU: ARMv7 Processor [410fc075] revision
…
…
…
The Angstrom Distribution colibri-imx7 ttymxc0
 
Angstrom v2018.06 - Kernel
 
colibri-imx7 login:

Sucesso! Ordem de boot concluída e funcionando.

Confirmando o boot via microSD

Caso queira confirmar que o boot foi realmente realizado através do microSD, através do comando “dmesg” realizar esta verificação. Serão omitidas diversas mensagens, focando apenas na parte dos dispositivos de bloco.

root@colibri-imx7:~# dmesg
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.1.44-2.7.4+gb1555bf (oe-user@oe-host) (gcc version 7.3.0 (GCC) ) #1 SMP Mon Jul 2 16:52:19 UTC 2018
...
...
[    0.000000] Kernel command line: root=/dev/mmcblk0p2 ro rootwait console=tty1 console=ttymxc0,115200n8 consoleblank=0 video=mxsfb:640x480M-16@60
...
...
[    1.135425] nand: device found, Manufacturer ID: 0xc2, Chip ID: 0xdc
[    1.143773] nand: Macronix MX30LF4G28AB
[    1.149552] nand: 512 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 112
[    1.161565] gpmi-nand 33002000.gpmi-nand: enable the asynchronous EDO mode 5
[    1.187152] 5 ofpart partitions found on MTD device gpmi-nand
[    1.194904] Creating 5 MTD partitions on "gpmi-nand":
[    1.201934] 0x000000000000-0x000000080000 : "mx7-bcb"
[    1.210024] 0x000000080000-0x000000200000 : "u-boot1"
[    1.217948] 0x000000200000-0x000000380000 : "u-boot2"
[    1.225876] 0x000000380000-0x000000400000 : "u-boot-env"
[    1.234102] 0x000000400000-0x000020000000 : "ubi"
...
...
[    1.638663] mmc0: SDHCI controller on 30b40000.usdhc [30b40000.usdhc] using ADMA
[    1.754586] mmc0: new high speed SDHC card at address 1234
[    1.762487] mmcblk0: mmc0:1234 SA04G 3.64 GiB
[    1.770665]  mmcblk0: p1 p2
...
...

Há uma entrada na saída do comando sobre um dispositivo NAND de capacidade 512 MB e, logo a seguir, alguns detalhes sobre partições do MTD. E mais abaixo, sobre o controlador SDHCI e o dispositivo mmc0 de capacidade 3.64 GB e duas partições, sendo os dispositivos /dev/mmcblk0p1 e /dev/mmcblk0p2.

No entanto, vale ressaltar a entrada no início do “dmesg” quanto ao cmdline do kernel:

Kernel command line: root=/dev/mmcblk0p2 ro rootwait console=tty1 console=ttymxc0,115200n8 consoleblank=0 video=mxsfb:640x480M-16@60

Observe o “root=/dev/mmcblk0p2“, que será entendido na verificação a seguir. Analisando com o “df”e “fdisk”:

root@colibri-imx7:~# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/root      ext4      942M  203M  673M  24% /
devtmpfs       devtmpfs  185M     0  185M   0% /dev
tmpfs          tmpfs     249M     0  249M   0% /dev/shm
tmpfs          tmpfs     249M  360K  248M   1% /run
tmpfs          tmpfs     249M     0  249M   0% /sys/fs/cgroup
tmpfs          tmpfs     249M     0  249M   0% /tmp
tmpfs          tmpfs      50M     0   50M   0% /run/user/0


root@colibri-imx7:~# fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 3724 MB, 3904897024 bytes, 7626752 sectors
119168 cylinders, 4 heads, 16 sectors/track
Units: cylinders of 64 * 512 = 32768 bytes

Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk0p1 *  0,0,9       332,3,14             8      42605      42598 20.7M  c Win95 FAT32 (LBA)
/dev/mmcblk0p2    332,3,17    1023,3,32        42608    2066031    2023424  988M 83 Linux

O “df” não aponta o “/dev/mmcblk0p2”, porém refere-se ao /dev/root que já apontamos no cmdline do kernel, além de informar o tamanho total de 942 MB, o que não seria o caso usando eMMC de 512 MB. E o `fdisk`reforça estas informações.

Considerações finais

Neste artigo apresentou-se como em uma única configuração utilizando Yocto Project há como resultado estruturas e arquivos para criar mais de uma forma de boot.

O simples fato de acessar o console do bootloader e remover “run sdboot” da variável bootcmd, voltará a realizar boot via eMMC com o UbiFS que foi criado.

Outras referências e informações sobre variáveis do bootloader U-Boot e exemplos do .wks encontram-se nas referências no final do artigo.

Boa diversão e até a próxima!

Saiba mais

Amazon FreeRTOS, núcleos heterogêneos e os novos Apalis e Colibri iMX8

Embarcando ScadaBR com Yocto na Toradex Colibri i.MX6

CoM Toradex COLIBRI T20 e Carrier Board Iris

Referências

https://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html#creating-partitioned-images-using-wic
https://www.denx.de/wiki/DULG/UBootEnvVariables
https://github.com/openembedded/openembedded-core/blob/sumo/meta-selftest/recipes-test/images/wic-image-minimal.wks