From 47728b4c1dcd65f7e59cf36c65da6364afa749b3 Mon Sep 17 00:00:00 2001 From: Mihai Tudor Panu Date: Fri, 22 Jun 2018 14:07:31 -0700 Subject: [PATCH] gpio: adjust adv function hooks to fix subplatforms The chardev feature changed the flow for most GPIO functions but did not take into account existing function hooks correctly. This fixes the checks and restores subplatform GPIO access. Signed-off-by: Mihai Tudor Panu --- src/gpio/gpio.c | 99 +++++++++++++++++++++++++------------------------ 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/src/gpio/gpio.c b/src/gpio/gpio.c index 6557515..81d137f 100644 --- a/src/gpio/gpio.c +++ b/src/gpio/gpio.c @@ -172,11 +172,6 @@ mraa_gpio_init(int pin) return NULL; } - if (board->chardev_capable) { - int pins[1] = { pin }; - return mraa_gpio_init_multi(pins, 1); - } - if (mraa_is_sub_platform_id(pin)) { syslog(LOG_NOTICE, "gpio%i: init: Using sub platform", pin); board = board->sub_platform; @@ -187,6 +182,11 @@ mraa_gpio_init(int pin) pin = mraa_get_sub_platform_index(pin); } + if (board->chardev_capable) { + int pins[1] = { pin }; + return mraa_gpio_init_multi(pins, 1); + } + if (pin < 0 || pin >= board->phy_pin_count) { syslog(LOG_ERR, "gpio: init: pin %i beyond platform pin count (%i)", pin, board->phy_pin_count); @@ -941,6 +941,16 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode) syslog(LOG_ERR, "gpio: mode: context is invalid"); return MRAA_ERROR_INVALID_HANDLE; } + + if (IS_FUNC_DEFINED(dev, gpio_mode_replace)) + return dev->advance_func->gpio_mode_replace(dev, mode); + + if (IS_FUNC_DEFINED(dev, gpio_mode_pre)) { + mraa_result_t pre_ret = (dev->advance_func->gpio_mode_pre(dev, mode)); + if (pre_ret != MRAA_SUCCESS) + return pre_ret; + } + if (plat->chardev_capable) { unsigned flags = 0; int line_handle; @@ -948,7 +958,6 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode) _mraa_close_gpio_desc(dev); - /* We save flag values from the first valid line. */ for_each_gpio_group(gpio_iter, dev) { mraa_gpiod_line_info* linfo = mraa_get_line_info_by_chip_number(gpio_iter->gpio_chip, gpio_iter->gpio_lines[0]); @@ -988,14 +997,6 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode) gpio_iter->gpiod_handle = line_handle; } } else { - if (IS_FUNC_DEFINED(dev, gpio_mode_replace)) - return dev->advance_func->gpio_mode_replace(dev, mode); - - if (IS_FUNC_DEFINED(dev, gpio_mode_pre)) { - mraa_result_t pre_ret = (dev->advance_func->gpio_mode_pre(dev, mode)); - if (pre_ret != MRAA_SUCCESS) - return pre_ret; - } if (dev->value_fp != -1) { close(dev->value_fp); @@ -1037,10 +1038,11 @@ mraa_gpio_mode(mraa_gpio_context dev, mraa_gpio_mode_t mode) } close(drive); - if (IS_FUNC_DEFINED(dev, gpio_mode_post)) - return dev->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; } @@ -1104,24 +1106,23 @@ mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir) return MRAA_ERROR_INVALID_HANDLE; } + 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; + } + } + if (plat->chardev_capable) return mraa_gpio_chardev_dir(dev, dir); mraa_gpio_context it = dev; while (it) { - - if (IS_FUNC_DEFINED(it, gpio_dir_replace)) { - return it->advance_func->gpio_dir_replace(it, dir); - } - - if (IS_FUNC_DEFINED(it, gpio_dir_pre)) { - mraa_result_t pre_ret = (it->advance_func->gpio_dir_pre(it, dir)); - if (pre_ret != MRAA_SUCCESS) { - return pre_ret; - } - } - if (it->value_fp != -1) { close(it->value_fp); it->value_fp = -1; @@ -1173,12 +1174,12 @@ mraa_gpio_dir(mraa_gpio_context dev, mraa_gpio_dir_t dir) } close(direction); - if (IS_FUNC_DEFINED(it, gpio_dir_post)) - return it->advance_func->gpio_dir_post(it, dir); - it = it->next; } + if (IS_FUNC_DEFINED(dev, gpio_dir_post)) + return dev->advance_func->gpio_dir_post(dev, dir); + return MRAA_SUCCESS; } @@ -1190,6 +1191,10 @@ mraa_gpio_read_dir(mraa_gpio_context dev, mraa_gpio_dir_t *dir) /* Initialize with 'unusable'. */ unsigned flags = GPIOLINE_FLAG_KERNEL; + if (IS_FUNC_DEFINED(dev, gpio_read_dir_replace)) { + return dev->advance_func->gpio_read_dir_replace(dev, dir); + } + if (plat->chardev_capable) { mraa_gpiod_group_t gpio_iter; @@ -1227,10 +1232,6 @@ mraa_gpio_read_dir(mraa_gpio_context dev, mraa_gpio_dir_t *dir) return MRAA_ERROR_INVALID_HANDLE; } - if (IS_FUNC_DEFINED(dev, gpio_read_dir_replace)) { - return dev->advance_func->gpio_read_dir_replace(dev, dir); - } - snprintf(filepath, MAX_SIZE, SYSFS_CLASS_GPIO "/gpio%d/direction", dev->pin); fd = open(filepath, O_RDONLY); if (fd == -1) { @@ -1268,6 +1269,10 @@ mraa_gpio_read(mraa_gpio_context dev) return -1; } + if (IS_FUNC_DEFINED(dev, gpio_read_replace)) { + return dev->advance_func->gpio_read_replace(dev); + } + if (plat->chardev_capable) { int output_values[1] = { 0 }; @@ -1277,10 +1282,6 @@ mraa_gpio_read(mraa_gpio_context dev) return output_values[0]; } - 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); } @@ -1371,16 +1372,6 @@ mraa_gpio_write(mraa_gpio_context dev, int value) return MRAA_ERROR_INVALID_HANDLE; } - if (plat->chardev_capable) { - int input_values[1] = { value }; - - return mraa_gpio_write_multi(dev, input_values); - } - - if (dev->mmap_write != NULL) { - return dev->mmap_write(dev, value); - } - if (IS_FUNC_DEFINED(dev, gpio_write_pre)) { mraa_result_t pre_ret = (dev->advance_func->gpio_write_pre(dev, value)); if (pre_ret != MRAA_SUCCESS) @@ -1391,6 +1382,16 @@ mraa_gpio_write(mraa_gpio_context dev, int value) return dev->advance_func->gpio_write_replace(dev, value); } + if (plat->chardev_capable) { + int input_values[1] = { value }; + + return mraa_gpio_write_multi(dev, input_values); + } + + if (dev->mmap_write != NULL) { + return dev->mmap_write(dev, value); + } + if (dev->value_fp == -1) { if (_mraa_gpio_get_valfp(dev) != MRAA_SUCCESS) { return MRAA_ERROR_INVALID_RESOURCE;