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;