static int stop_sound(struct piezo_speaker_data *mdata) { int r; r = sol_pwm_set_duty_cycle(mdata->pwm, 0); SOL_INT_CHECK(r, < 0, r); return 0; }
static int start_sound(struct piezo_speaker_data *mdata, uint32_t period_us) { int r; r = sol_pwm_set_duty_cycle(mdata->pwm, 0); SOL_INT_CHECK(r, < 0, r); r = sol_pwm_set_period(mdata->pwm, period_us * 1000); SOL_INT_CHECK(r, < 0, r); //we want a perfect square signal, thus half the period. it seems //that < half period would affect the final volume, we can expose //that later r = sol_pwm_set_duty_cycle(mdata->pwm, (period_us * 1000) / 2); SOL_INT_CHECK(r, < 0, r); return 0; }
/* TODO send a packet to pwm node */ static int set_pulse_width(struct servo_motor_data *mdata, int32_t pulse_width) { SOL_DBG("Pulse width %" PRId32 " microseconds (%" PRId32 " -" "%" PRId32 ")", pulse_width, mdata->duty_cycle_range.min, mdata->duty_cycle_range.max); if (!mdata->pwm_enabled) { sol_pwm_set_enabled(mdata->pwm, true); mdata->pwm_enabled = true; } else if (pulse_width == mdata->duty_cycle_range.val) return 0; mdata->duty_cycle_range.val = pulse_width; if (!sol_pwm_set_duty_cycle(mdata->pwm, mdata->duty_cycle_range.val * 1000)) { SOL_WRN("Failed to write duty cycle %" PRId32 "ns.", mdata->duty_cycle_range.val * 1000); return -1; } return 0; }