maa: add support for enabling pins and pulldowns
* Not Complete Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
This commit is contained in:
@@ -108,15 +108,23 @@ typedef struct {
|
|||||||
/*@}*/
|
/*@}*/
|
||||||
} maa_mux_t;
|
} maa_mux_t;
|
||||||
|
|
||||||
/**
|
typedef struct {
|
||||||
* A Strucutre representing a singular I/O pin. i.e GPIO/PWM
|
maa_boolean_t complex_pin:1;
|
||||||
*/
|
maa_boolean_t output_en:1;
|
||||||
|
maa_boolean_t output_en_high:1;
|
||||||
|
maa_boolean_t pullup_en:1;
|
||||||
|
maa_boolean_t pullup_en_hiz:1;
|
||||||
|
} maa_pin_cap_complex_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/*@{*/
|
/*@{*/
|
||||||
unsigned int pinmap; /**< sysfs pin */
|
unsigned int pinmap; /**< sysfs pin */
|
||||||
unsigned int parent_id; /** parent chip id */
|
unsigned int parent_id; /** parent chip id */
|
||||||
unsigned int mux_total; /** Numfer of muxes needed for operation of pin */
|
unsigned int mux_total; /** Numfer of muxes needed for operation of pin */
|
||||||
maa_mux_t mux[6]; /** Array holding information about mux */
|
maa_mux_t mux[6]; /** Array holding information about mux */
|
||||||
|
unsigned int output_enable; /** Output Enable GPIO, for level shifting */
|
||||||
|
unsigned int pullup_enable; /** Pull-Up enable GPIO, inputs */
|
||||||
|
maa_pin_cap_complex_t complex_cap;
|
||||||
/*@}*/
|
/*@}*/
|
||||||
} maa_pin_t;
|
} maa_pin_t;
|
||||||
|
|
||||||
|
|||||||
@@ -69,3 +69,10 @@ maa_pin_t* maa_setup_pwm(int pin);
|
|||||||
* @return maa_mmap_pin_t
|
* @return maa_mmap_pin_t
|
||||||
*/
|
*/
|
||||||
maa_mmap_pin_t* maa_setup_mmap_gpio(int pin);
|
maa_mmap_pin_t* maa_setup_mmap_gpio(int pin);
|
||||||
|
|
||||||
|
/** Swap Directional mode.
|
||||||
|
*
|
||||||
|
* @param pin physical pin to operate on
|
||||||
|
* @return out direction to setup. 1 for output 0 for input
|
||||||
|
*/
|
||||||
|
maa_result_t maa_swap_complex_gpio(int pin, int out);
|
||||||
|
|||||||
@@ -368,9 +368,11 @@ maa_gpio_dir(maa_gpio_context dev, gpio_dir_t dir)
|
|||||||
|
|
||||||
char bu[MAX_SIZE];
|
char bu[MAX_SIZE];
|
||||||
int length;
|
int length;
|
||||||
|
int out_switch = 0;
|
||||||
switch(dir) {
|
switch(dir) {
|
||||||
case MAA_GPIO_OUT:
|
case MAA_GPIO_OUT:
|
||||||
length = snprintf(bu, sizeof(bu), "out");
|
length = snprintf(bu, sizeof(bu), "out");
|
||||||
|
out_switch = 1;
|
||||||
break;
|
break;
|
||||||
case MAA_GPIO_IN:
|
case MAA_GPIO_IN:
|
||||||
length = snprintf(bu, sizeof(bu), "in");
|
length = snprintf(bu, sizeof(bu), "in");
|
||||||
@@ -380,6 +382,12 @@ maa_gpio_dir(maa_gpio_context dev, gpio_dir_t dir)
|
|||||||
return MAA_ERROR_FEATURE_NOT_IMPLEMENTED;
|
return MAA_ERROR_FEATURE_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dev->phy_pin >= 0) {
|
||||||
|
maa_result_t swap_res = maa_swap_complex_gpio(dev->phy_pin, out_switch);
|
||||||
|
if (swap_res != MAA_SUCCESS)
|
||||||
|
return swap_res;
|
||||||
|
}
|
||||||
|
|
||||||
if (write(direction, bu, length*sizeof(char)) == -1) {
|
if (write(direction, bu, length*sizeof(char)) == -1) {
|
||||||
fprintf(stderr, "Failed to write to direction\n");
|
fprintf(stderr, "Failed to write to direction\n");
|
||||||
close(direction);
|
close(direction);
|
||||||
|
|||||||
44
src/maa.c
44
src/maa.c
@@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
//static maa_pininfo_t* pindata;
|
//static maa_pininfo_t* pindata;
|
||||||
static maa_board_t* plat = NULL;
|
static maa_board_t* plat = NULL;
|
||||||
|
static maa_platform_t platform_type = 99;
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
maa_get_version()
|
maa_get_version()
|
||||||
@@ -63,7 +64,7 @@ maa_init()
|
|||||||
Py_InitializeEx(0);
|
Py_InitializeEx(0);
|
||||||
PyEval_InitThreads();
|
PyEval_InitThreads();
|
||||||
#endif
|
#endif
|
||||||
maa_platform_t platform_type = MAA_UNKNOWN_PLATFORM;
|
platform_type = MAA_UNKNOWN_PLATFORM;
|
||||||
|
|
||||||
// detect a galileo gen2 board
|
// detect a galileo gen2 board
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
@@ -375,3 +376,44 @@ maa_setup_mmap_gpio(int pin)
|
|||||||
maa_mmap_pin_t *ret = &(plat->pins[pin].mmap);
|
maa_mmap_pin_t *ret = &(plat->pins[pin].mmap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
maa_result_t
|
||||||
|
maa_swap_complex_gpio(int pin, int out)
|
||||||
|
{
|
||||||
|
if (plat == NULL)
|
||||||
|
return MAA_ERROR_INVALID_PLATFORM;
|
||||||
|
|
||||||
|
printf("SWAP CALLED on %i with bool as %i", pin,out);
|
||||||
|
|
||||||
|
switch (platform_type) {
|
||||||
|
case MAA_INTEL_GALILEO_GEN2:
|
||||||
|
printf("Intel Galileo Gen 2\n");
|
||||||
|
if (plat->pins[pin].gpio.complex_cap.complex_pin != 1)
|
||||||
|
return MAA_SUCCESS;
|
||||||
|
if (plat->pins[pin].gpio.complex_cap.output_en == 1) {
|
||||||
|
maa_gpio_context output_e;
|
||||||
|
printf("Doing stuff here with %i", plat->pins[pin].gpio.output_enable);
|
||||||
|
output_e = maa_gpio_init_raw(plat->pins[pin].gpio.output_enable);
|
||||||
|
if (maa_gpio_dir(output_e, MAA_GPIO_OUT) != MAA_SUCCESS)
|
||||||
|
return MAA_ERROR_INVALID_RESOURCE;
|
||||||
|
int output_val;
|
||||||
|
if (plat->pins[pin].gpio.complex_cap.output_en_high == 1)
|
||||||
|
output_val = out;
|
||||||
|
else
|
||||||
|
if (out == 1)
|
||||||
|
output_val = 0;
|
||||||
|
else
|
||||||
|
output_val = 1;
|
||||||
|
if (maa_gpio_write(output_e, output_val) != MAA_SUCCESS)
|
||||||
|
return MAA_ERROR_INVALID_RESOURCE;
|
||||||
|
}
|
||||||
|
//if (plat->pins[pin].gpio.complex_cap.pullup_en == 1) {
|
||||||
|
// maa_gpio_context pullup_e;
|
||||||
|
// pullup_e = maa_gpio_init_raw(plat->pins[pin].gpio.pullup_enable);
|
||||||
|
// if (maa_gpio_mode(pullup_e, MAA_GPIO_HIZ) != MAA_SUCCESS)
|
||||||
|
// return MAA_ERROR_INVALID_RESOURCE;
|
||||||
|
//}
|
||||||
|
break;
|
||||||
|
default: return MAA_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user