Introduction: Desenvolvendo Aplicações Analógicas Para Dragonboard 410c Com Linker Sprite Mezzanine

About: Frederico Martins Pedroso Junior - Embedded Software Engineer.

Essa publicação tem como objetivo mostrar os passos necessários para desenvolver aplicações analógicas usando Dragonboard 410c e Linker Sprite Mezzanine.

Step 1: Pré Requisitos:

Step 2: Como Funciona a Comunicação Analógica Entre Dragonboard 410c E Linker Sprite Mezzanine

O Linker Sprite Mezzanine tem um chip ADC integrado para que módulos analógicos possam ser usados através da Dragonboard 410c.

O chip ADC usado é o MCP3004 e comunica com a Dragonboard 410c através da interface SPI.

Step 3: Habilitando Interface SPI Na Dragonboard 410c

Você pode gerar um novo boot image para Dragonboard 410c com SPI habilitado, ou usar esse boot image já compilado e com SPI habilitado.

Como fleshar o boot image na Dragonboard 410c?

Após obter o boot image com SPI habilitado, o próximo passo é fleshar esse boot image na Dragonboard 410c.

Step 4: Biblioteca Libsoc

libsoc é a biblioteca que vamos usar para desenvolver aplicações analógicas na Dragonboard 410c com Linker Sprite Mezzanine.

As dependências da biblioteca libsoc são:

  • build-essential

  • autoconf

  • automake

  • libtool-bin

  • pkg-config

  • python-dev

sudo apt-get install build-essential autoconf automake libtool-bin pkg-config python-dev

Pronto! Feito isso, temos o ambiente preparado para instalar a biblioteca libsoc.

Step 5: Instalando Libsoc Na Dragonboard 410c

Seguem as etapas para instalar a biblioteca libsoc:

wget -c https://github.com/jackmitch/libsoc/archive/0.8.2.zip
unzip 0.8.2.zip cd libsoc-0.8.2 autoreconf -i ./configure --enable-python=2 --enable-board=dragonboard410c --with-board-configs make sudo make install sudo ldconfig /usr/local/lib sudo reboot

Step 6: Exemplo: Sliding Rheostat

Considerando que o módulo Sliding Rheostat esteja plugado na porta ADC1 do Linker Sprite Mezzanine, siga os próximos passos para executar o código.

Código:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <linux/spi/spidev.h>
#include <linux/types.h>
#include <inttypes.h>
 
#include "libsoc_spi.h"
#include "libsoc_gpio.h"
#include "libsoc_debug.h"
 
#define GPIO_CS 18
 
static uint8_t tx[3],rx[3];
 
int main() {
    int adc_value;
    gpio *gpio_cs;
    libsoc_set_debug(0);

    gpio_cs = libsoc_gpio_request(GPIO_CS,LS_SHARED);

    if(gpio_cs == NULL) {
    goto fail;
    }

    libsoc_gpio_set_direction(gpio_cs,OUTPUT);

    if(libsoc_gpio_get_direction(gpio_cs) != OUTPUT){
    printf("Failed to set direction to OUTPUT!\n");
    goto fail;  
    }
    
   spi *spi_dev = libsoc_spi_init(0,0);   
     
   if(!spi_dev){
    printf("Failed to get spidev device!\n");
    return EXIT_FAILURE;
   }


   libsoc_spi_set_mode(spi_dev,MODE_0);
   libsoc_spi_get_mode(spi_dev);
   libsoc_spi_set_speed(spi_dev,10000);
   libsoc_spi_get_speed(spi_dev);
   libsoc_spi_set_bits_per_word(spi_dev,BITS_8);
   libsoc_spi_get_bits_per_word(spi_dev);
 
   tx[0] = 0x01;
   tx[1] = 0x80;
   tx[2] = 0x00;
   while(1) {
    libsoc_gpio_set_level(gpio_cs,HIGH);
    usleep(10);
    libsoc_gpio_set_level(gpio_cs,LOW);
    libsoc_spi_rw(spi_dev,tx,rx,3);
    libsoc_gpio_set_level(gpio_cs,HIGH);
 
    adc_value = (rx[1]<<8)&0b1100000000;
    adc_value |= (rx[2]&0xff);
 
    printf("adc_value:%d\n",adc_value);
    sleep(1);
   }

   free:
   libsoc_spi_free(spi_dev);
   fail:
   if(gpio_cs) {
    libsoc_gpio_free(gpio_cs);
   }

   return EXIT_SUCCESS;
}

Salve o código como: slide.c

Compile o código:

gcc slide.c -o slide -lsoc

Execute o projeto:

sudo ./slide