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








