Private
Public Access
2
0

Merge branch 'master' of github.com:tingleby/maa into tingleby-master

This commit is contained in:
Brendan Le Foll
2014-05-06 09:33:19 +01:00
3 changed files with 241 additions and 149 deletions

View File

@@ -1,6 +1,6 @@
/*
* Author: Brendan Le Foll
*
* Author: Brendan Le Foll <brendan.le.foll@intel.com>
* Author: Thomas Ingleby <thomas.c.ingleby@intel.com>
* Copyright © 2014 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -82,35 +82,75 @@ typedef struct {
/*@{*/
unsigned int pin; /**< Raw GPIO pin id */
unsigned int value; /**< Raw GPIO value */
/*@}*/
} maa_mux_t;
/**
* A Strucutre representing a singular I/O pin. i.e GPIO/PWM
*/
typedef struct {
/*@{*/
unsigned int pinmap;
unsigned int parent_id;
unsigned int mux_total;
maa_mux_t mux[6];
/*@}*/
} maa_pin_t;
/**
* A Structure representing a physical Pin.
*/
typedef struct {
/*@{*/
char name[8]; /**< Pin's real world name */
unsigned int pin; /**< Pin ID */
int parent_id; /**< IO Parent ID*/
maa_pincapabilities_t capabilites; /**< Pin Capabiliites */
maa_mux_t mux[4]; /**< Multiplexer array */
unsigned int mux_total; /**< Total Multiplexors required */
maa_pin_t gpio; /**< GPIO structure */
maa_pin_t pwm; /**< PWM structure */
maa_pin_t aio; /**< Anaglog Pin */
maa_pin_t fast_gpio; /**< Fast GPIO */
maa_pin_t i2c; /**< i2c bus/pin */
maa_pin_t spi; /**< spi bus/pin */
/*@}*/
} maa_pininfo_t;
/**
* A Structure representing the physical properties of a i2c bus.
*/
typedef struct {
/*@{*/
unsigned int bus_id; /**< ID as exposed in the system */
unsigned int scl; /**< i2c SCL */
unsigned int sda; /**< i2c SDA */
/*@}*/
} maa_i2c_bus_t;
/**
* A Structure representing the physical properties of a spi bus.
*/
typedef struct {
/*@{*/
double bus_id; /**< The Bus ID as exposed to the system. */
maa_boolean_t three_wire; /**< Is the bus only a three wire system */
unsigned int sclk; /**< Serial Clock */
unsigned int mosi; /**< Master Out, Slave In. */
unsigned int miso; /**< Master In, Slave Out. */
unsigned int cs; /**< Chip Select, used when the board is a spi slave */
/*@}*/
} maa_spi_bus_t;
/**
* A Structure representing a platform/board.
*/
typedef struct {
/*@{*/
unsigned int phy_pin_count; /**< The Total IO pins on board */
unsigned int gpio_count; /**< GPIO Count */
unsigned int aio_count; /**< Analog In Count */
unsigned int pwm_count; /**< PWM Count */
unsigned int aio_count; /**< Analog side Count */
unsigned int i2c_bus_count; /**< Usable i2c Count */
unsigned int i2c_bus[8]; /**< Array of i2c */
maa_i2c_bus_t i2c_bus[6]; /**< Array of i2c */
unsigned int def_i2c_bus; /**< Position in array of default i2c bus */
unsigned int spi_bus_count; /**< Usable spi Count */
double spi_bus[8]; /**< Array of spi */
maa_spi_bus_t spi_bus[6]; /**< Array of spi */
unsigned int def_spi_bus; /**< Position in array of defult spi bus */
maa_pininfo_t* pins; /**< Pointer to pin array */
/*@}*/
} maa_board_t;

View File

@@ -34,193 +34,232 @@ maa_intel_galileo_rev_d()
if(b == NULL)
return NULL;
b->phy_pin_count = 20;
b->gpio_count = 14;
b->aio_count = 6;
b->pwm_count = 5;
b->i2c_bus_count = 1;
b->i2c_bus[0] = 0;
b->spi_bus_count = 1;
b->spi_bus[0] = 1.0;
b->pins = (maa_pininfo_t*) malloc(sizeof(maa_pininfo_t)*25);
//GPIO
//GPIO IO0 - IO10
strncpy(b->pins[0].name, "IO0", 8);
b->pins[0].pin = 50;
b->pins[0].parent_id = 0;
b->pins[0].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,0};
b->pins[0].mux_total = 1;
b->pins[0].mux[0].pin = 40;
b->pins[0].mux[0].value = 1;
b->pins[0].gpio.pinmap = 50;
b->pins[0].gpio.parent_id = 0;
b->pins[0].gpio.mux_total = 1;
b->pins[0].gpio.mux[0].pin = 40;
b->pins[0].gpio.mux[0].value = 1;
strncpy(b->pins[1].name, "IO1", 8);
b->pins[1].pin = 51;
b->pins[1].parent_id = 0;
b->pins[1].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,0};
b->pins[1].mux_total = 1;
b->pins[1].mux[0].pin = 41;
b->pins[1].mux[0].value = 1;
b->pins[1].gpio.pinmap = 51;
b->pins[1].gpio.mux_total = 1;
b->pins[1].gpio.mux[0].pin = 41;
b->pins[1].gpio.mux[0].value = 1;
strncpy(b->pins[2].name, "IO2", 8);
b->pins[2].pin = 32;
b->pins[2].parent_id = 0;
b->pins[2].capabilites = (maa_pincapabilities_t) {1,1,0,1,0,0,0};
b->pins[2].mux_total = 1;
b->pins[2].mux[0].pin = 31;
b->pins[2].mux[0].value = 1;
b->pins[2].gpio.pinmap = 32;
b->pins[2].gpio.mux_total = 1;
b->pins[2].gpio.mux[0].pin = 31;
b->pins[2].gpio.mux[0].value = 1;
strncpy(b->pins[3].name, "IO3", 8);
b->pins[3].pin = 18;
b->pins[3].parent_id = 0;
b->pins[3].capabilites = (maa_pincapabilities_t) {1,1,1,1,0,0,0};
b->pins[3].mux_total = 1;
b->pins[3].mux[0].pin = 30;
b->pins[3].mux[0].value = 1;
b->pins[3].gpio.pinmap = 18;
b->pins[3].gpio.mux_total = 1;
b->pins[3].gpio.mux[0].pin = 30;
b->pins[3].gpio.mux[0].value = 1;
b->pins[3].fast_gpio.pinmap = 15;
b->pins[3].fast_gpio.mux_total = 1;
b->pins[3].fast_gpio.mux[0].pin = 30;
b->pins[3].fast_gpio.mux[0].value = 0;
strncpy(b->pins[4].name, "IO4", 8);
b->pins[4].pin = 28;
b->pins[4].parent_id = 0;
b->pins[4].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,0};
b->pins[4].mux_total = 0;
b->pins[4].gpio.pinmap = 28;
b->pins[4].gpio.mux_total = 0;
strncpy(b->pins[5].name, "IO5", 8);
b->pins[5].pin = 17;
b->pins[5].parent_id = 0;
b->pins[5].capabilites = (maa_pincapabilities_t) {1,1,1,0,0,0,0};
b->pins[5].mux_total = 0;
b->pins[5].gpio.pinmap = 17;
b->pins[5].gpio.mux_total = 0;
b->pins[5].pwm.pinmap = 5;
b->pins[5].pwm.parent_id = 0;
b->pins[5].pwm.mux_total = 0;
strncpy(b->pins[6].name, "IO6", 8);
b->pins[6].pin = 24;
b->pins[6].parent_id = 0;
b->pins[6].gpio.pinmap = 24;
b->pins[6].capabilites = (maa_pincapabilities_t) {1,1,1,0,0,0,0};
b->pins[6].mux_total = 0;
b->pins[6].gpio.mux_total = 0;
b->pins[6].pwm.pinmap = 6;
b->pins[6].pwm.parent_id = 0;
b->pins[6].pwm.mux_total = 0;
strncpy(b->pins[7].name, "IO7", 8);
b->pins[7].pin = 27;
b->pins[7].parent_id = 0;
b->pins[7].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,0};
b->pins[7].mux_total = 0;
b->pins[7].gpio.pinmap = 27;
b->pins[7].gpio.mux_total = 0;
strncpy(b->pins[8].name, "IO8", 8);
b->pins[8].pin = 26;
b->pins[8].parent_id = 0;
b->pins[8].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,0};
b->pins[8].mux_total = 0;
b->pins[8].gpio.pinmap = 26;
b->pins[8].gpio.mux_total = 0;
strncpy(b->pins[9].name, "IO9", 8);
b->pins[9].pin = 19;
b->pins[9].parent_id = 0;
b->pins[9].capabilites = (maa_pincapabilities_t) {1,1,1,0,0,0,0};
b->pins[9].mux_total = 0;
b->pins[9].gpio.pinmap = 19;
b->pins[9].gpio.mux_total = 0;
strncpy(b->pins[10].name, "IO10", 8);
b->pins[10].pin = 16;
b->pins[10].parent_id = 0;
b->pins[10].capabilites = (maa_pincapabilities_t) {1,1,1,0,1,0,0};
b->pins[10].mux_total = 1;
b->pins[10].mux[0].pin = 42;
b->pins[10].mux[0].value = 1;
b->pins[10].gpio.pinmap = 16;
b->pins[10].gpio.mux_total = 1;
b->pins[10].gpio.mux[0].pin = 42;
b->pins[10].gpio.mux[0].value = 1;
b->pins[10].pwm.pinmap = 7;
b->pins[10].pwm.parent_id = 0;
b->pins[10].pwm.mux_total = 1;
b->pins[10].pwm.mux[0].pin = 42;
b->pins[10].pwm.mux[0].value = 1;
b->pins[10].spi.pinmap = 1;
b->pins[10].spi.mux_total = 1;
b->pins[10].spi.mux[0].pin = 42;
b->pins[10].spi.mux[0].value = 0;
strncpy(b->pins[11].name, "IO11", 8);
b->pins[11].pin = 25;
b->pins[11].parent_id = 0;
b->pins[11].capabilites = (maa_pincapabilities_t) {1,1,1,0,1,0,0};
b->pins[11].mux_total = 1;
b->pins[11].mux[0].pin = 43;
b->pins[11].mux[0].value = 1;
b->pins[11].gpio.pinmap = 25;
b->pins[11].gpio.mux_total = 1;
b->pins[11].gpio.mux[0].pin = 43;
b->pins[11].gpio.mux[0].value = 1;
b->pins[11].pwm.pinmap = 4;
b->pins[11].pwm.parent_id = 0;
b->pins[11].pwm.mux_total = 1;
b->pins[11].pwm.mux[0].pin = 43;
b->pins[11].gpio.mux[0].value = 1;
b->pins[11].spi.pinmap = 1;
b->pins[11].spi.mux_total = 1;
b->pins[11].spi.mux[0].pin = 43;
b->pins[11].spi.mux[0].value = 0;
strncpy(b->pins[12].name, "IO12", 8);
b->pins[12].pin = 38;
b->pins[12].parent_id = 0;
b->pins[12].capabilites = (maa_pincapabilities_t) {1,1,1,0,1,0,0};
b->pins[12].mux_total = 1;
b->pins[12].mux[0].pin = 54;
b->pins[12].mux[0].value = 1;
b->pins[12].capabilites = (maa_pincapabilities_t) {1,1,0,0,1,0,0};
b->pins[12].gpio.pinmap = 38;
b->pins[12].gpio.mux_total = 1;
b->pins[12].gpio.mux[0].pin = 54;
b->pins[12].gpio.mux[0].value = 1;
b->pins[12].spi.pinmap = 1;
b->pins[12].spi.mux_total = 1;
b->pins[12].spi.mux[0].pin = 54;
b->pins[12].spi.mux[0].value = 0;
strncpy(b->pins[13].name, "IO13", 8);
b->pins[13].pin = 39;
b->pins[13].parent_id = 0;
b->pins[13].capabilites = (maa_pincapabilities_t) {1,1,1,0,1,0,0};
b->pins[13].mux_total = 1;
b->pins[13].mux[0].pin = 55;
b->pins[13].mux[0].value = 1;
b->pins[13].capabilites = (maa_pincapabilities_t) {1,1,0,0,1,0,0};
b->pins[13].gpio.pinmap = 39;
b->pins[13].gpio.mux_total = 1;
b->pins[13].gpio.mux[0].pin = 55;
b->pins[13].gpio.mux[0].value = 1;
b->pins[13].spi.pinmap = 1;
b->pins[13].spi.mux_total = 1;
b->pins[13].spi.mux[0].pin = 55;
b->pins[13].spi.mux[0].value = 0;
//Analog in mapping and mux.
strncpy(b->pins[14].name, "A0", 8);
b->pins[14].pin = 0;
b->pins[14].parent_id = 0;
b->pins[14].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,1};
b->pins[14].mux_total = 1;
b->pins[14].mux[0].pin = 37;
b->pins[14].mux[0].value = 0;
b->pins[14].gpio.pinmap = 44;
b->pins[14].gpio.mux_total = 1;
b->pins[14].gpio.mux[0].pin = 37;
b->pins[14].gpio.mux[0].value = 1;
b->pins[14].aio.pinmap = 0;
b->pins[14].aio.mux_total = 1;
b->pins[14].aio.mux[0].pin = 37;
b->pins[14].aio.mux[0].value = 0;
strncpy(b->pins[15].name, "A1", 8);
b->pins[15].pin = 1;
b->pins[15].parent_id = 0;
b->pins[15].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,1};
b->pins[15].mux_total = 1;
b->pins[15].mux[0].pin = 36;
b->pins[15].mux[0].value = 0;
b->pins[15].gpio.pinmap = 45;
b->pins[15].gpio.mux_total = 1;
b->pins[15].gpio.mux[0].pin = 36;
b->pins[15].gpio.mux[0].value = 1;
b->pins[15].aio.pinmap = 1;
b->pins[15].aio.mux_total = 1;
b->pins[15].aio.mux[0].pin = 36;
b->pins[15].aio.mux[0].value = 0;
strncpy(b->pins[16].name, "A2", 8);
b->pins[16].pin = 2;
b->pins[16].parent_id = 0;
b->pins[16].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,1};
b->pins[16].mux_total = 1;
b->pins[16].mux[0].pin = 23;
b->pins[16].mux[0].value = 0;
b->pins[16].gpio.pinmap = 46;
b->pins[16].gpio.mux_total = 1;
b->pins[16].gpio.mux[0].pin = 23;
b->pins[16].gpio.mux[0].value = 1;
b->pins[16].aio.pinmap = 2;
b->pins[16].aio.mux_total = 1;
b->pins[16].aio.mux[0].pin = 23;
b->pins[16].aio.mux[0].value = 0;
strncpy(b->pins[17].name, "A3", 8);
b->pins[17].pin = 3;
b->pins[17].parent_id = 0;
b->pins[17].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,0,1};
b->pins[17].mux_total = 1;
b->pins[17].mux[0].pin = 22;
b->pins[17].mux[0].value = 0;
b->pins[17].gpio.pinmap = 47;
b->pins[17].gpio.mux_total = 1;
b->pins[17].gpio.mux[0].pin = 22;
b->pins[17].gpio.mux[0].value = 1;
b->pins[17].aio.pinmap = 3;
b->pins[17].aio.mux_total = 1;
b->pins[17].aio.mux[0].pin = 22;
b->pins[17].aio.mux[0].value = 0;
strncpy(b->pins[18].name, "A4", 8);
b->pins[18].pin = 4;
b->pins[18].parent_id = 0;
b->pins[18].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,1,1};
b->pins[18].mux_total = 2;
b->pins[18].mux[0].pin = 29;
b->pins[18].mux[0].value = 1;
b->pins[18].mux[1].pin = 21;
b->pins[18].mux[1].value = 0;
b->pins[18].gpio.pinmap = 48;
b->pins[18].gpio.mux_total = 2;
b->pins[18].gpio.mux[0].pin = 29;
b->pins[18].gpio.mux[0].value = 1;
b->pins[18].gpio.mux[1].pin = 21;
b->pins[18].gpio.mux[1].value = 1;
b->pins[18].i2c.pinmap = 1;
b->pins[18].i2c.mux_total = 1;
b->pins[18].i2c.mux[0].pin = 29;
b->pins[18].i2c.mux[0].value = 0;
b->pins[18].aio.pinmap = 4;
b->pins[18].aio.mux_total = 2;
b->pins[18].aio.mux[0].pin = 29;
b->pins[18].aio.mux[0].value = 1;
b->pins[18].aio.mux[1].pin = 21;
b->pins[18].aio.mux[1].value = 0;
strncpy(b->pins[19].name, "A5", 8);
b->pins[19].pin = 5;
b->pins[19].parent_id = 0;
b->pins[19].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,1,1};
b->pins[19].mux_total = 2;
b->pins[19].mux[0].pin = 29;
b->pins[19].mux[0].value = 1;
b->pins[19].mux[1].pin = 20;
b->pins[19].mux[1].value = 0;
b->pins[19].gpio.pinmap = 49;
b->pins[19].gpio.mux_total = 2;
b->pins[19].gpio.mux[0].pin = 29;
b->pins[19].gpio.mux[0].value = 1;
b->pins[19].gpio.mux[1].pin = 20;
b->pins[19].gpio.mux[1].value = 1;
b->pins[19].i2c.pinmap = 1;
b->pins[19].i2c.mux_total = 1;
b->pins[19].i2c.mux[0].pin = 29;
b->pins[19].i2c.mux[0].value = 0;
b->pins[19].aio.pinmap = 5;
b->pins[19].aio.mux_total = 2;
b->pins[19].aio.mux[0].pin = 29;
b->pins[19].aio.mux[0].value = 1;
b->pins[19].aio.mux[1].pin = 20;
b->pins[19].aio.mux[1].value = 0;
strncpy(b->pins[20].name, "I2C", 8);
b->pins[20].pin = 0;
b->pins[20].parent_id = 0;
b->pins[20].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,1,1};
b->pins[20].mux_total = 1;
b->pins[20].mux[0].pin = 29;
b->pins[20].mux[0].value = 0;
//BUS DEFINITIONS
b->i2c_bus_count = 1;
b->def_i2c_bus = 0;
b->i2c_bus[0].bus_id = 0;
b->i2c_bus[0].sda = 17;
b->i2c_bus[0].scl = 18;
strncpy(b->pins[21].name, "SPI-1.0", 8);
b->pins[21].pin = 1;
b->pins[21].parent_id = 0;
b->pins[21].capabilites = (maa_pincapabilities_t) {1,1,0,0,0,1,1};
b->pins[21].mux_total = 4;
b->pins[21].mux[0].pin = 42;
b->pins[21].mux[0].value = 0;
b->pins[21].mux[1].pin = 43;
b->pins[21].mux[1].value = 0;
b->pins[21].mux[2].pin = 54;
b->pins[21].mux[2].value = 0;
b->pins[21].mux[3].pin = 55;
b->pins[21].mux[3].value = 0;
b->spi_bus_count = 1;
b->def_spi_bus = 0;
b->spi_bus[0].bus_id = 1;
b->spi_bus[0].cs = 10;
b->spi_bus[0].mosi = 11;
b->spi_bus[0].miso = 12;
b->spi_bus[0].sclk = 13;
return b;
}

View File

@@ -50,7 +50,7 @@ maa_init()
}
static maa_result_t
maa_setup_mux_mapped(maa_pininfo_t meta)
maa_setup_mux_mapped(maa_pin_t meta)
{
int mi;
for (mi = 0; mi < meta.mux_total; mi++) {
@@ -72,12 +72,16 @@ maa_check_gpio(int pin)
if (plat == NULL)
return -1;
if (pin < 0 || pin > plat->gpio_count)
if (pin < 0 || pin > plat->phy_pin_count)
return -1;
if (plat->pins[pin].mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pin]) != MAA_SUCCESS)
if(plat->pins[pin].capabilites.gpio != 1)
return -1;
if (plat->pins[pin].gpio.mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pin].gpio) != MAA_SUCCESS)
return -1;
return plat->pins[pin].pin;
return plat->pins[pin].gpio.pinmap;
}
unsigned int
@@ -91,15 +95,18 @@ maa_check_aio(int aio)
int pin = aio + plat->gpio_count;
if (plat->pins[pin].mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pin]) != MAA_SUCCESS)
return -2;
if(plat->pins[pin].capabilites.aio != 1)
return -1;
if (plat->pins[pin].aio.mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pin].aio) != MAA_SUCCESS)
return -1;
return plat->pins[pin].aio.pinmap;
return plat->pins[pin].pin;
}
unsigned int
maa_check_i2c(int bus)
maa_check_i2c(int bus_s)
{
if (plat == NULL)
return -3;
@@ -108,11 +115,17 @@ maa_check_i2c(int bus)
fprintf(stderr, "No i2c buses defined in platform");
return -1;
}
int pin = (plat->gpio_count + plat->aio_count) + bus;
int bus = 0;
if (plat->pins[pin].mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pin]) != MAA_SUCCESS)
return -2;
int pos = plat->i2c_bus[bus].sda;
if (plat->pins[pos].i2c.mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pos].i2c) != MAA_SUCCESS)
return -2;
return plat->pins[pin].pin;
pos = plat->i2c_bus[bus].scl;
if (plat->pins[pos].i2c.mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pos].i2c) != MAA_SUCCESS)
return -2;
return plat->i2c_bus[bus].bus_id;
}