Dando sequência à série de artigos que visa auxiliar no desenvolvimento de produtos que façam uso de multicores assimétricos, baseado no computador em módulo Colibri VF61 (Freescale® Vybrid), este capítulo oferece uma parte prática de tudo que foi discutido nos três artigos anteriores.
Iniciando
Para realizar o curso, disponibilizamos em sua mesa o seguinte material:
- Computador em módulo Colibri VF61;
- Placa Base Iris;
- Placa Acessório (3 botões/3 Leds);
- Cabo Serial + Adaptador DB9 p/ header X13;
- Fonte 12v + Adaptador para ligar na placa;
- Cartão SD com imagem do Linux;
- Cabo de Rede.
Conectando o módulo na placa base
Para inserir o módulo da família colibri, é necessário inserir o módulo na diagonal no conector SODIMM. Lembre-se que esse conector é compatível entre todos os módulos da Família.
Conexão dos cabos
Conecte o cabo serial conforme a figura abaixo no conector X13 e conecte a placa de testes que contém botões e LEDs que serão utilizados nas práticas.
Conecte também o cabo de rede na Ethernet da placa e no computador. Agora no terminal, da máquina Linux, abra o “picocom” na serial correta:
$ picocom -b 115200 /dev/ttyS1
Energize a placa para ver o Linux realizar boot.
Ao terminar, entre com o usuário e senha:
User: root Password: <vazio>
Alterando IP da placa
Alguns comandos podem ser executados para interagir um pouco com a placa. Para trocar o IP por exemplo, execute a seguinte sequência (por favor não altere o mesmo pois está configurado corretamente para a conexão no Eclipse nas práticas que estão na sequência, o IP deve ser 192.168.10.2):
root@apalis-t30:~# connmanctl services
*AO Wired { ethernet_00142d269dfd_cable }
root@colibri-t30:~# connmanctl
connmanctl> config ethernet_00142d259a48_cable --ipv4 manual 192.168.10.2 255.255.255.0 192.168.10.1
connmanctl> exit
Trabalhando com GPIO
Para piscar um led, execute os seguintes comandos:
$ echo 47 > /sys/class/gpio/export $ echo out > /sys/class/gpio/gpio47/direction $ echo 1 > /sys/class/gpio/gpio47/value $ echo 0 /sys/class/gpio/gpio47/value
Exemplo 1 – BlinkLed A5
O primeiro exemplo que vamos executar irá apenas piscar o LED1. Esse exemplo tem como objetivo mostrar a integração do Eclipse com o Linux do A5. Ele já deve estar no seu Eclipse na árvore de projetos.
Na sua máquina virtual, abra o projeto “BlinkLed”. Note que o projeto foi configurado conforme os capítulos anteriores.
Arquivos do projeto
A apiSysClass foi criada para exportar e acessar as GPIOs através do sistema de arquivo do Linux, “/sys/class/gpio”. O arquivo principal, BlinkLed.c utilizando as chamadas para apiSysClass irá, exportar, configurar e Ligar/Desligar o LED1 a cada 500ms.
BlinkLed.c
/*
============================================================================
Name : BlinkLed.c
Author : Raul Munoz
Version :
Copyright : Toradex
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "apiSysClass.h"
int main(int lArgc, char *pcArgv[])
{
int lRet = 0;
// Exporta o LED1 - SODIMM_101 - GPIO_47
lApiSysClassExport(eLED1);
// Configura LED1 para OUTPUT
lApiSysClassDirection(eLED1, eDirection_OutPut);
while(1)
{
lApiSysClassSetValue(eLED1, eValue_Low);
usleep(500000);
lApiSysClassSetValue(eLED1, eValue_High);
usleep(500000);
puts("!!!Hello Vybrid!!!"); /* prints !!!Hello Vybrid!!! */
}
return EXIT_SUCCESS;
}
Compilando para ARM
Na árvore do projeto, existem duas pastas: ARM e DEBUG. Essas pastas contêm os arquivos compilados para as arquiteturas ARM e x86 respectivamente.
Para compilar o projeto para ARM, é necessário certificar-se que o mesmo está configurado para ARM. Aperte botão direito no projeto e selecione: Build Configurations > Set Active > ARM.
Ao selecionar essa configuração o binário será gerado na pasta ARM. Agora podemos compilar os exemplos usando o comando CTRL + B. Ou por meio do menu:
Project > Clean... Project > Build All
Realizando Debug
Uma vez compilado o projeto, é importante atualizar a árvore do projeto para que o Eclipse encontre o arquivo Binário. Clique com o botão direito no projeto e selecione: Refresh.
Para realizar o Debug, acesse o menu:
Run > Debug Configuration
Em seguida clique no botão Debug. Caso a janela de Login na placa apareça, clique em OK para prosseguir. Pode ocorrer também uma solicitação para gerar as chaves de Criptografia, neste caso selecione “Yes”. Nesse momento, uma mensagem solicitando a troca de perspectiva irá aparecer. Ao aceitar, a perspectiva irá trocar para Debug. No menu superior do Eclipse, os botões de debug devem estar habilitados:
Esses botões, respectivamente, tem a seguinte função:
- Resume (Executa a aplicação);
- Suspend (Para a aplicação);
- Terminate (Cancela);
- Disconnect (Desconecta do Target);
- Step Into (Entra em uma determinada função);
- Step Over (Proxima Linha);
- Step Return (Sai da função).
Após os testes para a aplicação através do botão Terminate.
Trocando de Perspectiva
Para voltar a perspectiva anterior, no canto superior direito do Eclipse, selecione o botão C/C++.
Utilize o mesmo menu para voltar a perspectiva Debug.
Finalizando Prática 1
Para fechar o projeto, aperto botão direito no projeto e “Close Project”.
Exemplo 2 – BlinkLed M4
Esse exemplo irá fazer a mesma coisa do exemplo 1 porém comandado pelo M4. Note que nesse exemplo vamos acessar o LED2 e não será possível realizar Debug desse core.
Na sua máquina virtual, abra o projeto “BlinkLed_M4”. Note que o projeto foi configurado conforme os capítulos anteriores.
Arquivos do projeto
O arquivo principal, “BlinkLed_M4.c” acessa uma série de API encontradas na pasta build-tree para configurar e Ligar/Desligar o LED2 a cada 500ms.
BlinkLed_M4.c
/*
* BlinkLed_M4.c
*
* (c) 2015 Toradex AG
*/
#include <stdlib.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_if.h>
#include <math.h>
#include "BlinkLed_M4.h"
#define CYGHWR_HAL_VYBRID_PORT_ALT_GPIO 0
#define CYGHWR_HAL_VYBRID_PORT_INPUT 0x21
#define CYGHWR_HAL_VYBRID_PORT_OUTPUT 0x22
// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16
// SODIMM GPIO PORT IRIS X16
// BOTAO1 98 46 PORTC_1 13
// BOTAO2 133 88 PORTD_9 14
// BOTAP3 103 48 PORTC_3 15
// LED1 101 47 PORTC_2 16
// LED2 97 50 PORTC_5 17
// LED3 85 53 PORTC_8 18
#define BOTAO1 CYGHWR_HAL_VYBRID_PIN(C, 1, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO2 CYGHWR_HAL_VYBRID_PIN(D, 9, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO3 CYGHWR_HAL_VYBRID_PIN(C, 3, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define LED1 CYGHWR_HAL_VYBRID_PIN(C, 2, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED2 CYGHWR_HAL_VYBRID_PIN(C, 5, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED3 CYGHWR_HAL_VYBRID_PIN(C, 8, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16
#define PUL_PWM CYGHWR_HAL_VYBRID_PIN(B, 19, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
//Control variables
//Main Thread
int main(int argc, char **argv)
{
diag_printf("----------------------\n");
diag_printf(" eCos servo drive demo\n");
diag_printf("----------------------\n");
// Initialize GPIO
hal_set_pin_function(LED2);
while (true)
{
hal_gpio_set_pin(LED2);
cyg_thread_delay(500);
hal_gpio_clear_pin(LED2);
cyg_thread_delay(500);
}
}
BlinkLed_M4.h
/* * BlinkLed_M4.h * * (c) 2015 Toradex AG */ #include <stdio.h> #include <unistd.h> #include <cyg/infra/cyg_type.h> #include <cyg/infra/diag.h> #include <cyg/hal/hal_io.h> #include <cyg/hal/var_io.h> #include <cyg/hal/var_io_gpio.h> #include <cyg/io/io.h> #include <cyg/io/serialio.h> #include <cyg/hal/hal_intr.h> #include <cyg/hal/hal_if.h> #include <cyg/kernel/kapi.h> #ifndef BLINKLED_M4__H_ #define BLINKLED_M4__H_ #define MCC_NODE_A5 (0) #define MCC_NODE_M4 (0) #define MCC_SENDER_PORT (1) #define MCC_RESPONDER_PORT (2) void thread_mcc_fn(void); #endif /* BLINKLED_M4__H_ */
Compilando o Firmware para o M4
O projeto já está configurado para compilar utilizando o arquivo makefile. O makefile acessa a toolchain já instalada e gera o arquivo binário final conforme os capítulos anteriores. Compile o projeto conforme o menu:
Project > Clean... Project > Build All
Feito isso, o binário “BlinkLed_M4.bin” será gerado.
Executando o Firmware para o M4
Para executar o firmware, copie o arquivo binário para a placa usando SSH:
scp /home/usuario/curso/workspace/BlinkLed_M4/src/BlinkLed_M4.bin root@192.168.10.2:/home/root/
Acesse o terminal da placa, suba o modulo mcc e em seguida lance a aplicação:
modprobe mcc mqxboot /home/root/ BlinkLed_M4.bin 0x8f000400 0x0f000411
Nesse ponto, será possível ver o LED2 Piscando.
Finalizando Prática 2
Para fechar o projeto, aperto botão direito no projeto e “Close Project”.
Exemplo 3 – ReadSwitch A5
Nesse exemplo, vamos usar o Projeto BlinkLed para implementar a leitura de um botão. Abra o projeto BlinkLed com botão direito em cima do projeto e “Open Project”.
Altere o Código
Vamos alterar o Código C dele para fazermos a seguinte lógica:
- Ler Botão 1, Se pressionado Ligar Led1. Caso contrário, Desligar LED1.
No Final, seu arquivo BlinkLed.c deve ficar assim:
BlinkLed.c
/*
============================================================================
Name : BlinkLed.c
Author : Raul Munoz
Version :
Copyright : Toradex
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "apiSysClass.h"
int main(int lArgc, char *pcArgv[])
{
//Export Pinos
lApiSysClassExport(eLED1);
lApiSysClassExport(eBotao1);
// Seleciona Direção
lApiSysClassDirection(eLED1, eDirection_OutPut);
lApiSysClassDirection(eBotao1, eDirection_Input);
char lBotao1 = 0;
while(1)
{
lBotao1 = lApiSysClassGetValue(eBotao1);
printf("eBotao1 Value %d\n",lBotao1);
lApiSysClassSetValue(eLED1, lBotao1);
usleep(100000);
}
return EXIT_SUCCESS;
}
Compile
Conforme o exemplo anterior, compile usando o menu:
Project > Clean... Project > Build All
Debug
Uma vez compilado o projeto, é importante atualizar a árvore do projeto para que o Eclipse encontre o arquivo Binário. Clique com o botão direito no projeto e selecione:
Refresh
Para realizar o Debug, acesse o menu:
Run > Debug Configuration
Em seguida clique no botão Debug.
Exemplo 4 – ReadSwitch M4
Nesse exemplo, vamos usar o Projeto BlinkLed_M4 para implementar a leitura de um botão. Abra o projeto BlinkLed_M4 com botão direito em cima do projeto e “Open Project”.
Altere o Código
Vamos alterar o código C do projeto para mesma lógica do exemplo anterior, porem usando o LED2 e Botão2:
- Ler Botão 2, Se pressionado Ligar Led2. Caso contrário, Desligar LED2.
No Final, seu arquivo BlinkLed_M4.c deve ficar assim, não esqueça de salvar após executar as alterações:
BlinkLed_M4.c
/*
* BlinkLed_M4.c
*
* (c) 2015 Toradex AG
*/
#include <stdlib.h>
#include <cyg/hal/hal_intr.h>
#include <cyg/hal/hal_if.h>
#include <math.h>
#include "BlinkLed_M4.h"
#define CYGHWR_HAL_VYBRID_PORT_ALT_GPIO 0
#define CYGHWR_HAL_VYBRID_PORT_INPUT 0x21
#define CYGHWR_HAL_VYBRID_PORT_OUTPUT 0x22
// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16
// SODIMM GPIO PORT IRIS X16
// BOTAO1 98 46 PORTC_1 13
// BOTAO2 133 88 PORTD_9 14
// BOTAP3 103 48 PORTC_3 15
// LED1 101 47 PORTC_2 16
// LED2 97 50 PORTC_5 17
// LED3 85 53 PORTC_8 18
#define BOTAO1 CYGHWR_HAL_VYBRID_PIN(C, 1, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO2 CYGHWR_HAL_VYBRID_PIN(D, 9, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define BOTAO3 CYGHWR_HAL_VYBRID_PIN(C, 3, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_INPUT)
#define LED1 CYGHWR_HAL_VYBRID_PIN(C, 2, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED2 CYGHWR_HAL_VYBRID_PIN(C, 5, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
#define LED3 CYGHWR_HAL_VYBRID_PIN(C, 8, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
// PTB19 => GPIO 41 => SO-DIMM 45 => Viola X9, Pin 16
#define PUL_PWM CYGHWR_HAL_VYBRID_PIN(B, 19, CYGHWR_HAL_VYBRID_PORT_ALT_GPIO, CYGHWR_HAL_VYBRID_PORT_OUTPUT)
//Control variables
//Main Thread
int main(int argc, char **argv)
{
diag_printf("----------------------\n");
diag_printf(" eCos servo drive demo\n");
diag_printf("----------------------\n");
// Initialize GPIO
hal_set_pin_function(BOTAO2);
hal_set_pin_function(LED2);
int lBotao2 = 0;
while (true)
{
lBotao2 = hal_gpio_get_pin(BOTAO2);
if(lBotao2 == 1)
{
hal_gpio_set_pin(LED2);
}
else
{
hal_gpio_clear_pin(LED2);
}
cyg_thread_delay(100);
}
}
Compilando o Firmware para o M4
O projeto já está configurado para compilar utilizando o arquivo makefile. O makefile acessa a toolchain já instalada e gera o arquivo binário final conforme os capítulos anteriores.
Compile o projeto conforme o menu:
Project > Clean... Project > Build All
Feito isso, o binário “BlinkLed_M4.bin” será gerado.
Executando o Firmware para o M4
Para executar o firmware, copie o arquivo binario para a placa usando SSH:
scp /home/usuario/curso/workspace/BlinkLed_M4/src/BlinkLed_M4.bin root@192.168.10.2:/home/root/
Acesse o terminal da placa, suba o modulo mcc e em seguida lance a aplicação:
modprobe mcc mqxboot /home/root/BlinkLed_M4.bin 0x8f000400 0x0f000411
Nesse ponto, será possivel ver o LED2 Piscando.
Finalizando Prática 4
Para fechar o projeto, aperto botão direito no projeto e “Close Project”.










Boa tarde
Pode disponibilizar os códigos exemplos?