Private
Public Access
2
0

Merge branch 'tingleby-pin'

This commit is contained in:
Brendan Le Foll
2014-05-07 16:01:00 +01:00
2 changed files with 77 additions and 14 deletions

View File

@@ -61,6 +61,19 @@ typedef enum {
*/
typedef unsigned int maa_boolean_t;
/**
* Enum representing different possible modes for a pin.
*/
typedef enum {
MAA_PIN_VALID = 0, /**< Pin Valid */
MAA_PIN_GPIO = 1, /**< General Purpose IO */
MAA_PIN_PWM = 2, /**< Pulse Width Modulation */
MAA_PIN_FAST_GPIO = 3, /**< Faster GPIO */
MAA_PIN_SPI = 4, /**< SPI */
MAA_PIN_I2C = 5, /**< I2C */
MAA_PIN_AIO = 6 /**< Analog in */
} maa_pinmodes_t;
/**
* A bitfield representing the capabilities of a pin.
*/
@@ -208,6 +221,14 @@ const char* maa_get_version();
*/
void maa_result_print(maa_result_t result);
/** Checks if a pin is able to use the passed in mode.
*
* @param pin Physical Pin to be checked.
* @param mode the mode to be tested.
* @return boolean if the mode is supported, 0=false.
*/
maa_boolean_t maa_pin_mode_test(int pin, maa_pinmodes_t mode);
#ifdef __cplusplus
}
#endif

View File

@@ -142,20 +142,20 @@ maa_check_pwm(int pin)
if (plat->pins[pin].capabilites.pwm != 1)
return NULL;
/** quirk in rev d, this messes with pwm on that pin
* if (plat->pins[pin].capabilites.gpio == 1) {
* maa_gpio_context* mux_i;
* mux_i = maa_gpio_init_raw(plat->pins[pin].gpio.pinmap);
* if (mux_i == NULL)
* return NULL;
* if (maa_gpio_dir(mux_i, MAA_GPIO_OUT) != MAA_SUCCESS)
* return NULL;
* if (maa_gpio_write(mux_i, 0) != MAA_SUCCESS)
* return NULL;
* if (maa_gpio_close(mux_i) != MAA_SUCCESS)
* return NULL;
* }
*/
if (plat->pins[pin].capabilites.gpio == 1) {
maa_gpio_context* mux_i;
mux_i = maa_gpio_init_raw(plat->pins[pin].gpio.pinmap);
if (mux_i == NULL)
return NULL;
if (maa_gpio_dir(mux_i, MAA_GPIO_OUT) != MAA_SUCCESS)
return NULL;
// Current REV D quirk. //TODO GEN 2
if (maa_gpio_write(mux_i, 1) != MAA_SUCCESS)
return NULL;
if (maa_gpio_close(mux_i) != MAA_SUCCESS)
return NULL;
}
if (plat->pins[pin].pwm.mux_total > 0)
if (maa_setup_mux_mapped(plat->pins[pin].pwm) != MAA_SUCCESS)
return NULL;
@@ -216,3 +216,45 @@ maa_result_print(maa_result_t result)
break;
}
}
maa_boolean_t
maa_pin_mode_test(int pin, maa_pinmodes_t mode)
{
if (pin > plat->phy_pin_count || pin < 0)
return 0;
switch(mode) {
case MAA_PIN_VALID:
if (plat->pins[pin].capabilites.valid == 1)
return 1;
break;
case MAA_PIN_GPIO:
if (plat->pins[pin].capabilites.gpio ==1)
return 1;
break;
case MAA_PIN_PWM:
if (plat->pins[pin].capabilites.pwm ==1)
return 1;
break;
case MAA_PIN_FAST_GPIO:
if (plat->pins[pin].capabilites.fast_gpio ==1)
return 1;
break;
case MAA_PIN_SPI:
if (plat->pins[pin].capabilites.spi ==1)
return 1;
break;
case MAA_PIN_I2C:
if (plat->pins[pin].capabilites.i2c ==1)
return 1;
break;
case MAA_PIN_AIO:
if (pin < plat->aio_count)
pin = pin + plat->gpio_count;
if (plat->pins[pin].capabilites.aio ==1)
return 1;
break;
default: break;
}
return 0;
}