Nos últimos meses, diversos artigos sobre o computador em módulo Colibri T20 foram postados no Embarcados. O Colibri T20 é parte integrante da família de computadores pino compatíveis da Toradex que também conta com outros módulos como o Colibri iMX6, Colibri Vybrid VF50, VF61 e diversos módulos baseados na linha PXA Intel Marvel. Veja aqui um comparativo entre os diversos módulos da família Colibri.
No artigo Fast Time to Maket com Computadores em Módulo, Guilherme Fernandes explica as vantagens e as desvantagens do uso de computadores em módulo assim como as características dos produtos comercializados pela Toradex. O produto Colibri T20 apareceu também em outros dois artigos: Desenvolvendo Sistemas Embarcados com Windows Embedded Compact e COM Toradex Colibri T20 e Carrier Board Iris artigo no qual Thiago Lima apresenta o conjunto de módulo e motherboard comercializados pela Toradex.
Acompanhado a linha de artigos envolvendo esse módulo, o tutorial abaixo mostrará os passos necessários para preparar um Build System para o CoM Colibri T20. Com o seu próprio Build System é possível criar personalizações em sua distribuição e como resultado obter sua própria imagem.
A Toradex disponibiliza através do meta-toradex toda a personalização do Linux integrada com o OpenEmbedded. Atualmente, o OpenEmbedded em conjunto com o Yocto tem se tornado mais popular entre os usuários, motivo pelo qual tem crescido o conteúdo informativo sobre ele. Portanto, modificar, adicionar e até mesmo criar seus próprios pacotes se torna mais fácil.
A Toradex fornece imagens Linux pré-compiladas, uma lista das características de nossa imagem Linux pode ser encontrada aqui. A Toradex também oferece uma imagem de teste do Android para nosso Colibri T20. Nos casos em que a utilização da imagem pré-compilada seja suficiente, o usuário as irá encontrar em: https://developer.toradex.com/files/toradex-dev/uploads/media/Colibri/Linux/Images/
Hardware utilizado
Para este tutorial foi utilizado um módulo Colibri T20 em conjunto com placa de suporte Iris Carrier Board (Figura 1). Um monitor DVI foi usado para interface gráfica com o usuário.
Os cabos foram conectados de conforme a Figura 2. Basicamente foi conectado o cabo serial no conector X13, teclado e mouse USB, monitor DVI e alimentação de 6-27V DC.
A Figura 3 mostra como ficou o setup após a conexão dos cabos.
Para agilizar o desenvolvimento, a Toradex disponibiliza uma página com os passo a passo para configurar seu computador e acessar as principais funções do módulo sem a necessidade de passar pelo processo de compilar sua própria imagem.
Preparando ambiente Host
Todo o processo de configuração, compilação e geração da imagem foi realizado em uma máquina virtual “Ubuntu 12.04 – 64-Bits” criada apenas para realização desse tutorial.
Os pacotes exigidos pelo OpenEmbedded e pelo meta-toradex devem ser instalados com o comando abaixo.
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath libsdl1.2-dev xterm uuid-dev:i386 liblzo2-dev:i386 curl
Versões e Branches
Atualmente temos duas versões de build system: V1.X – baseada no OpenEmbedded (Classic) e V2.X – baseada no OpenEmbedded (Core). Esse tutorial utilizará a versão V2.1 no branch dylan. Caso o usuário necessite do branch dora, é preciso usar a versão V2.2. Porém, essa versão só foi testada com o módulo Apalis iMx6.
Ao compilar a versão V2.1 conforme esse tutorial, a imagem gerada deve ser equivalente as imagens pré-compiladas citadas no início desse artigo. Um vez que não será adicionado ou modificado o Build System padrão.
Sincronizando repositório
A partir da versão V2.1, utiliza-se a ferramenta “repo” para gerenciar diferentes repositórios e versões. Isso se fez necessário uma vez que o OpenEmbedded começou a exigir diversos repositórios.
Instalando a ferramenta “repo”
mkdir ~/bin export PATH=~/bin:$PATH curlhttps://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
mkdir oe-core cd oe-core repo init -u https://git.toradex.com/toradex-bsp-platform.git -b LinuxImageV2.1
Antes de iniciar a sincronização, é necessário atualizar duas URLs no arquivo manifest.xml.Criando o diretório onde será realizado o download dos repositórios e a configuração da sua distribuição.
vi .repo/manifest.xml
Altere a URL correspondente ao OpenEmbedded e ao Linaro conforme segue:
<remote fetch="git://git.openembedded.org" name="oe"/> <remote fetch="https://github.com" name="gith"/> <remote fetch="https://git.yoctoproject.org" name="yocto"/> <remote fetch="git://git.linaro.org/openembedded" name="linaro"/> <remote fetch="https://git.toradex.com" name="trdx"/>
repo sync
Em seguida, execute a sincronização com o repositório.
Configurando a compilação
Após finalizada a sincronização, execute o arquivo “export”. Isso irá configurar as variáveis de ambiente. Na primeira execução desse script será criada automaticamente a pasta build com os arquivos de configuração.
. export
Após executar o export, o shell será direcionado automaticamente para o diretório “oe-core/build”.
Sendo assim, modifique o arquivo “local.conf” para configuração seu build.
vim conf/local.conf
Altere o dispositivo modificando a variável MACHINE para colibri T20.
MACHINE ?= "colibri-t20"
As variáveis BB_NUMBER_THREADS e PARALLEL_MAKE configuram respectivamente quantas threads e processadores executarão em paralelo.
Por padrão, o arquivo local config configura o build para remover o diretório work. Isso significa que todo código fonte usado será removido ao final da compilação. Essa configuração é útil no caso de a máquina utilizada no processo ter pouco espaço em disco. Porém, caso seja preciso os códigos-fontes para a personalização de algum pacote, o ideal é comentar a linha abaixo:
#'INHERIT += "rm_work"'
Assim, todos os códigos – fontes serão destinados para a pasta “work”.
Executando a compilação
Agora com o “local.conf” configurado para o build do seu dispositivo é hora de compilar. Tenha em mente que isso pode demorar horas!
bitbake angstrom-lxde-image
Imagens Geradas
Ao terminar a compilação, as imagens estarão no diretório:
cd out-eglibc/deploy/images/colibri-t20/
Entre os arquivos gerados estão: u-boot, root file system e kernel. Porém, o arquivo mais importante para a gravação é: Colibri_T20_LinuxImageV2.1_20140530.tar.bz2
Esse arquivo contém todos os arquivos necessários e o script de atualização.
-rw-r--r--. 1 raul raul 84734938 May 30 18:18 Colibri_T20_LinuxImage.rootfs.tar.bz2
drwxr-xr-x. 5 root root 4096 May 30 18:19 Colibri_T20_LinuxImageV2.1
-rw-r--r--. 1 raul raul 86511757 May 30 18:19 Colibri_T20_LinuxImageV2.1_20140530.tar.bz2
lrwxrwxrwx. 1 raul raul 37 May 30 18:19 LXDE-image-colibri-t20.tar.bz2 -> Colibri_T20_LinuxImage.rootfs.tar.bz2
-rw-rw-r--. 1 raul raul 3372643 May 30 16:26 modules--3.1.10+gitrf195d3bc9cfb38159f8a3a299222396e0005aa91-V2.1b3-colibri-t20-20140530123054.tgz
-rw-rw-r--. 1 raul raul 294 May 30 18:15 README_-_DO_NOT_DELETE_FILES_IN_THIS_DIRECTORY.txt
lrwxrwxrwx. 1 raul raul 73 May 30 17:54 u-boot.bin -> u-boot-colibri-t20-r7+gitrccd521c4681a5850bbec1feec140eeaec33936b0-r7.bin
lrwxrwxrwx. 1 raul raul 73 May 30 17:54 u-boot-colibri-t20.bin -> u-boot-colibri-t20-r7+gitrccd521c4681a5850bbec1feec140eeaec33936b0-r7.bin
-rwxr-xr-x. 1 raul raul 557060 May 30 17:54 u-boot-colibri-t20-r7+gitrccd521c4681a5850bbec1feec140eeaec33936b0-r7.bin
lrwxrwxrwx. 1 raul raul 79 May 30 17:54 u-boot-hsmmc.bin -> u-boot-hsmmc-colibri-t20-r7+gitrccd521c4681a5850bbec1feec140eeaec33936b0-r7.bin
lrwxrwxrwx. 1 raul raul 79 May 30 17:54 u-boot-hsmmc-colibri-t20.bin -> u-boot-hsmmc-colibri-t20-r7+gitrccd521c4681a5850bbec1feec140eeaec33936b0-r7.bin
-rwxr-xr-x. 1 raul raul 557964 May 30 17:54 u-boot-hsmmc-colibri-t20-r7+gitrccd521c4681a5850bbec1feec140eeaec33936b0-r7.bin
lrwxrwxrwx. 1 raul raul 97 May 30 16:26 uImage -> uImage--3.1.10+gitrf195d3bc9cfb38159f8a3a299222396e0005aa91-V2.1b3-colibri-t20-20140530123054.bin
-rw-r--r--. 1 raul raul 4438448 May 30 16:26 uImage--3.1.10+gitrf195d3bc9cfb38159f8a3a299222396e0005aa91-V2.1b3-colibri-t20-20140530123054.bin
lrwxrwxrwx. 1 raul raul 97 May 30 16:26 uImage-colibri-t20.bin -> uImage--3.1.10+gitrf195d3bc9cfb38159f8a3a299222396e0005aa91-V2.1b3-colibri-t20-20140530123054.bin
Extraia o arquivo “Colibri_T20_LinuxImageV2.1_20140530.tar.bz2” com permissão de sudo.
sudo tar xjvf Colibri_T20_LinuxImageV2.1_20140530.tar.bz2 cd Colibri_T20_LinuxImageV2.1/
No diretório extraído, encontramos o script de atualização “update.sh”. Para executá-lo é necessário colocar a placa em recovery mode (modo de gravação).
Gravação da Imagem no Módulo
Primeiro conecte o cabo micro USB no conector X12 e no seu computador conforme a Figura 4. Caso esteja usando máquina virtual, lembre-se de adicionar a USB correspondente a VM.
Existem dois métodos de colocar a placa em modo de gravação.
O método mais fácil é por software. Para os casos nos quais as placas ja tenham Linux ou Windows instalados existem comandos de bootloader que colocam o módulo em modo de gravação.
Caso a placa esteja com Linux, execute o comando “enterrcm” no uboot.
U-Boot 2011.06-00002-gcb354a4 (Dec 27 2012 - 19:09:27) ... Hit any key to stop autoboot: 0 Tegra2 # enterrcm Entering RCM...
Para os casos em que o módulo esteja com Windows execute os seguintes comandos no bootloader.
reboot rcm
O segundo método, por Hardware, não precisa ter nenhum bootloader pré-gravado na placa. Para a placa Iris, basta ligar a placa curto-circuitando o pad 1 e 2 do Jumper JPI. Em seguida remova o curto.
Com a placa em modo de gravação e o cabo microSD devidamente conectado será possível localizar o device com o comando:
lsusb | grep -i nvidia Bus 003 Device 009: ID 0955:7820 NVidia Corp. Tegra 2 AC100 developer mode
Agora com a placa pronta para gravação e o dispositivo já reconhecido, execute o script de update com parâmetro -h.
[raul@localhost Colibri_T20_LinuxImageV2.1]$ ./update.sh -h Colibri T20 rootfs detected -g : Forces generation of the rootfs image file, default is to reuse the one from the last run -h : Prints this message -r : T20: Selects RAM size (256 | 512) -v : T20: Selects colibri version (V1_1 | V1_2) -b : T20: Selects boot device (hsmmc/nand) (default: nand) -c : Selects configblock partition only update -d : Selects debug boot loader without flashing -k : Selects kernel partition only update -u : Selects boot loader partition only update Example "./update.sh -r 512 -v V1_2" flashes everything on a Colibri T20 V1.2 with 512MB RAM "./update.sh" flashes everything on Colibri T30 or Apalis T30
Repare que todo módulo tem uma etiqueta de identificação. Nela é possível ver o quanto de RAM tem em seu módulo e também a versão do seu Hardware. Altere os parâmetros para o seu caso e execute a atualização.
./update.sh -r 512 -v V1_2
Aguarde até o final da gravação que terá o resultado abaixo.
done! sending file: u-boot.bin - 557060/557060 bytes sent u-boot.bin sent successfully sending file: uImage / 4438448/4438448 bytes sent uImage sent successfully sending file: USR.yaffs2 \ 341164032/341164032 bytes sent USR.yaffs2 sent successfully
Boot do novo Linux
Reinicie o equipamento e terá o boot da sua imagem.
U-Boot 2011.06 (May 30 2014 - 17:53:24) TEGRA2 DRAM: 512 MiB NAND: 1024 MiB MMC: Tegra2 SD/MMC: 0 Board: Toradex Colibri T20 Net: Net Initialization Skipped No ethernet found. Hit any key to stop autoboot: 0 Booting from NAND... Loading from nand0, offset 0xc80000 Image Name: Linux-3.1.10 Created: 2014-05-30 14:22:30 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size:4438384 Bytes = 4.2 MiB Load Address: 00008000 Entry Point: 00008000 ## Booting kernel from Legacy Image at 00408000 ... Image Name: Linux-3.1.10 Created: 2014-05-30 14:22:30 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size:4438384 Bytes = 4.2 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ... [0.000000] Linux version 3.1.10 (raul@localhost.localdomain) (gcc version 4.7.4 20130903 (prerelease) (Linaro GCC 4.7-2013.09) ) #1 SMP PREEMPT Fri May 30 16:22:12 CEST 2014 [0.000000] CPU: ARMv7 Processor [411fc090] revision 0 (ARMv7), cr=10c5387d [0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache [0.000000] Machine: Toradex Colibri T20 [0.000000] Ignoring unrecognised tag 0x54410008 [0.000000] Found fbmem: 00c00000@17400000 [0.000000] Found nvmem: 08000000@18000000 [0.000000] Tegra reserved memory: [0.000000] LP0: 00000000 - 00000000 [0.000000] Bootloader framebuffer: 17400000 - 17ffffff [0.000000] Bootloader framebuffer2: 00000000 - 00000000 [0.000000] Framebuffer: 16700000 - 16ffffff [0.000000] 2nd Framebuffer: 17000000 - 17ffffff [0.000000] Carveout: 18000000 - 1fffffff [0.000000] Vpr: 00000000 - 00000000 [0.000000] Memory policy: ECC disabled, Data cache writealloc [0.000000] Tegra SKU: 8 Rev: A04 CPU Process: 1 Core Process: 2 Speedo ID: 1 [0.000000] Tegra Revision: A04 prime SKU: 0x8 CPU Process: 1 Core Process: 2 … … … [ OK ] Started Getty on tty1. Starting Serial Getty on ttyS0... [ OK ] Started Serial Getty on ttyS0. [ OK ] Reached target L[ 29.101983] tegradc tegradc.1: switching framebuffer to 640x480 [ 29.102013] tegradc tegradc.1: using mode 640x480 pclk=25175000 href=1 vref=1 [ 29.589088] wm97xx-ts 0-0:wm9712-codec: No IRQ specified .---O---. | | .-. o o | | |-----.-----.-----.| | .----..-----.-----. | | | __ | ---'| '--.| .-'| | | | | | | | |--- || --'| | | ' | | | | '---'---'--'--'--. |-----''----''--' '-----'-'-'-' -' | '---' The Angstrom Distribution colibri-t20 ttyS0 Angstrom v2013.06 - Kernel 3.1.10 Colibri_T20_LinuxImageV2.1_20140530 colibri-t20 login: [ 31.938505] tegradc tegradc.0: switching framebuffer to 640x480 [ 31.938579] tegradc tegradc.0: Calculated sync href=0 vref=1 [ 31.938616] tegradc tegradc.0: using mode 640x480 pclk=25175000 href=0 vref=1 [ 32.218225] tegradc tegradc.1: switching framebuffer to 640x480 [ 32.218268] tegradc tegradc.1: using mode 640x480 pclk=25175000 href=1 vref=1 [ 32.408804] wm97xx-ts 0-0:wm9712-codec: No IRQ specified
Loge com usuario “root” e sem senha.
Agora temos o Build System completo. Para listar os comandos já instalados na sua imagem execute:
opkg list-installed
Comandos úteis usando bitbake
1. O parâmentro “-k” configura o bitbake para continuar compilando os pacotes independentemente da ocorrência de algum erro.
bitbake -k angstrom-lxde-image
2. Caso seja necessário consultar as variáveis de ambiente ou obter informações do Build System, use o comando abaixo.
bitbake -e virtual/kernel bitbake -e virtual/kernel | grep ^WORKDIR
3. Para listar todas as tasks existentes em uma receita:
bitbake -c listtasks virtual/kernel
4. Listar todos os pacotes disponíveis em seu Build System:
bitbake -s Recipe Name Latest Version abiword :2.8.6-r8 accel-ppp :1.7.3+git-r1 acl :2.2.51-r3 acl-native :2.2.51-r3 acpid :1.0.10-r0 adt-installer :0.1.8+svnr596-r11 alsa-lib :1.0.26-r0 alsa-lib-native :1.0.26-r0 … … … zip-native :3.0-r2 zlib :1.2.7-r0 zlib-native :1.2.7-r0 znc :1.0+git-r0 zram :0.1-r3 zsh :5.0.0-r0 Summary: There was 1 WARNING message shown.
Sobre a Toradex Brasil
Seguindo sua política global de vendas diretas e contato próximo com o cliente, a Toradex está abrindo no início de 2014 um escritório de vendas e assistência no Brasil para atender toda a América Latina. Em breve você poderá comprar os produtos da empresa, em qualquer quantidade, sem a necessidade de importação, além de contar com suporte gratuito em português para seu desenvolvimento.
Toradex Brasil
Rua Luiz Spiandoreli Neto Nº 60 – Ed. Paineiras, Sala 304 Valinhos – SP | Brazil
T: +55 19 3327 3738
Email: brazil@toradex.com , Site: www.toradex.com
Referência e Links adicionais:
(*) esse post foi patrocinado pela Toradex








