Criando uma distribuição Linux com Yocto Project para Toradex Colibri i.MX7

Linux na Toradex Colibri i.MX7
Este post faz parte da série Toradex Colibri i.MX7

Introdução

Utilizando o Yocto Project 2.5, codinome Sumo, lançado em abril de 2018, iremos preparar o ambiente, clonar os repositórios do Yocto Project, Freescale, OpenEmbedded e Angstrom. Será customizada uma distribuição Linux baseada no Angstrom, sem ter que criar meta camadas e realizar muitas modificações.

Nesta primeira etapa iremos customizar e gerar a distribuição com os devidos arquivos (Bootloader, Kernel e RootFS) e sistemas de arquivos para facilitar o processo de gravação, e a geração do toolchain para desenvolvimento e compilação-cruzada para a placa alvo, neste caso Toradex Colibri i.MX7.

Em outro artigo iremos abordar o processo de gravação do Host para o Target, e outro abordando uma aplicação exemplo em FreeRTOS que iremos clonar, compilar, realizar a gravação do firmware no microcontrolador ARM Cortex-M4 do Colibri i.MX7. E através do RPMSG realizaremos a comunicação entre o ARM Cortex-A onde está o SO GNU Linux e o ARM Cortex-M4 com o firmware utilizando FreeRTOS.

Hardware

O kit utilizado para este artigo foi um SoM Toradex Colibri i.MX7D v1.1C e a Placa Base Toradex IRIS. A seguir mais detalhes técnicos:

SoM Toradex Colibri i.MX7D v1.0A
Figura 1 – SoM Toradex Colibri i.MX7D v1.0A

CPU

NXP/Freescale i.MX7 Solo

NXP/Freescale i.MX7 Dual

Tipo

1x ARM Cortex-A7

1x ARM Cortex-M4

2x ARM Cortex-A7

1x ARM Cortex-M4

Clock

800 MHz(A7)

200 MHz(M4)

1.0 GHz(A7)

200 MHz(M4)

Memória RAM

256 MB DDR3

512MB/1GB DDR3

Memória Flash

512 MB SLC NAND

512MB SLC NAND / 4GB eMMC

USB OTG

1x

1x

UART

7x

7x

I2C

3x

3x

SPI

4x

4x

PWM

20x

20x

Entradas Analógicas

4x

4x

Vídeo

(sem GPU)

Integrado

RGB (1920x1080x24bpp)

Integrado

RGB (1920x1080x24bpp)

Temperatura

-20º a +85º

-20º a +85º

A utilização deste módulo requer uma placa base, e os modelos suportados são Viola, Aster, Iris e Colibri Evaluation Board.

Entramos em outro patamar de Sistemas Embarcados com mais este membro na família Toradex Colibri. Neste módulo podemos desprezar a adição de um microcontrolador para alguma tarefa específica e de alta prioridade e/ou preempção.

Junto a isso, o poder de executar aplicações em nível de usuário e em diversas linguagens, como C/C++, Python, Perl, Java, Go, entre diversas outras. Mesmo ausentando de um GPU dedicado, possui um vídeo integrado que supri a necessidade de requisitos de aplicações gráficas básicas e que não requerem uso de aceleração gráfica.

Preparando o Host

No Yocto Project 2.5 Sumo as seguintes distribuições Linux são oficialmente suportadas:

  • Ubuntu 14.10;
  • Ubuntu 15.04;
  • Ubuntu 15.10;
  • Ubuntu 16.04 (LTS);
  • Fedora release 22;
  • Fedora release 23;
  • CentOS release 7.x;
  • Debian GNU/Linux 8.x (Jessie);
  • Debian GNU/Linux 9.x (Stretch);
  • openSUSE 13.2;
  • openSUSE 42.1.

Outras Distribuições devem funcionar sem grandes problemas, porém o mínimo de requisito no host é:

  • Git 1.8.3.1 ou superior;
  • tar 1.27 ou superior;
  • Python 3.4.0 ou superior;
  • 50 GB de espaço livre em disco.

Para o correto funcionamento de todo ecossistema de ferramentas do Yocto Project é necessário instalar as seguintes ferramentas:

Ubuntu/Debian

$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping libsdl1.2-dev xterm

Fedora

$ sudo dnf install gawk make wget tar bzip2 gzip python3 unzip perl patch diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath ccache perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue perl-bignum socat python3-pexpect findutils which file cpio python python3-pip xz

OpenSuse

$ sudo zypper install python gcc gcc-c++ git chrpath make wget python-xml diffstat makeinfo python-curses patch socat python3 python3-curses tar python3-pip python3-pexpect xz which

CentOS

$ sudo yum install -y epel-release
$ sudo yum makecache
$ sudo yum install gawk make wget tar bzip2 gzip python unzip perl patch diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath socat perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue python34-pip xz which SDL-devel xterm

Mais detalhes sobre essas etapas podem ser visualizados no manual completo do Yocto Project na seção Yocto Project – Supported Linux Distributions.

Instalando e configuração Yocto Project no Host

Nesta etapa será criado o diretório para buildsystem e clonados todos os repositórios para o correto funcionamento do Yocto Project e das suas dependências e configurações.

Criando o diretório yocto no /home do seu usuário e clonando os repositórios.

$ cd ~
$ mkdir ~/yocto
$ cd ~/yocto/
$ git clone -b sumo https://git.yoctoproject.org/git/poky poky-sumo
$ git clone -b sumo git://git.openembedded.org/meta-openembedded poky-sumo/meta-openembedded
$ git clone -b angstrom-v2018.06-sumo git://github.com/Angstrom-distribution/meta-angstrom.git poky-sumo/meta-angstrom
$ git clone -b sumo https://git.yoctoproject.org/git/meta-freescale poky-sumo/meta-freescale
$ git clone -b sumo git://github.com/Freescale/meta-freescale-3rdparty.git poky-sumo/meta-freescale-3rdparty
$ cd ~/yocto/poky-sumo

Ao final, executando o comando `ls -1` será visualizada uma estrutura de diretórios e arquivos como a seguir:

$ ls -1
bitbake
documentation
LICENSE
meta
meta-angstrom
meta-freescale
meta-freescale-3rdparty
meta-openembedded
meta-poky
meta-selftest
meta-skeleton
meta-yocto-bsp
oe-init-build-env
README.hardware
README.LSB
README.poky
README.qemu
scripts

A próxima etapa é criar o projeto build-trdx-imx7 que irá armazenar todo o trabalho realizado de baixar as dependências até gerar a imagem e demais arquivos, como bootloader e kernel.

$ source oe-init-build-env  build-trdx-imx7
You had no conf/local.conf file. This configuration file has therefore been
created for you with some default values. You may wish to edit it to, for
example, select a different MACHINE (target hardware). See conf/local.conf
for more information as common configuration options are commented.

You had no conf/bblayers.conf file. This configuration file has therefore been
created for you with some default values. To add additional metadata layers
into your configuration please add entries to conf/bblayers.conf.

The Yocto Project has extensive documentation about OE including a reference
manual which can be found at:
    https://yoctoproject.org/documentation

For more information about OpenEmbedded see their website:
    https://www.openembedded.org/


### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'

Customizando o projeto

Será criada uma Distribuição GNU Linux com propósito de auxílio no desenvolvimento/depuração e um PoC mais direto com diversas ferramentas para auxiliar. Utilizando Yocto Project inicialmente você irá manipular dois arquivos que são:

build-trdx-imx7/conf/bblayers.conf

Inserindo as camadas a serem utilizadas.

build-trdx-imx7/conf/local.conf

Inserindo e alterando opções como Distribuição, local de trabalho, download dos fontes baixados, diretório de trabalho, programas e bibliotecas a serem instalados, e etc

Algumas customizações realizadas serão:

Pacotes/Ferramentas

Descrição

coreutils

Inserindo mais comandos e com mais opções além do básico do busybox.

cpufrequtils

Utilitário para alterar as opções e monitorar a política de escalonamento do CPU.

cronie

Pacote que possui as ferramentas de agendamento de tarefas crond e crontab.

htop

Utilitário para visualização dos processos, algo como o top com mais opções para ajudar na visualização.

i2c-tools

Utilitário para auxiliar na depuração de I2C sem necessidade de escrever.

go

Compilador Go.

minicom

Utilitário para abrir e manipular uma conexão serial.

powertop

Utilitário para monitorar o consumo de energia e auxiliar em alterações para melhorar a eficiência.

procps

Versão com mais opções do comando ps, além de comandos como pgrep e pkill.

psmisc

Complementando com mais comandos para auxiliar a administração, neste caso agrega o fuser e killall.

python3

Será instalado o python3.

openssh-sftp-server

SFTP Server para utilizar com desenvolvimento/deploy Host -> Target.

openssh

SSH Server para acesso e administração remota.

Diversas outras ferramentas/utilitários/bibliotecas podem ser adicionadas alterando a variável IMAGE_INSTALL no arquivo build-trdx-imx7/conf/local.conf.

A seguir é exibido o arquivo build-trdx-imx7/conf/bblayers.conf com a configuração das camadas. Você pode abrir o seu arquivo e substituir o seu conteúdo pelo abaixo:

POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  ${TOPDIR}/../meta \
  ${TOPDIR}/../meta-angstrom \
  ${TOPDIR}/../meta-poky \
  ${TOPDIR}/../meta-yocto-bsp \
  ${TOPDIR}/../meta-freescale \
  ${TOPDIR}/../meta-freescale-3rdparty \
  ${TOPDIR}/../meta-openembedded/meta-multimedia \
  ${TOPDIR}/../meta-openembedded/meta-networking \
  ${TOPDIR}/../meta-openembedded/meta-oe \
  ${TOPDIR}/../meta-openembedded/meta-python \
  ${TOPDIR}/../meta-openembedded/meta-webserver \
  "

OBS: Adicionado suporte a meta-webserver que corrige o erro do nginx_%.bbappend conforme apontado usuário Anderson Ferreira Rodriguez nos comentários.

E o build-trdx-imx7/conf/local.conf com todas configurações e customizações:

MACHINE = "colibri-imx7"

DL_DIR ?= "${TOPDIR}/../dl"

SSTATE_DIR ?= "${TOPDIR}/sstate-cache"

TMPDIR = "${TOPDIR}/tmp"

DISTRO = "angstrom"

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

IMAGE_INSTALL += "\
                  coreutils \
                  cpufrequtils \
                  cronie \
                  htop \
                  i2c-tools \
                  gdbserver \
                  go \
                  minicom \
                  powertop \
                  procps \
                  psmisc \
                  python3 \
                  openssh-sftp-server \
                  openssh \
                  tcf-agent \
                  "

PNBLACKLIST[python] ?= "BROKEN: Python 2.7 EOL in Jan/2020"

# Ignore dependencies meta-qt5
# ERROR: ParseError at /nfs/bs/yp/poky-sumo/build-trdx-imx7/../meta-angstrom/recipes-images/angstrom/systemd-qt5-image.bb:5: Could not inherit file classes/populate_sdk_qt5.bbclass
BBMASK = ".*/meta-angstrom/recipes-images/angstrom/systemd-qt5*"

PACKAGE_CLASSES = "package_ipk"

IMAGE_FEATURES += "package-management"

EXTRA_IMAGE_FEATURES = "debug-tweaks"

USER_CLASSES = "buildstats image-mklibs image-prelink"

PATCHRESOLVE = "noop"

INHERIT += "rm_work blacklist"

RM_OLD_IMAGE = "1"

BB_DISKMON_DIRS ??= "\
    STOPTASKS,${TMPDIR},1G,100K \
    STOPTASKS,${DL_DIR},1G,100K \
    STOPTASKS,${SSTATE_DIR},1G,100K \
    STOPTASKS,/tmp,100M,100K \
    ABORT,${TMPDIR},100M,1K \
    ABORT,${DL_DIR},100M,1K \
    ABORT,${SSTATE_DIR},100M,1K \
    ABORT,/tmp,10M,1K"

CONF_VERSION = "1"

Antes de executarmos o comando para dar início ao processo de build, algumas configurações a se destacar:

MACHINE

Configuramos o hardware para qual será feita toda configuração.

DL_DIR

Diretório onde será armazenado tudo que será baixado.

DISTRO

Configuramos a Distribuição base a ser utilizada.

IMAGE_FSTYPES

Sistema de arquivos a ser gerado, importante ter definido a opção ubifs, será abordado em outro artigo seu uso.

IMAGE_INSTALL

Pacotes, ferramentas, utilitários e tudo que deseja instalar e incluir na image final.

PNBLACKLIST[python]

Removemos suporte a Python2.7, como sabe-se EOL(End-Of-Life) dele é 2020, então garantimos para usar somente python3.

PEP373 – Python2.7 Release Schedule

Construindo a Distribuição

A distribuição a ser construída será baseada no Angstrom com sistema de inicialização systemd, apenas console-terminal sem servidor gráfico.

Após executar o comando:

$ source oe-init-build-env  build-trdx-imx7

Será executado o comando `bitbake` que ao passar o nome de uma receita irá ler e processar todas configurações e gerar como resultado uma imagem, além dos arquivos de Bootloader, Kernel, Device-Tree e o que mais estiver configurado para o MACHINE especificado.

A imagem utilizada será meta-angstrom/recipes-images/angstrom/console-image.bb

$ bitbake console-image
Parsing recipes: 100% |#######################################################| Time: 0:02:05
Parsing of 2290 .bb files complete (0 cached, 2290 parsed). 3182 targets, 172 skipped, 1 masked, 0 errors.

Build Configuration:
BB_VERSION           = "1.38.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "linuxmint-18.3"
TARGET_SYS           = "arm-angstrom-linux-gnueabi"
MACHINE              = "colibri-imx7"
DISTRO               = "angstrom"
DISTRO_VERSION       = "v2018.06"
TUNE_FEATURES        = "arm armv7a vfp thumb neon callconvention-hard"
TARGET_FPU           = "hard"
meta                 = "sumo:4fc9ea2377d635e4a0694d1b962ab2bdcc5450a5"
meta-angstrom        = "angstrom-v2018.06-sumo:8945b99ba53fae1b1162545f8a751e48b0b728ce"
meta-poky            
meta-yocto-bsp       = "sumo:4fc9ea2377d635e4a0694d1b962ab2bdcc5450a5"
meta-freescale       = "sumo:b9e66acb71326b7275fc1e693a42387619eadcb0"
meta-freescale-3rdparty = "sumo:4cbe033a21dbff1298a620d18b5fff5902dea50c"
meta-multimedia      
meta-networking      
meta-oe              
meta-python          = "sumo:b0950aeff5b630256bb5e25ca15f4d59c115e7c1"

Initialising tasks: 100% |###############################################################################################################################| Time: 0:00:32

NOTE: Writing buildhistory

O desempenho e conclusão irá depender de fatores como velocidade da internet e o computador realizando o trabalho, então tenha paciência!

Como resultado final, navegue até o diretório build-trdx-imx7/tmp-glibc/deploy/images/colibri-imx7 e listando o diretório será retornado o conteúdo como a seguir:

~/yocto/poky-sumo/build-trdx-imx7/tmp-glibc/deploy/images/colibri-imx7 $ ls -1
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.ext4
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.manifest
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.tar.gz
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.tar.xz
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.ubifs
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.rootfs.wic.gz
Angstrom-console-image-glibc-ipk-v2018.06-colibri-imx7.testdata.json
console-image-colibri-imx7.ext4
console-image-colibri-imx7.manifest
console-image-colibri-imx7.tar.gz
console-image-colibri-imx7.tar.xz
console-image-colibri-imx7.testdata.json
console-image-colibri-imx7.ubifs
console-image-colibri-imx7.wic.gz
imx7d-colibri-aster.dtb
imx7d-colibri-eval-v3.dtb
imx7s-colibri-aster.dtb
imx7s-colibri-eval-v3.dtb
modules--4.1-2.0.x+git0+b1555bfbf3-r0-colibri-imx7-20180702170508.tgz
modules-colibri-imx7.tgz
u-boot-colibri-imx7-2016.11+gitAUTOINC+1b121c6ab5-r0.imx
u-boot-colibri-imx7.imx
u-boot-nand.imx
zImage
zImage--4.1-2.0.x+git0+b1555bfbf3-r0-colibri-imx7-20180702170508.bin
zImage--4.1-2.0.x+git0+b1555bfbf3-r0-imx7d-colibri-aster-20180702170508.dtb
zImage--4.1-2.0.x+git0+b1555bfbf3-r0-imx7d-colibri-eval-v3-20180702170508.dtb
zImage--4.1-2.0.x+git0+b1555bfbf3-r0-imx7s-colibri-aster-20180702170508.dtb
zImage--4.1-2.0.x+git0+b1555bfbf3-r0-imx7s-colibri-eval-v3-20180702170508.dtb
zImage-colibri-imx7.bin
zImage-imx7d-colibri-aster.dtb
zImage-imx7d-colibri-eval-v3.dtb
zImage-imx7s-colibri-aster.dtb
zImage-imx7s-colibri-eval-v3.dtb

No próximo artigo será abordada uma das formas de gravar esta image em um SoM Toradex Colibri i.MX7.

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

Saiba mais

Acelerando o Build de Yocto com ajuda da Nuvem

Embarcando ScadaBR com Yocto na Toradex Colibri i.MX6

Yocto Project: Quick Start

Referências

https://www.toradex.com/pt-br/computer-on-modules/colibri-arm-family/nxp-freescale-imx7
https://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html
https://www.kernel.org/doc/Documentation/rpmsg.txt

Toradex Colibri i.MX7

Gravando imagem customizada Linux na Toradex Colibri i.MX7
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
9 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Diego Sales
Diego Sales
08/12/2018 12:23

Olá Cleiton, Grato por compartilhar seu conhecimento em sistemas embarcados, o post me auxiliou a entender melhor o processo de criar um SO custumizado para o imx7. Sou novo no estudo de SO e sistemas embarcados com linux, fiquei com algumas dúvidas quanto a custimizar o SO para rodar no imx7: 1. Caso eu queira fazer um teste e criar um SO custimizado para efetuar a leitura de sensores na porta i2c e spi, visualizando os resultados e comunicando com a placa via ssh tem como custumizar para esta aplicação especifica e deixar o SO bem enxuto ? quais arquivos… Leia mais »

Cleiton Bueno
Cleiton Bueno
Reply to  Diego Sales
11/12/2018 11:49

Olá Diego, que bom que ajudou nos seus estudos. 1. Você pode desenvolver em diversas linguagens como C, C++, Java, Python, Perl, Go, Rust e diversas outras, neste caso, irá “abrir” e manipular o I2C e SPI via /dev, a Toradex possui artigos sobre além do Linux oferecer utilitários para auxiliar nos testes. https://developer.toradex.com/knowledge-base/i2c-(linux) https://developer.toradex.com/knowledge-base/spi-(linux) 2. Não sei se entendi muito bem esta questão, mas para utilizar/comunicar com o M4 via Linux que esta rodando sobre o Cortex-A é utilizado o RPMsg, link a abaixo: https://developer.toradex.com/getting-started/advanced-module-heterogeneous-multicore-processing-hmp/heterogeneous-multicore-processing-hmp-communicating-between-cores-with-rpmsg 3. Não entendi sua duvida, mas pode trabalhar com threads sem problemas, fazendo o… Leia mais »

Diego Sales
Diego Sales
08/12/2018 12:21

Olá Cleiton, Grato por compartilhar seu conhecimento em sistemas embarcado, o post me auxiliou a entender melhor o processo de criar um SO custumizado para o imx7. Sou novo no estudo de SO e sistemas embarcados com linux, fiquei com algumas dúvidas quanto a custimizar o SO para rodar no imx7: 1. Caso eu queira fazer um teste e criar um SO custimizado para efetuar a leitura de sensores na porta i2c e spi, visualizando os resultados e comunicando com a placa via ssh tem como custumizar para esta aplicação especifica e deixar o SO bem enxuto ? quais arquivos… Leia mais »

Anderson Ferreira Rodriguez
Anderson Ferreira Rodriguez
09/09/2018 01:20

Olá Cleiton, Primeiramente parabéns pelo artigo, está sendo de grande ajuda para mim. Estou seguindo os passos da série de artigos e me deparei com uma mensagem de erro que pode acabar ocorrendo com outros leitores e gostaria de compartilhar como resolvi. Estou utilizando como host o Ubuntu 14.04 rodando em um container do docker. Seguindo os passos do artigo no meu host, o processo de build estava sendo interrompido com a seguinte mensagem de erro: ERROR: No recipes available for: /workspace/yocto/poky-sumo/build-trdx-imx7/../meta-angstrom/recipes-tweaks/nginx/nginx_%.bbappend Após pesquisar no índice de camadas do site do OpenEmbedded, verifiquei que a receita para compilar o nginx… Leia mais »

jorgito
jorgito
20/07/2018 03:24

Dear Claiton,
thank You for Your well done step by step guide to build an image for the iMX7.

To build an image I had to write the following line to: /poky-sumo/meta-angstrom/conf/layer.conf

LAYERSERIES_COMPAT_angstrom-layer = “sumo”

to avoid an error message while builing the image….

best regards Jorgito (means Juergen)

Rafael Dias
Rafael Dias
17/07/2018 18:29

Pergunta de n00b: a imagem que construímos neste artigo é a imagem mínima? Se não, qual é a configuração para gerar uma imagem mínima com o yocto?

Home » Linux Embarcado » Criando uma distribuição Linux com Yocto Project para Toradex Colibri i.MX7

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: