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 ([email protected]) (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 ([email protected]) (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.

 

[email protected]:~# 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 ([email protected]) (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:[email protected]
...
...
[    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:[email protected]

 

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

 

[email protected]:~# 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


[email protected]:~# 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

Outros artigos da série

<< Conectando Toradex Colibri i.MX7 com WiFi
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Cleiton Bueno
Proprietário da B2Open onde oferecemos consultoria, treinamentos e desenvolvimento em Sistemas Embarcados. Entusiasta a filosofia open-source, mais de 10 anos de experiências em Linux e FOSS. Em sistemas embarcado do firmware baremetal ao Linux Embedded, e há aproximadamente 8 anos desenvolvendo em (C, Python, Qt e muito Shell Script), além de profiling, hardening e tuning para targets com Linux Embarcado. Graduado em Engenharia da Computação pela UNICEP com ênfase em robótica e sistemas embarcados.

Deixe um comentário

avatar
 
  Notificações  
Notificar