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:
|
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. |
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
Referências







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 »
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 »
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 »
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 »
Olá Anderson, que bom que está ajudando o artigo. Não tive este reporte referente ao nginx, provavelmente mesmo caso que da linha 35 do local.conf onde adicionei o BBMASK, existem diversos bbappend’s para customizar ou estender algo em receitas, BBMASK é uma boa alternativa caso não queira adicionar a camada.
Mas obrigado por reportar.
Um abraço.
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)
I haven’t had this problem Jorgito, but great placement, this variable is a feature of the new versions to say the branchs compatible with such a layer, important to add when creating one.
In my view should include in the meta-angstrom/conf/layer.conf this variable for the sumo branch, could create a PR in the meta-angstrom on this, would be useful to the maintainers.
And your perfect is fit for the correct operation!
Thanks for sharing!
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?
Olá Rafael, neste artigo console-image seria a image minima baseado no Angstrom, daria para criar uma image menor poderia utilizando DISTRO poky-tiny e a receita core-image-minimal, e claro removendo os pacotes que adicionamos em IMAGE_INSTALL, com certeza ficaria menos de 100M, esta image utilizando Angstrom o UBIFS final esta dando ~105M.
Referências:
https://git.yoctoproject.org/cgit/cgit.cgi/meta-yocto/tree/meta-poky/conf/distro/poky-tiny.conf?h=sumo
https://github.com/openembedded/openembedded-core/blob/sumo/meta/recipes-core/images/core-image-minimal.bb
https://github.com/Angstrom-distribution/meta-angstrom/blob/angstrom-v2018.06-sumo/recipes-images/angstrom/console-image.bb