Manual

do

Maker

.

com

Compilar programas para Onion Omega

Compilar programas para Onion Omega

Estou preparando um artigo com o meu quarto robô e dessa vez preciso de muitos PWM. Bem, com o sucesso estrondoso que essa plaquinha vem fazendo, chegando agora em sua segunda versão à meros 5 dólares, nada mais apropriado do que controlar esse robô que possui 12 servos utilizando a expansão de PWM, que comporta até 16 servos. Claro, isso necessitará de uma alimentação externa, mas vou deixar os detalhes para o respectivo artigo. -Em relação ao robô só quero deixar esse link das peças impressas em 3D para que caso desejem acompanhar a brincadeira, já possam ir adquirindo as partes necessárias.

Nesse artigo em específico, optei por escrever previamente sobre o ambiente de compilação para que você possa compilar o programa em seu computador e posteriormente tranferí-lo para o seu Onion Omega, já que isso se fará necessário para nosso próximo artigo utilizando essa incrível board.

Cross-compiling para Onion Omega

Alguns passos precisam ser seguidos para que a cross-compilação seja possível. Já descrevi processos semelhantes para ESP8266, Raspberry, outras familias de ARM etc, agora você verá o quão semelhante é o processo. Ainda, caso você não saiba o que é cross-compiling (ou compilação cruzada), farei uma prévia.

Existem diversas arquiteturas de hardware, dentre as mais populares estão IBM x86, ARM e MIPS, sendo essa última a arquitetura do Onion Omega. Um programa compilado para seu notebook (x86) não funcionará em uma MIPS ou ARM e vice-versa. Isso está relacionado à diversos conceitos que não entrarei em detalhes, mas em suma, você pode utilizar seu "poderoso" computador pessoal para gerar binários para outras arquiteturas, utilizando para isso as chamadas "toolchains" e "SDKs".

Instale previamente as ferramentas necessárias

Algumas das ferramentas utilizadas já estão disponíveis nos repositórios das distribuições Linux mais populares, baseadas em Debian (como Ubuntu, Mint e afins). No meu computador uso o Mint, portanto os pacotes serão instalados utilizando apt. Inicialmente serão necessários:

sudo apt-get install -y subversion build-essential libncurses5-dev zlib1g-dev gawk flex quilt git-core unzip libssl-dev

Em seguida (ou durante o processo de instalação do sistema, se quiser otimizar tempo) clone o repositório git do OpenWRT:

mkdir OnionOmega && cd OnionOmega
git clone git://git.openwrt.org/15.05/openwrt.git
cd openwrt

O diferencial desse processo de preparação vem agora. Dentro do diretório openwrt há um arquivo chamado feeds.conf.default. Feeds são repositórios de pacotes que podem ser adicionados ao sistema OpenWRT e esses repositórios de pacotes devem ser adicionados à esse arquivo. Colocamos então o repositório para a Onion Omega:

echo "src-git onion https://github.com/OnionIoT/OpenWRT-Packages.git" >>feeds.conf.default

Esse arquivo já contém alguns repositórios ativos, por isso atente-se em colocar duas vezes o sinal de maior, como na linha de cima, ou então edite o arquivo manualmente e insira a linha entre aspas. Após incluido, você deve fazer um update nesses repositórios executando "./scripts/feeds update -a":

01a.webp

Leva um tempo razoavelmente curto. Após ter incluído esse repositório, você poderá baixar os fontes do que desejar incluir para posterior compilação. Por exemplo, Python:

./scripts/feeds install python

Modificando a imagem

Há alguns anos escrevi sobre como criar pacotes para o build root e escrevi alguns artigos relacionados à cross-compiling. Nesse periodo deixei bastante detalhes sobre as estruturas de um SDK. Aqui vou me ater aos procedimentos para agilizar o processo, já que temos um foco específico.

Prioridade de arquivos

Os arquivos de package/base-file/files  serão sobrescritos pela imagem compilada ao final do processo de compilação. Para adicionar arquivos customizados à imagem compilada, apenas crie um diretório nessa raiz do SDK chamado "files" e os arquivos desse diretório package/base-file/files serão sobrescritos pelo seu diretório.

Seleção de pacotes

Pacotes instalados não são selecionados por padrão quando compilando uma nova imagem, estando indisponíveis no firmware final portanto, se você não encontrar um programa desejado em sua imagem, faça um double-ckecking pra ver se por acaso não esqueceu de selecioná-lo. O processo para a seleção de dos pacotes é bastante simples:

make menuconfig

Se você não tiver a libncurses5-dev instalada, o menu não se abrirá. O mesmo sucederá caso você não tenha uma janela de terminal em tamanho suficientemente grande para comportar o menu.

Na primeira janela que se abre, garanta os seguintes parâmetros

  • Target System é Atheros AR7xxx/AR9xxx
  • Subtarget é Generic
  • Target Profile é Onion Omega
  • Target Images é squashfs.

Se procurar aí no site, falei sobre diversos sistemas de arquivos para embarcados e como extrair o conteúdo dos sistemas a partir de seu respectivo firmware, é uma leitura que vale muito a pena.

Na seleção de pacotes você tem as opções <> para não selecionado, <\*> para selecionado e <M> para módulo. Se usar módulo, o programa será compilado mas não será incluso no firmware.

Após feita sua seleção de pacotes, você será questionado quanto a salvar as alterações feitas, apenas confirme. O próximo passo é compilar o firmware:

make V=s -jN

"N" se refere ao número de núcleos do seu computador que você deseja dedicar à tarefa de compilação do firmware.

Quando concluida a compilação, seu firmware estará disponível em bin/ar71xx. Esse diretório conterá a imagem para full upgrade e a image para upgrade, sendo openwrt*factory.bin e openwrt*sysupgrade.bin respectivamente.

Compilação individual de pacotes

Compilar todo o firmware é um processo demorado, ainda mais se o propósito for apenas compilar seu programinha de acender LED. Claro que você pode fazer a compilação individual dos pacotes. Para isso, precisamos primeiro contruir a toolchain para compilar pacotes e binários. Se você optou por gerar um firmware por qualquer razão, essa toolchain já estará disponível. Se não o fez, o processo é simples:

make tools/install
make toolchain/install

Para compilar um pacote individual agora você passa a linha de comando:

make package/nomeDoPacote/compile

Em nomeDoPacote você deve indicar um dos níveis encontrados em package. Basta dar um 'ls package'. Depois será necessário instalar o pacote compilado, caso esteja gerando um firmware. Nesse caso:

make package/nomeDoPacote/install

E para criar um index do pacote recém-instalado:

make package/index

Como instalar a nova imagem no Onion Omega

Entre no Onion Omega por ssh ou pelo terminal do browser. Entre no diretório /tmp, que é o diretório da ramdisk e possui espaço suficiente para armazenar a imagem. Transfira a imagem de algum modo para /tmp. Na documentação oficial o exemplo é um download com o wget. Apenas para figurar:

wget https://downloads.onion.io/openwrt-ar71xx-generic-onion-omega-squashfs-factory.bin

Uma vez baixada, é hora de eliminar o sistema original. Diga adeus a todo e qualquer vestígio de originalidade do sistema se estiver fazendo o factory com sua própria imagem:

sysupgrade openwrt-ar71xx-generic-onion-omega-squashfs-factory.bin

Para tentar preservar arquivos em /etc, existe uma flag mágica:

sysupgrade -c openwrt-ar71xx-generic-onion-omega-squashfs-factory.bin

Para sobrescrever todas as mudanças em configurações e fazer o dito factory:

sysupgrade -n openwrt-ar71xx-generic-onion-omega-squashfs-factory.bin

A maior parte dessas informações foram tiradas da documentação oficial, mas o link que usei aqui outrora, não mais existe.

Compilar seu próprio programa

Você viu até aqui como compilar um firmware em um ambiente montado para cross-compiling. Mas se você deseja compilar seu próprio arquivo.c será necessário executar outros passos. Inicie baixando a toolchain:

wget -c https://s3-us-west-2.amazonaws.com/onion-cdn/community/openwrt/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2

Após o download, extraia o pacote em um diretório que desejar. Aqui tive que colocar no meu diretório de backups porque já não tenho mais espaço em disco para guardar no home:

tar xvjf OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2

E por fim, exporte os diretórios, seja manualmente ou através de algum arquivo como ~/.profile.

PATH=/media/bkp/OnionOmega/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin:$PATH
STAGING_DIR=/media/bkp/OnionOmega/OpenWrt-Toolchain-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
export STAGING_DIR

Escreva seu programa e então compile-o. Por exemplo:

#include <stdio.h>

int main(void){
    printf("hello world");
    return 0;
}

Salve e então compile:

02a.webp

Como você pode ver, gerei um binário para a arquitetura MIPS (que é a arquitetura do Onion Omega, como supracitado). Depois disso, basta transferir por algum meio para a Onion. Eu transferi por ssh para a raiz. Como você pode ver no código acima, esqueci de colocar "\n" e o resultado foi a PS1 adiante do "hello world":

03a.webp

Sugiro que tenha em memória esse artigo porque lhe auxiliará muito, caso você seja um maker. Também, esse será um dos passos necessários para o próximo artigo com Onion Omega, espero que tenha gostado.

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Dicas extras

Utilizando um dock você poderá alimentar sua Onion Omega diretamente pela USB, pois as docks possuem um regulador de tensão para baixar à 3v3. O pico de consumo é de no máximo 220mA, lembrando que motores devem ser alimentados externamente. Em especial a expansão para servo já oferece um conector jack para entrada de energia.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.