Private
Public Access
2
0

usb: Added gpio read/write support for ft4222 with i/o expander

Signed-off-by: Henry Bruce <henry.bruce@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Henry Bruce
2015-07-27 09:39:15 -07:00
committed by Brendan Le Foll
parent 11bf69e29a
commit 802c5af986
3 changed files with 299 additions and 120 deletions

View File

@@ -52,56 +52,14 @@ mraa_gpio_get_valfp(mraa_gpio_context dev)
return MRAA_SUCCESS;
}
mraa_gpio_context
mraa_gpio_init(int pin)
static mraa_gpio_context
mraa_gpio_init_internal(mraa_adv_func_t* func_table, int pin)
{
if (plat == NULL) {
syslog(LOG_ERR, "gpio: platform not initialised");
return NULL;
}
if (pin < 0 || pin > plat->phy_pin_count) {
syslog(LOG_ERR, "gpio: pin %i beyond platform definition", pin);
return NULL;
}
if (plat->pins[pin].capabilites.gpio != 1) {
syslog(LOG_ERR, "gpio: pin %i not capable of gpio", pin);
return NULL;
}
if (plat->pins[pin].gpio.mux_total > 0) {
if (mraa_setup_mux_mapped(plat->pins[pin].gpio) != MRAA_SUCCESS) {
syslog(LOG_ERR, "gpio: unable to setup muxes");
return NULL;
}
}
mraa_gpio_context r = mraa_gpio_init_raw(plat->pins[pin].gpio.pinmap);
if (r == NULL) {
syslog(LOG_CRIT, "gpio: mraa_gpio_init_raw(%d) returned error", pin);
return NULL;
}
r->phy_pin = pin;
if (advance_func->gpio_init_post != NULL) {
mraa_result_t ret = advance_func->gpio_init_post(r);
if (ret != MRAA_SUCCESS) {
free(r);
return NULL;
}
}
return r;
}
mraa_gpio_context
mraa_gpio_init_raw(int pin)
{
if (advance_func->gpio_init_pre != NULL) {
if (advance_func->gpio_init_pre(pin) != MRAA_SUCCESS)
return NULL;
}
if (pin < 0)
return NULL;
mraa_result_t status = MRAA_SUCCESS;
char bu[MAX_SIZE];
int length;
@@ -110,6 +68,22 @@ mraa_gpio_init_raw(int pin)
syslog(LOG_CRIT, "gpio: Failed to allocate memory for context");
return NULL;
}
dev->advance_func = func_table;
if (IS_FUNC_DEFINED(dev, gpio_init_internal_replace)) {
status = dev->advance_func->gpio_init_internal_replace(pin);
if (status == MRAA_SUCCESS)
return dev;
else
goto init_internal_cleanup;
}
if (IS_FUNC_DEFINED(dev, gpio_init_pre)) {
status = dev->advance_func->gpio_init_pre(pin);
if (status != MRAA_SUCCESS)
goto init_internal_cleanup;
}
memset(dev, 0, sizeof(struct _gpio));
dev->value_fp = -1;
@@ -127,23 +101,86 @@ mraa_gpio_init_raw(int pin)
int export = open(SYSFS_CLASS_GPIO "/export", O_WRONLY);
if (export == -1) {
syslog(LOG_ERR, "gpio: Failed to open export for writing");
free(dev);
return NULL;
status = MRAA_ERROR_NO_RESOURCES;
goto init_internal_cleanup;
}
length = snprintf(bu, sizeof(bu), "%d", dev->pin);
if (write(export, bu, length * sizeof(char)) == -1) {
syslog(LOG_ERR, "gpio: Failed to write %d to export", dev->pin);
close(export);
free(dev);
return NULL;
status = MRAA_ERROR_NO_RESOURCES;
goto init_internal_cleanup;
}
dev->owner = 1;
close(export);
}
init_internal_cleanup:
if (status != MRAA_SUCCESS) {
if (dev != NULL)
free(dev);
return NULL;
}
return dev;
}
mraa_gpio_context
mraa_gpio_init(int pin)
{
mraa_board_t* board = plat;
if (board == NULL) {
syslog(LOG_ERR, "gpio: platform not initialised");
return NULL;
}
if (mraa_is_on_sub_platform(pin)) {
syslog(LOG_NOTICE, "gpio: Using sub platform");
board = board->sub_platform;
if (board == NULL) {
syslog(LOG_ERR, "gpio: Sub platform Not Initialised");
return NULL;
}
pin = mraa_get_sub_platform_index(pin);
}
if (pin < 0 || pin > board->phy_pin_count) {
syslog(LOG_ERR, "gpio: pin %i beyond platform definition", pin);
return NULL;
}
if (board->pins[pin].capabilites.gpio != 1) {
syslog(LOG_ERR, "gpio: pin %i not capable of gpio", pin);
return NULL;
}
if (board->pins[pin].gpio.mux_total > 0) {
if (mraa_setup_mux_mapped(board->pins[pin].gpio) != MRAA_SUCCESS) {
syslog(LOG_ERR, "gpio: unable to setup muxes");
return NULL;
}
}
mraa_gpio_context r = mraa_gpio_init_internal(board->adv_func, board->pins[pin].gpio.pinmap);
if (r == NULL) {
syslog(LOG_CRIT, "gpio: mraa_gpio_init_raw(%d) returned error", pin);
return NULL;
}
r->phy_pin = pin;
if (IS_FUNC_DEFINED(r, gpio_init_post)) {
mraa_result_t ret = r->advance_func->gpio_init_post(r);
if (ret != MRAA_SUCCESS) {
free(r);
return NULL;
}
}
return r;
}
mraa_gpio_context
mraa_gpio_init_raw(int pin)
{
return mraa_gpio_init_internal(plat == NULL ? NULL : plat->adv_func , pin);
}
static mraa_result_t
mraa_gpio_wait_interrupt(int fd)
@@ -232,6 +269,9 @@ mraa_gpio_interrupt_handler(void* arg)
mraa_result_t
mraa_gpio_edge_mode(mraa_gpio_context dev, mraa_gpio_edge_t mode)
{
if (IS_FUNC_DEFINED(dev, gpio_edge_mode_replace))
return dev->advance_func->gpio_edge_mode_replace(dev, mode);
if (dev->value_fp != -1) {
close(dev->value_fp);
dev->value_fp = -1;
@@ -329,10 +369,10 @@ mraa_gpio_isr_exit(mraa_gpio_context dev)
mraa_result_t
mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
{
if (advance_func->gpio_mode_replace != NULL)
return advance_func->gpio_mode_replace(dev, mode);
if (IS_FUNC_DEFINED(dev, gpio_mode_replace))
return dev->advance_func->gpio_mode_replace(dev, mode);
if (advance_func->gpio_mode_pre != NULL) {
if (IS_FUNC_DEFINED(dev, gpio_mode_pre)) {
mraa_result_t pre_ret = (advance_func->gpio_mode_pre(dev, mode));
if (pre_ret != MRAA_SUCCESS)
return pre_ret;
@@ -378,19 +418,19 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode)
}
close(drive);
if (advance_func->gpio_mode_post != NULL)
return advance_func->gpio_mode_post(dev, mode);
if (IS_FUNC_DEFINED(dev, gpio_mode_post))
return dev->advance_func->gpio_mode_post(dev, mode);
return MRAA_SUCCESS;
}
mraa_result_t
mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir)
{
if (advance_func->gpio_dir_replace != NULL) {
return advance_func->gpio_dir_replace(dev, dir);
}
if (advance_func->gpio_dir_pre != NULL) {
mraa_result_t pre_ret = (advance_func->gpio_dir_pre(dev, dir));
if (IS_FUNC_DEFINED(dev, gpio_dir_replace))
return dev->advance_func->gpio_dir_replace(dev, dir);
if (IS_FUNC_DEFINED(dev, gpio_dir_pre)) {
mraa_result_t pre_ret = (dev->advance_func->gpio_dir_pre(dev, dir));
if (pre_ret != MRAA_SUCCESS) {
return pre_ret;
}
@@ -427,7 +467,7 @@ mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir)
case MRAA_GPIO_OUT:
length = snprintf(bu, sizeof(bu), "out");
break;
case MRAA_GPIO_IN:
case MRAA_GPIO_IN:printf("gpio_init_internal_replace not defined\n");
length = snprintf(bu, sizeof(bu), "in");
break;
case MRAA_GPIO_OUT_HIGH:
@@ -447,8 +487,8 @@ mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir)
}
close(direction);
if (advance_func->gpio_dir_post != NULL)
return advance_func->gpio_dir_post(dev, dir);
if (IS_FUNC_DEFINED(dev, gpio_dir_post))
return dev->advance_func->gpio_dir_post(dev, dir);
return MRAA_SUCCESS;
}
@@ -458,6 +498,9 @@ mraa_gpio_read(mraa_gpio_context dev)
if (dev == NULL)
return -1;
if (IS_FUNC_DEFINED(dev, gpio_read_replace))
return dev->advance_func->gpio_read_replace(dev);
if (dev->mmap_read != NULL)
return dev->mmap_read(dev);