Compilar programas para Onion Omega

onionOmega com expansão relé
onionOmega com expansão relé

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:

Em seguida (ou durante o processo de instalação do sistema, se quiser otimizar tempo) clone o repositório git do 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:

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”:

Atualização dos repositórios
Atualização dos repositórios

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:

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:

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:

“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:

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

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:

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

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:

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:

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

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

A maior parte dessas informações foram tiradas da documentação oficial:

https://wiki.onion.io/tutorials/cross-compile

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:

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:





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

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

Salve e então compile:

Cross-compiling
Cross-compiling

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”:

Execução do hello world
Execução do hello world

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 newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

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.

As docks já tem uma identificação fabulosa sobre a pinagem, mas se você adquiriu sua Onion Omega sem uma dock, nesse link você vê o pinout dela. Ou nesse outro.

 

 

 

 

 

 

 

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.