From f45cd5e905d13b5bcc0f269fdb12f76e18b216af Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 2 Aug 2022 10:07:55 +0200 Subject: [PATCH] Fixed comments and cleaned up --- .../src/esp8266toEsp32.cpp | 47 ++++++------ .../src/esp8266toEsp32.h | 73 +++++++++---------- tasmota/tasmota_support/support_pwm.ino | 1 - 3 files changed, 59 insertions(+), 62 deletions(-) diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp index b5e8450e9..dd47d8166 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp @@ -147,6 +147,30 @@ int32_t _analog_pin2timer(uint32_t pin) { // returns -1 if uallocated return timer; } +// get the next unused timer, returns -1 if no free timer is available +// Keep in mind that Timer 0 is reserved, which leaves only 3 timers available +// +// This function does not reserve the timer, it is reserved only when you assign a GPIO to it +static int32_t analogNextFreeTimer() { + _analogInit(); // make sure the mapping array is initialized + bool assigned[MAX_TIMERS] = {}; + assigned[0] = true; + + for (uint32_t chan = 0; chan < MAX_PWMS; chan++) { + assigned[pwm_timer[chan]] = true; + } + + // find first free + for (uint32_t j = 0; j < MAX_TIMERS; j++) { + if (!assigned[j]) { + // AddLog(LOG_LEVEL_INFO, "PWM: analogNextFreeTimer next_timer=%i", j); + return j; + } + } + // AddLog(LOG_LEVEL_INFO, "PWM: analogNextFreeTimer no free timer"); + return -1; // none available +} + // input range is in full range, ledc needs bits uint32_t _analogGetResolution(uint32_t x) { uint32_t bits = 0; @@ -177,7 +201,7 @@ void analogWriteRange(uint32_t range, int32_t pin) { // `-1`: keep unchanged // if pin < 0 then change global value for timer 0 void analogWriteFreqRange(int32_t freq, int32_t range, int32_t pin) { - AddLog(LOG_LEVEL_INFO, "PWM: analogWriteFreqRange freq=%i range=%i pin=%i", freq, range, pin); + // AddLog(LOG_LEVEL_INFO, "PWM: analogWriteFreqRange freq=%i range=%i pin=%i", freq, range, pin); _analogInit(); // make sure the mapping array is initialized uint32_t timer0_freq = timer_freq_hz[0]; // global values uint8_t timer0_res = timer_duty_resolution[0]; @@ -389,27 +413,6 @@ int32_t analogGetTimerForChannel(uint8_t chan) { // get the next unused timer, returns -1 if no free timer is available // Keep in mind that Timer 0 is reserved, which leaves only 3 timers available // -// This function does not reserve the timer, it is reserved only when you assign a GPIO to it -int32_t analogNextFreeTimer() { - _analogInit(); // make sure the mapping array is initialized - bool assigned[MAX_TIMERS] = {}; - assigned[0] = true; - - for (uint32_t chan = 0; chan < MAX_PWMS; chan++) { - assigned[pwm_timer[chan]] = true; - } - - // find first free - for (uint32_t j = 0; j < MAX_TIMERS; j++) { - if (!assigned[j]) { - // AddLog(LOG_LEVEL_INFO, "PWM: analogNextFreeTimer next_timer=%i", j); - return j; - } - } - // AddLog(LOG_LEVEL_INFO, "PWM: analogNextFreeTimer no free timer"); - return -1; // none available -} - // Get timer resolution (in bits) - default 10 uint8_t analogGetTimerResolution(uint8_t timer) { _analogInit(); // make sure the mapping array is initialized diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index bc6e17c8b..b43dd354d 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -28,19 +28,19 @@ * * The following supersedes Arduino framework and provides more granular control: * - fine grained phase control (in addition to duty cycle) - * - fine control of which PWM uses which timers - * - fine control of frequency and resolution per timer + * - fine control of PWM frequency and resolution per GPIO * - * By default, all PWM are using the same timer called Timer0. - * Changes in frequency of resolution apply to all PWM using Timer0. - * - * You can specify a different timer per GPIO (Timer1 to Timer3). - * Then any change of resolution or frequency to these GPIOs alter only - * the corresponding timer. + * By default, all PWM are using the same timer called Timer 0. + * Changes in frequency of resolution apply to all PWM using Timer 0. * + * You can specify a different a different resolution/frequency for + * specific GPIOs, this will internally assign a new timer to the GPIO. + * The limit is 3 specific values in addition to the global value. + * * Note: on ESP32-only, there are 2 groups of PWM and 2 groups of timers. - * - PWM 0..7 are using Timer 0..3 - * - PWM 8..15 are using Timer 4..7 + * Although there are internally 8 timers, to simplifiy management, + * Timer 4..7 are mirrored from Timer 0..3. + * So it all happens like if there were only 4 timers and a single group of PWM channels. \*******************************************************************************************/ uint32_t ledcReadFreq2(uint8_t chan); @@ -55,29 +55,38 @@ uint8_t ledcReadResolution(uint8_t chan); // Returns: hardware channel number, or -1 if it failed int analogAttach(uint32_t pin, bool output_invert = false); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated +// change both freq and range +// `0`: set to global value +// `-1`: keep unchanged +// if pin < 0 then change global value for timer 0 + +// +// analogWriteFreqRange - change the range and/or frequency of a GPIO +// +// `void analogWriteFreqRange(int32_t freq, int32_t range, int32_t pin)` +// +// The range is converted to a number of bits, so range must be a power of 2 minus 1. +// By default, the resolution is 10 bits, i.e. a range of 1023. +// +// Special cases: +// - if `pin < 0`, changes the global value for Timer 0 and all PWM using default +// - if `range == 0` or `freq == 0`, revert to using Timer 0 (i.e. reassign to global values) +// - if `range < 0` or `freq < 0`, keep the previous value unchanged +// - if `pin` is unassigned, silently ignore +void analogWriteFreqRange(int32_t freq, int32_t range, int32_t pin = -1); + // // analogWriteRange - change the range of PWM // -// Internally the range is converted to a number of bits, so range must be a power of 2. -// By default, the resolution is 10 bits, i.e. a range of 1024. -// -// When changing this value, it changes the underlying Timer. This means -// that the range changes for all PWM using the same timer. -// -// If `pin == 255`, the value is changed for the default Timer(s) -// I.e. `Timer 0` (and `Timer 4` on ESP32) +// short-cut for: +// `analogWriteFreqRange(-1, range, pin)` void analogWriteRange(uint32_t range, int32_t pin = -1); // // analogWriteFreq - change the frequency of PWM in Hz // -// Default value is 977Hz. TODO: use the value in `my_user_config.h` -// -// When changing this value, it changes the underlying Timer. This means -// that the range changes for all PWM using the same timer. -// -// If `pin == 255`, the value is changed for the default Timer(s) -// I.e. `Timer 0` (and `Timer 4` on ESP32) +// short-cut for: +// `analogWriteFreqRange(-1, range, pin)` void analogWriteFreq(uint32_t freq, int32_t pin = -1); // @@ -99,25 +108,11 @@ extern int32_t analogGetChannel2(uint32_t pin); int32_t analogGetTimer(uint8_t pin); int32_t analogGetTimerForChannel(uint8_t chan); -// set the timer number for a GPIO, ignore if the GPIO is not set or Timer number is invalid -// Timer range is 0..3 -void analogSetTimer(uint8_t pin, uint8_t timer); - -// get the next unused timer, returns -1 if no free timer is available -// Keep in mind that Timer 0 is reserved, which leaves only 3 timers available -// -// This function does not reserve the timer, it is reserved only when you assign a GPIO to it -int32_t analogNextFreeTimer(); - // Get timer resolution (in bits) - default 10 uint8_t analogGetTimerResolution(uint8_t timer); -// void analogSetTimerResolution(uint8_t timer, uint8_t resolution); // Get timer frequency (in Hz) - default 977 uint32_t analogGetTimerFrequency(uint8_t timer); -// void analogSetTimerFrequency(uint8_t timer, uint32_t freq); - -// void analogSetTimerResFreq(uint8_t timer, uint8_t resolution, uint32_t freq); /*********************************************************************************************/ diff --git a/tasmota/tasmota_support/support_pwm.ino b/tasmota/tasmota_support/support_pwm.ino index 962d7e2bf..f729b628a 100644 --- a/tasmota/tasmota_support/support_pwm.ino +++ b/tasmota/tasmota_support/support_pwm.ino @@ -83,7 +83,6 @@ void PwmApplyGPIO(bool force_update_all) { if (PinUsed(GPIO_PWM1, i)) { int32_t pin = Pin(GPIO_PWM1, i); int32_t chan = analogGetChannel2(pin); - // int32_t timer = analogGetTimer(pin); uint32_t res = ledcReadResolution(chan); uint32_t range = (1 << res) - 1; uint32_t freq = ledcReadFreq2(chan);