Fix PWM status LED never_reset
It doesn't need never reset because the status LED is only active when user code isn't. This also fixes PWM never reset on espressif so that deinit will undo it. Fixes #6223
This commit is contained in:
parent
ef34378b1d
commit
93ee54a2fb
|
@ -166,7 +166,20 @@ void common_hal_pwmio_pwmout_never_reset(pwmio_pwmout_obj_t *self) {
|
||||||
|
|
||||||
void common_hal_pwmio_pwmout_reset_ok(pwmio_pwmout_obj_t *self) {
|
void common_hal_pwmio_pwmout_reset_ok(pwmio_pwmout_obj_t *self) {
|
||||||
never_reset_tim[self->tim_handle.timer_num] = false;
|
never_reset_tim[self->tim_handle.timer_num] = false;
|
||||||
never_reset_chan[self->chan_handle.channel] = false;
|
// Search if any other channel is using the timer and is never reset.
|
||||||
|
// Otherwise, we clear never_reset for the timer as well.
|
||||||
|
bool other_never_reset = false;
|
||||||
|
for (size_t i = 0; i < LEDC_CHANNEL_MAX; i++) {
|
||||||
|
if (i != self->tim_handle.timer_num &&
|
||||||
|
reserved_channels[i] == self->tim_handle.timer_num &&
|
||||||
|
never_reset_chan[i]) {
|
||||||
|
other_never_reset = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!other_never_reset) {
|
||||||
|
never_reset_chan[self->chan_handle.channel] = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_hal_pwmio_pwmout_deinited(pwmio_pwmout_obj_t *self) {
|
bool common_hal_pwmio_pwmout_deinited(pwmio_pwmout_obj_t *self) {
|
||||||
|
@ -182,11 +195,13 @@ void common_hal_pwmio_pwmout_deinit(pwmio_pwmout_obj_t *self) {
|
||||||
ledc_stop(LEDC_LOW_SPEED_MODE, self->chan_handle.channel, 0);
|
ledc_stop(LEDC_LOW_SPEED_MODE, self->chan_handle.channel, 0);
|
||||||
}
|
}
|
||||||
reserved_channels[self->chan_handle.channel] = INDEX_EMPTY;
|
reserved_channels[self->chan_handle.channel] = INDEX_EMPTY;
|
||||||
|
never_reset_chan[self->chan_handle.channel] = false;
|
||||||
// Search if any other channel is using the timer
|
// Search if any other channel is using the timer
|
||||||
bool taken = false;
|
bool taken = false;
|
||||||
for (size_t i = 0; i < LEDC_CHANNEL_MAX; i++) {
|
for (size_t i = 0; i < LEDC_CHANNEL_MAX; i++) {
|
||||||
if (reserved_channels[i] == self->tim_handle.timer_num) {
|
if (reserved_channels[i] == self->tim_handle.timer_num) {
|
||||||
taken = true;
|
taken = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Variable frequency means there's only one channel on the timer
|
// Variable frequency means there's only one channel on the timer
|
||||||
|
@ -195,6 +210,7 @@ void common_hal_pwmio_pwmout_deinit(pwmio_pwmout_obj_t *self) {
|
||||||
reserved_timer_freq[self->tim_handle.timer_num] = 0;
|
reserved_timer_freq[self->tim_handle.timer_num] = 0;
|
||||||
// if timer isn't varfreq this will be off aleady
|
// if timer isn't varfreq this will be off aleady
|
||||||
varfreq_timers[self->tim_handle.timer_num] = false;
|
varfreq_timers[self->tim_handle.timer_num] = false;
|
||||||
|
never_reset_tim[self->tim_handle.timer_num] = false;
|
||||||
}
|
}
|
||||||
common_hal_reset_pin(self->pin);
|
common_hal_reset_pin(self->pin);
|
||||||
self->deinited = true;
|
self->deinited = true;
|
||||||
|
|
|
@ -179,27 +179,15 @@ void status_led_init() {
|
||||||
|
|
||||||
#elif CIRCUITPY_PWM_RGB_LED
|
#elif CIRCUITPY_PWM_RGB_LED
|
||||||
if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_R)) {
|
if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_R)) {
|
||||||
pwmout_result_t red_result = common_hal_pwmio_pwmout_construct(&rgb_status_r, CIRCUITPY_RGB_STATUS_R, 0, 50000, false);
|
common_hal_pwmio_pwmout_construct(&rgb_status_r, CIRCUITPY_RGB_STATUS_R, 0, 50000, false);
|
||||||
|
|
||||||
if (PWMOUT_OK == red_result) {
|
|
||||||
common_hal_pwmio_pwmout_never_reset(&rgb_status_r);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_G)) {
|
if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_G)) {
|
||||||
pwmout_result_t green_result = common_hal_pwmio_pwmout_construct(&rgb_status_g, CIRCUITPY_RGB_STATUS_G, 0, 50000, false);
|
common_hal_pwmio_pwmout_construct(&rgb_status_g, CIRCUITPY_RGB_STATUS_G, 0, 50000, false);
|
||||||
|
|
||||||
if (PWMOUT_OK == green_result) {
|
|
||||||
common_hal_pwmio_pwmout_never_reset(&rgb_status_g);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_B)) {
|
if (common_hal_mcu_pin_is_free(CIRCUITPY_RGB_STATUS_B)) {
|
||||||
pwmout_result_t blue_result = common_hal_pwmio_pwmout_construct(&rgb_status_b, CIRCUITPY_RGB_STATUS_B, 0, 50000, false);
|
common_hal_pwmio_pwmout_construct(&rgb_status_b, CIRCUITPY_RGB_STATUS_B, 0, 50000, false);
|
||||||
|
|
||||||
if (PWMOUT_OK == blue_result) {
|
|
||||||
common_hal_pwmio_pwmout_never_reset(&rgb_status_b);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(MICROPY_HW_LED_STATUS)
|
#elif defined(MICROPY_HW_LED_STATUS)
|
||||||
|
|
Loading…
Reference in New Issue