mraa_pwm_context mraa_pwm_init(int pin) { mraa_board_t* board = plat; if (board == NULL) { syslog(LOG_ERR, "pwm_init: Platform Not Initialised"); return NULL; } if (mraa_is_sub_platform_id(pin)) { syslog(LOG_NOTICE, "pwm_init: Using sub platform"); board = board->sub_platform; if (board == NULL) { syslog(LOG_ERR, "pwm_init: Sub platform Not Initialised"); return NULL; } pin = mraa_get_sub_platform_index(pin); } if (pin < 0 || pin > board->phy_pin_count) { 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; } if (board->adv_func->pwm_init_replace != NULL) { return board->adv_func->pwm_init_replace(pin); } 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 (board->pins[pin].pwm.mux_total > 0) { if (mraa_setup_mux_mapped(board->pins[pin].pwm) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm_init: Failed to set-up pwm%i multiplexer", pin); return NULL; } } int chip = board->pins[pin].pwm.parent_id; int pinn = board->pins[pin].pwm.pinmap; if (board->adv_func->pwm_init_post != NULL) { mraa_pwm_context pret = mraa_pwm_init_raw(chip, pinn); mraa_result_t ret = board->adv_func->pwm_init_post(pret); if (ret != MRAA_SUCCESS) { free(pret); return NULL; } return pret; } return mraa_pwm_init_raw(chip, pinn); }
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->pwm_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); }
/** * instanciates a PWM object on a pin * * @param pin the pin number used on your board * @param owner if you are the owner of the pin the destructor will * @param chipid the pwmchip to use, use only in raw mode * unexport the pin from sysfs, default behaviour is you are the owner * if the pinmapper exported it */ Pwm(int pin, bool owner = true, int chipid = -1) { if (chipid == -1) { m_pwm = mraa_pwm_init(pin); } else { m_pwm = mraa_pwm_init_raw(chipid, pin); } if (m_pwm == NULL) { throw std::invalid_argument("Error initialising PWM on pin"); } if (!owner) { mraa_pwm_owner(m_pwm, 0); } }
mraa_pwm_context mraa_pwm_init(int pin) { mraa_board_t* board = plat; if (board == NULL) { syslog(LOG_ERR, "pwm_init: Platform Not Initialised"); return NULL; } if (mraa_is_sub_platform_id(pin)) { syslog(LOG_NOTICE, "pwm_init: Using sub platform"); board = board->sub_platform; if (board == NULL) { syslog(LOG_ERR, "pwm_init: Sub platform Not Initialised"); return NULL; } pin = mraa_get_sub_platform_index(pin); } if (pin < 0 || pin > board->phy_pin_count) { syslog(LOG_ERR, "pwm_init: pin %i beyond platform definition", pin); return NULL; } if (board->pins[pin].capabilites.pwm != 1) { syslog(LOG_ERR, "pwm_init: pin %i not capable of pwm", pin); return NULL; } if (board->adv_func->pwm_init_replace != NULL) { return board->adv_func->pwm_init_replace(pin); } 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 (board->pins[pin].capabilites.gpio == 1) { // This deserves more investigation mraa_gpio_context mux_i; mux_i = mraa_gpio_init_raw(board->pins[pin].gpio.pinmap); if (mux_i == NULL) { syslog(LOG_ERR, "pwm_init: error in gpio->pwm%i transition. gpio_init", pin); return NULL; } if (mraa_gpio_dir(mux_i, MRAA_GPIO_OUT) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm_init: error in gpio->pwm%i transition. gpio_dir", pin); return NULL; } if (mraa_gpio_write(mux_i, 1) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm_init: error in gpio->pwm%i transition. gpio_write", pin); return NULL; } if (mraa_gpio_close(mux_i) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm_init: error in gpio->pwm%i transition. gpio_close", pin); return NULL; } } if (board->pins[pin].pwm.mux_total > 0) { if (mraa_setup_mux_mapped(board->pins[pin].pwm) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm_init: Failed to set-up pwm%i multiplexer", pin); return NULL; } } int chip = board->pins[pin].pwm.parent_id; int pinn = board->pins[pin].pwm.pinmap; if (board->adv_func->pwm_init_post != NULL) { mraa_pwm_context pret = mraa_pwm_init_raw(chip, pinn); mraa_result_t ret = board->adv_func->pwm_init_post(pret); if (ret != MRAA_SUCCESS) { free(pret); return NULL; } return pret; } return mraa_pwm_init_raw(chip, pinn); }
mraa_pwm_context mraa_pwm_init(int pin) { if (plat == 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; } if (plat->pins[pin].capabilites.pwm != 1) { syslog(LOG_ERR, "pwm: pin not capable of pwm"); return NULL; } if (plat->adv_func->pwm_init_replace != NULL) { mraa_pwm_context pret = plat->adv_func->pwm_init_replace(pin); if(pret == NULL) return NULL; pret->advance_func = plat->adv_func; return pret; } if (plat->adv_func->pwm_init_pre != NULL) { if (plat->adv_func->pwm_init_pre(pin) != MRAA_SUCCESS) return NULL; } if (plat->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); if (mux_i == NULL) { syslog(LOG_ERR, "pwm: error in gpio->pwm transition"); return NULL; } if (mraa_gpio_dir(mux_i, MRAA_GPIO_OUT) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm: error in gpio->pwm transition"); return NULL; } if (mraa_gpio_write(mux_i, 1) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm: error in gpio->pwm transition"); return NULL; } if (mraa_gpio_close(mux_i) != MRAA_SUCCESS) { syslog(LOG_ERR, "pwm: error in gpio->pwm transition"); return NULL; } } if (plat->pins[pin].pwm.mux_total > 0) { if (mraa_setup_mux_mapped(plat->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; if (plat->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); if (ret != MRAA_SUCCESS) { free(pret); return NULL; } return pret; } return mraa_pwm_init_raw(chip, pinn); }