Private
Public Access
2
0

periphmraa: fix pwm init sequence

Signed-off-by: Sanrio Alvares <sanrio.alvares@intel.com>
Signed-off-by: Noel Eck <noel.eck@intel.com>
This commit is contained in:
Sanrio Alvares
2017-04-28 10:54:58 -07:00
parent ce0edf0f62
commit ef2fddc1e1
3 changed files with 32 additions and 7 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}