Private
Public Access
2
0

pwm: added hooks for subplatform support

Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Mihai Tudor Panu
2016-03-10 11:11:55 -08:00
committed by Brendan Le Foll
parent 537a69923b
commit 603834461f
2 changed files with 39 additions and 17 deletions

View File

@@ -80,9 +80,13 @@ typedef struct {
mraa_result_t (*aio_init_post) (mraa_aio_context dev);
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_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);
float (*pwm_read_replace) (mraa_pwm_context dev);
mraa_result_t (*pwm_write_replace) (mraa_pwm_context dev, float duty);
mraa_result_t (*pwm_enable_replace) (mraa_pwm_context dev, int enable);
mraa_result_t (*spi_init_pre) (int bus);
mraa_result_t (*spi_init_post) (mraa_spi_context spi);

View File

@@ -80,6 +80,9 @@ mraa_pwm_write_period(mraa_pwm_context dev, int period)
static mraa_result_t
mraa_pwm_write_duty(mraa_pwm_context dev, int duty)
{
if (IS_FUNC_DEFINED(dev, pwm_write_replace)) {
return dev->advance_func->pwm_write_replace(dev, duty);
}
if (dev->duty_fp == -1) {
if (mraa_pwm_setup_duty_fp(dev) == 1) {
return MRAA_ERROR_INVALID_HANDLE;
@@ -178,35 +181,44 @@ mraa_pwm_init_internal(mraa_adv_func_t* func_table, int chipin, int pin)
mraa_pwm_context
mraa_pwm_init(int pin)
{
if (plat == NULL) {
mraa_board_t* board = plat;
if (board == NULL) {
syslog(LOG_ERR, "pwm: Platform Not Initialised");
return NULL;
}
if (mraa_is_sub_platform_id(pin)) {
syslog(LOG_NOTICE, "pwm: Using sub platform is not supported");
return NULL;
syslog(LOG_NOTICE, "pwm: Using sub platform");
board = board->sub_platform;
if (board == NULL) {
syslog(LOG_ERR, "pwm: Sub platform Not Initialised");
return NULL;
}
pin = mraa_get_sub_platform_index(pin);
}
if (pin < 0 || pin > plat->phy_pin_count) {
if (pin < 0 || pin > board->phy_pin_count) {
syslog(LOG_ERR, "pwm: pin %i beyond platform definition", pin);
return NULL;
}
if (plat->pins[pin].capabilites.pwm != 1) {
if (board->pins[pin].capabilites.pwm != 1) {
syslog(LOG_ERR, "pwm: pin not capable of pwm");
return NULL;
}
if (plat->adv_func->pwm_init_replace != NULL) {
return plat->adv_func->pwm_init_replace(pin);
if (board->adv_func->pwm_init_replace != NULL) {
return board->adv_func->pwm_init_replace(pin);
}
if (plat->adv_func->pwm_init_pre != NULL) {
if (plat->adv_func->pwm_init_pre(pin) != MRAA_SUCCESS)
if (board->adv_func->pwm_init_internal_replace != NULL) {
return board->adv_func->pwm_init_internal_replace(board->adv_func, pin);
}
if (board->adv_func->pwm_init_pre != NULL) {
if (board->adv_func->pwm_init_pre(pin) != MRAA_SUCCESS)
return NULL;
}
if (plat->pins[pin].capabilites.gpio == 1) {
if (board->pins[pin].capabilites.gpio == 1) {
// This deserves more investigation
mraa_gpio_context mux_i;
mux_i = mraa_gpio_init_raw(plat->pins[pin].gpio.pinmap);
mux_i = mraa_gpio_init_raw(board->pins[pin].gpio.pinmap);
if (mux_i == NULL) {
syslog(LOG_ERR, "pwm: error in gpio->pwm transition");
return NULL;
@@ -225,19 +237,19 @@ mraa_pwm_init(int pin)
}
}
if (plat->pins[pin].pwm.mux_total > 0) {
if (mraa_setup_mux_mapped(plat->pins[pin].pwm) != MRAA_SUCCESS) {
if (board->pins[pin].pwm.mux_total > 0) {
if (mraa_setup_mux_mapped(board->pins[pin].pwm) != MRAA_SUCCESS) {
syslog(LOG_ERR, "pwm: Failed to set-up multiplexer");
return NULL;
}
}
int chip = plat->pins[pin].pwm.parent_id;
int pinn = plat->pins[pin].pwm.pinmap;
int chip = board->pins[pin].pwm.parent_id;
int pinn = board->pins[pin].pwm.pinmap;
if (plat->adv_func->pwm_init_post != NULL) {
if (board->adv_func->pwm_init_post != NULL) {
mraa_pwm_context pret = mraa_pwm_init_raw(chip, pinn);
mraa_result_t ret = plat->adv_func->pwm_init_post(pret);
mraa_result_t ret = board->adv_func->pwm_init_post(pret);
if (ret != MRAA_SUCCESS) {
free(pret);
return NULL;
@@ -304,6 +316,9 @@ mraa_pwm_write(mraa_pwm_context dev, float percentage)
float
mraa_pwm_read(mraa_pwm_context dev)
{
if (IS_FUNC_DEFINED(dev, pwm_read_replace)) {
return dev->advance_func->pwm_read_replace(dev);
}
int period = mraa_pwm_read_period(dev);
if (period > 0) {
return (mraa_pwm_read_duty(dev) / (float) period);
@@ -354,6 +369,9 @@ mraa_pwm_pulsewidth_us(mraa_pwm_context dev, int us)
mraa_result_t
mraa_pwm_enable(mraa_pwm_context dev, int enable)
{
if (IS_FUNC_DEFINED(dev, pwm_enable_replace)) {
return dev->advance_func->pwm_enable_replace(dev, enable);
}
int status;
if (enable != 0) {
status = 1;