diff --git a/include/mraa_adv_func.h b/include/mraa_adv_func.h index 4b04802..56ebba2 100644 --- a/include/mraa_adv_func.h +++ b/include/mraa_adv_func.h @@ -54,5 +54,7 @@ typedef struct { mraa_result_t (*aio_init_pre) (unsigned int aio); mraa_result_t (*aio_init_post) (mraa_aio_context dev); + 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); } mraa_adv_func_t; diff --git a/src/pwm/pwm.c b/src/pwm/pwm.c index b848dee..56e8694 100644 --- a/src/pwm/pwm.c +++ b/src/pwm/pwm.c @@ -124,12 +124,26 @@ mraa_pwm_read_duty(mraa_pwm_context dev) mraa_pwm_context mraa_pwm_init(int pin) { + if (advance_func->pwm_init_pre != NULL) { + if (advance_func->pwm_init_pre(pin) != MRAA_SUCCESS) + return NULL; + } mraa_pin_t* pinm = mraa_setup_pwm(pin); if (pinm == NULL) return NULL; int chip = pinm->parent_id; int pinn = pinm->pinmap; free(pinm); + + if (advance_func->gpio_init_post != NULL) { + mraa_pwm_context pret = mraa_pwm_init_raw(chip,pinn); + mraa_result_t ret = advance_func->pwm_init_post(pret); + if (ret != MRAA_SUCCESS) { + free(pret); + return NULL; + } + return pret; + } return mraa_pwm_init_raw(chip,pinn); }