From ef2fddc1e1798cd91540439b60001ee0623ee21b Mon Sep 17 00:00:00 2001 From: Sanrio Alvares Date: Fri, 28 Apr 2017 10:54:58 -0700 Subject: [PATCH] periphmraa: fix pwm init sequence Signed-off-by: Sanrio Alvares Signed-off-by: Noel Eck --- include/mraa_adv_func.h | 1 + src/peripheralman/peripheralman.c | 11 +++++------ src/pwm/pwm.c | 27 ++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index 1cf8da3..82c6407 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -86,6 +86,7 @@ typedef struct { mraa_pwm_context (*pwm_init_replace) (int pin); mraa_pwm_context (*pwm_init_internal_replace) (void* func_table, int pin); + mraa_result_t (*pwm_init_raw_replace) (mraa_pwm_context dev, int pin); mraa_result_t (*pwm_init_pre) (int pin); mraa_result_t (*pwm_init_post) (mraa_pwm_context pwm); mraa_result_t (*pwm_period_replace) (mraa_pwm_context dev, int period); diff --git a/src/peripheralman/peripheralman.c b/src/peripheralman/peripheralman.c index dedec49..b084b69 100644 --- a/src/peripheralman/peripheralman.c +++ b/src/peripheralman/peripheralman.c @@ -41,16 +41,15 @@ int uart_busses_count = 0; char **pwm_devices = NULL; int pwm_dev_count = 0; -static mraa_pwm_context -mraa_pman_pwm_init_replace(int pin) +static mraa_result_t +mraa_pman_pwm_init_raw_replace(mraa_pwm_context dev, int pin) { - mraa_pwm_context dev = (mraa_pwm_context) calloc(1, sizeof(struct _pwm)); if (APeripheralManagerClient_openPwm(client, pwm_devices[pin], &dev->bpwm) != 0) { APwm_delete(dev->bpwm); - return NULL; + return MRAA_ERROR_INVALID_HANDLE; } - return dev; + return MRAA_SUCCESS; } static mraa_result_t @@ -866,7 +865,7 @@ mraa_peripheralman_plat_init() b->adv_func->uart_write_replace = &mraa_pman_uart_write_replace; b->adv_func->uart_read_replace = &mraa_pman_uart_read_replace; - b->adv_func->pwm_init_replace = &mraa_pman_pwm_init_replace; + b->adv_func->pwm_init_raw_replace = &mraa_pman_pwm_init_raw_replace; b->adv_func->pwm_period_replace = &mraa_pman_pwm_period_replace; b->adv_func->pwm_duty_cycle_replace = &mraa_pman_pwm_duty_cycle_replace; b->adv_func->pwm_enable_replace = &mraa_pman_pwm_enable_replace; diff --git a/src/pwm/pwm.c b/src/pwm/pwm.c index 85bf66d..133aaf2 100644 --- a/src/pwm/pwm.c +++ b/src/pwm/pwm.c @@ -233,6 +233,7 @@ mraa_pwm_init(int pin) syslog(LOG_ERR, "pwm_init: pin %i beyond platform definition", pin); return NULL; } + if (board->pins[pin].capabilities.pwm != 1) { syslog(LOG_ERR, "pwm_init: pin %i not capable of pwm", pin); return NULL; @@ -274,9 +275,23 @@ mraa_pwm_init(int pin) mraa_pwm_context mraa_pwm_init_raw(int chipin, int pin) { + mraa_result_t status = MRAA_SUCCESS; + mraa_pwm_context dev = mraa_pwm_init_internal(plat == NULL ? NULL : plat->adv_func , chipin, pin); - if (dev == NULL) + if (dev == NULL) { + syslog(LOG_CRIT, "pwm: Failed to allocate memory for context"); + status = MRAA_ERROR_NO_RESOURCES; return NULL; + } + + if (IS_FUNC_DEFINED(dev, pwm_init_raw_replace)) { + status = dev->advance_func->pwm_init_raw_replace(dev, pin); + if (status == MRAA_SUCCESS) { + return dev; + } else { + goto init_raw_cleanup; + } + } char directory[MAX_SIZE]; snprintf(directory, MAX_SIZE, SYSFS_PWM "/pwmchip%d/pwm%d", dev->chipid, dev->pin); @@ -306,7 +321,17 @@ mraa_pwm_init_raw(int chipin, int pin) mraa_pwm_period_us(dev, plat->pwm_default_period); close(export_f); } + mraa_pwm_setup_duty_fp(dev); + +init_raw_cleanup: + if (status != MRAA_SUCCESS) { + if (dev != NULL) { + free(dev); + } + return NULL; + } + return dev; }