Skip to content

Commit 51bc2e3

Browse files
authored
Merge branch 'espressif:master' into main
2 parents 90a490a + cbdaee6 commit 51bc2e3

File tree

10 files changed

+304
-110
lines changed

10 files changed

+304
-110
lines changed

.github/workflows/publishsizes.yml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,17 @@ jobs:
4444
gh api "$artifacts_url" -q '.artifacts[] | [.name, .archive_download_url] | @tsv' | while read artifact
4545
do
4646
IFS=$'\t' read name url <<< "$artifact"
47-
gh api $url > "$name.zip"
48-
unzip -j "$name.zip" -d "temp_$name"
49-
if [[ "$name" == "pr_number" ]]; then
50-
mv "temp_$name"/* sizes-report
51-
elif [[ "$name" == "pr_cli"* ]]; then
52-
mv "temp_$name"/* sizes-report/pr
53-
else
54-
mv "temp_$name"/* sizes-report
47+
# Only process pr_number and pr_cli_compile artifacts
48+
if [[ "$name" == "pr_number" || "$name" =~ ^pr_cli_compile_[0-9]+$ ]]; then
49+
gh api $url > "$name.zip"
50+
unzip -o -j "$name.zip" -d "temp_$name"
51+
if [[ "$name" == "pr_number" ]]; then
52+
mv "temp_$name"/* sizes-report
53+
elif [[ "$name" =~ ^pr_cli_compile_[0-9]+$ ]]; then
54+
mv "temp_$name"/* sizes-report/pr
55+
fi
56+
rm -r "temp_$name"
5557
fi
56-
rm -r "temp_$name"
5758
done
5859
echo "Contents of parent directory:"
5960
ls -R ..

boards.txt

Lines changed: 33 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,15 @@ esp32p4.menu.PartitionScheme.fatflash.upload.maximum_size=2097152
282282
esp32p4.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS)
283283
esp32p4.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
284284
esp32p4.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
285+
esp32p4.menu.PartitionScheme.app5M_fat24M_32MB=32M Flash (4.8MB APP/22MB FATFS)
286+
esp32p4.menu.PartitionScheme.app5M_fat24M_32MB.build.partitions=large_fat_32MB
287+
esp32p4.menu.PartitionScheme.app5M_fat24M_32MB.upload.maximum_size=4718592
288+
esp32p4.menu.PartitionScheme.app5M_little24M_32MB=32M Flash (4.8MB APP/22MB LittleFS)
289+
esp32p4.menu.PartitionScheme.app5M_little24M_32MB.build.partitions=large_littlefs_32MB
290+
esp32p4.menu.PartitionScheme.app5M_little24M_32MB.upload.maximum_size=4718592
291+
esp32p4.menu.PartitionScheme.app13M_data7M_32MB=32M Flash (13MB APP/6.75MB SPIFFS)
292+
esp32p4.menu.PartitionScheme.app13M_data7M_32MB.build.partitions=default_32MB
293+
esp32p4.menu.PartitionScheme.app13M_data7M_32MB.upload.maximum_size=13107200
285294
esp32p4.menu.PartitionScheme.custom=Custom
286295
esp32p4.menu.PartitionScheme.custom.build.partitions=
287296
esp32p4.menu.PartitionScheme.custom.upload.maximum_size=16777216
@@ -314,6 +323,8 @@ esp32p4.menu.FlashSize.2M.build.flash_size=2MB
314323
esp32p4.menu.FlashSize.2M.build.partitions=minimal
315324
esp32p4.menu.FlashSize.16M=16MB (128Mb)
316325
esp32p4.menu.FlashSize.16M.build.flash_size=16MB
326+
esp32p4.menu.FlashSize.32M=32MB (256Mb)
327+
esp32p4.menu.FlashSize.32M.build.flash_size=32MB
317328

318329
esp32p4.menu.UploadSpeed.921600=921600
319330
esp32p4.menu.UploadSpeed.921600.upload.speed=921600
@@ -31513,23 +31524,26 @@ wifiduino32c3.build.target=esp
3151331524
wifiduino32c3.build.mcu=esp32c3
3151431525
wifiduino32c3.build.core=esp32
3151531526
wifiduino32c3.build.variant=wifiduinov2
31516-
wifiduino32c3.build.board=WiFiduinoV2
31527+
wifiduino32c3.build.board=WIFIDUINOV2
3151731528
wifiduino32c3.build.bootloader_addr=0x0
3151831529

3151931530
wifiduino32c3.build.cdc_on_boot=0
3152031531
wifiduino32c3.build.f_cpu=160000000L
3152131532
wifiduino32c3.build.flash_size=4MB
3152231533
wifiduino32c3.build.flash_freq=80m
31523-
wifiduino32c3.build.flash_mode=qio
31524-
wifiduino32c3.build.boot=qio
31525-
wifiduino32c3.build.partitions=default
31534+
wifiduino32c3.build.flash_mode=dio
31535+
wifiduino32c3.build.boot=dio
31536+
wifiduino32c3.build.partitions=no_ota
3152631537
wifiduino32c3.build.defines=
3152731538

3152831539
wifiduino32c3.menu.CDCOnBoot.default=Disabled
3152931540
wifiduino32c3.menu.CDCOnBoot.default.build.cdc_on_boot=0
3153031541
wifiduino32c3.menu.CDCOnBoot.cdc=Enabled
3153131542
wifiduino32c3.menu.CDCOnBoot.cdc.build.cdc_on_boot=1
3153231543

31544+
wifiduino32c3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS)
31545+
wifiduino32c3.menu.PartitionScheme.no_ota.build.partitions=no_ota
31546+
wifiduino32c3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
3153331547
wifiduino32c3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
3153431548
wifiduino32c3.menu.PartitionScheme.default.build.partitions=default
3153531549
wifiduino32c3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS)
@@ -31539,9 +31553,6 @@ wifiduino32c3.menu.PartitionScheme.default_8MB.build.partitions=default_8MB
3153931553
wifiduino32c3.menu.PartitionScheme.default_8MB.upload.maximum_size=3342336
3154031554
wifiduino32c3.menu.PartitionScheme.minimal=Minimal (1.3MB APP/700KB SPIFFS)
3154131555
wifiduino32c3.menu.PartitionScheme.minimal.build.partitions=minimal
31542-
wifiduino32c3.menu.PartitionScheme.no_ota=No OTA (2MB APP/2MB SPIFFS)
31543-
wifiduino32c3.menu.PartitionScheme.no_ota.build.partitions=no_ota
31544-
wifiduino32c3.menu.PartitionScheme.no_ota.upload.maximum_size=2097152
3154531556
wifiduino32c3.menu.PartitionScheme.noota_3g=No OTA (1MB APP/3MB SPIFFS)
3154631557
wifiduino32c3.menu.PartitionScheme.noota_3g.build.partitions=noota_3g
3154731558
wifiduino32c3.menu.PartitionScheme.noota_3g.upload.maximum_size=1048576
@@ -31584,12 +31595,12 @@ wifiduino32c3.menu.CPUFreq.20.build.f_cpu=20000000L
3158431595
wifiduino32c3.menu.CPUFreq.10=10MHz
3158531596
wifiduino32c3.menu.CPUFreq.10.build.f_cpu=10000000L
3158631597

31587-
wifiduino32c3.menu.FlashMode.qio=QIO
31588-
wifiduino32c3.menu.FlashMode.qio.build.flash_mode=dio
31589-
wifiduino32c3.menu.FlashMode.qio.build.boot=qio
3159031598
wifiduino32c3.menu.FlashMode.dio=DIO
3159131599
wifiduino32c3.menu.FlashMode.dio.build.flash_mode=dio
3159231600
wifiduino32c3.menu.FlashMode.dio.build.boot=dio
31601+
wifiduino32c3.menu.FlashMode.qio=QIO
31602+
wifiduino32c3.menu.FlashMode.qio.build.flash_mode=dio
31603+
wifiduino32c3.menu.FlashMode.qio.build.boot=qio
3159331604

3159431605
wifiduino32c3.menu.FlashFreq.80=80MHz
3159531606
wifiduino32c3.menu.FlashFreq.80.build.flash_freq=80m
@@ -31665,34 +31676,34 @@ wifiduino32s3.build.target=esp32s3
3166531676
wifiduino32s3.build.mcu=esp32s3
3166631677
wifiduino32s3.build.core=esp32
3166731678
wifiduino32s3.build.variant=wifiduino32s3
31668-
wifiduino32s3.build.board=WiFiduino32S3
31679+
wifiduino32s3.build.board=WIFIDUINO32S3
3166931680

3167031681
wifiduino32s3.build.usb_mode=1
3167131682
wifiduino32s3.build.cdc_on_boot=0
3167231683
wifiduino32s3.build.msc_on_boot=0
3167331684
wifiduino32s3.build.dfu_on_boot=0
3167431685
wifiduino32s3.build.f_cpu=240000000L
31675-
wifiduino32s3.build.flash_size=4MB
31686+
wifiduino32s3.build.flash_size=16MB
3167631687
wifiduino32s3.build.flash_freq=80m
3167731688
wifiduino32s3.build.flash_mode=dio
3167831689
wifiduino32s3.build.boot=qio
3167931690
wifiduino32s3.build.boot_freq=80m
31680-
wifiduino32s3.build.partitions=default
31691+
wifiduino32s3.build.partitions=app3M_fat9M_16MB
3168131692
wifiduino32s3.build.defines=
3168231693
wifiduino32s3.build.loop_core=
3168331694
wifiduino32s3.build.event_core=
31684-
wifiduino32s3.build.psram_type=qspi
31695+
wifiduino32s3.build.psram_type=opi
3168531696
wifiduino32s3.build.memory_type={build.boot}_{build.psram_type}
3168631697

31698+
wifiduino32s3.menu.PSRAM.opi=OPI PSRAM
31699+
wifiduino32s3.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM
31700+
wifiduino32s3.menu.PSRAM.opi.build.psram_type=opi
3168731701
wifiduino32s3.menu.PSRAM.disabled=Disabled
3168831702
wifiduino32s3.menu.PSRAM.disabled.build.defines=
3168931703
wifiduino32s3.menu.PSRAM.disabled.build.psram_type=qspi
3169031704
wifiduino32s3.menu.PSRAM.enabled=QSPI PSRAM
3169131705
wifiduino32s3.menu.PSRAM.enabled.build.defines=-DBOARD_HAS_PSRAM
3169231706
wifiduino32s3.menu.PSRAM.enabled.build.psram_type=qspi
31693-
wifiduino32s3.menu.PSRAM.opi=OPI PSRAM
31694-
wifiduino32s3.menu.PSRAM.opi.build.defines=-DBOARD_HAS_PSRAM
31695-
wifiduino32s3.menu.PSRAM.opi.build.psram_type=opi
3169631707

3169731708
wifiduino32s3.menu.FlashMode.qio=QIO 80MHz
3169831709
wifiduino32s3.menu.FlashMode.qio.build.flash_mode=dio
@@ -31715,12 +31726,10 @@ wifiduino32s3.menu.FlashMode.opi.build.boot=opi
3171531726
wifiduino32s3.menu.FlashMode.opi.build.boot_freq=80m
3171631727
wifiduino32s3.menu.FlashMode.opi.build.flash_freq=80m
3171731728

31718-
wifiduino32s3.menu.FlashSize.4M=4MB (32Mb)
31719-
wifiduino32s3.menu.FlashSize.4M.build.flash_size=4MB
31720-
wifiduino32s3.menu.FlashSize.8M=8MB (64Mb)
31721-
wifiduino32s3.menu.FlashSize.8M.build.flash_size=8MB
3172231729
wifiduino32s3.menu.FlashSize.16M=16MB (128Mb)
3172331730
wifiduino32s3.menu.FlashSize.16M.build.flash_size=16MB
31731+
wifiduino32s3.menu.FlashSize.8M=8MB (64Mb)
31732+
wifiduino32s3.menu.FlashSize.8M.build.flash_size=8MB
3172431733
#wifiduino32s3.menu.FlashSize.32M=32MB (256Mb)
3172531734
#wifiduino32s3.menu.FlashSize.32M.build.flash_size=32MB
3172631735

@@ -31761,6 +31770,9 @@ wifiduino32s3.menu.UploadMode.cdc=USB-OTG CDC (TinyUSB)
3176131770
wifiduino32s3.menu.UploadMode.cdc.upload.use_1200bps_touch=true
3176231771
wifiduino32s3.menu.UploadMode.cdc.upload.wait_for_upload_port=true
3176331772

31773+
wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS)
31774+
wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
31775+
wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
3176431776
wifiduino32s3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
3176531777
wifiduino32s3.menu.PartitionScheme.default.build.partitions=default
3176631778
wifiduino32s3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS)
@@ -31791,9 +31803,6 @@ wifiduino32s3.menu.PartitionScheme.min_spiffs.upload.maximum_size=1966080
3179131803
wifiduino32s3.menu.PartitionScheme.fatflash=16M Flash (2MB APP/12.5MB FATFS)
3179231804
wifiduino32s3.menu.PartitionScheme.fatflash.build.partitions=ffat
3179331805
wifiduino32s3.menu.PartitionScheme.fatflash.upload.maximum_size=2097152
31794-
wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB=16M Flash (3MB APP/9.9MB FATFS)
31795-
wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.build.partitions=app3M_fat9M_16MB
31796-
wifiduino32s3.menu.PartitionScheme.app3M_fat9M_16MB.upload.maximum_size=3145728
3179731806
wifiduino32s3.menu.PartitionScheme.rainmaker=RainMaker 4MB
3179831807
wifiduino32s3.menu.PartitionScheme.rainmaker.build.partitions=rainmaker
3179931808
wifiduino32s3.menu.PartitionScheme.rainmaker.upload.maximum_size=1966080
@@ -41589,11 +41598,6 @@ Geekble_ESP32C3.build.boot=qio
4158941598
Geekble_ESP32C3.build.partitions=default
4159041599
Geekble_ESP32C3.build.defines=
4159141600

41592-
Geekble_ESP32C3.menu.CDCOnBoot.default=Enabled
41593-
Geekble_ESP32C3.menu.CDCOnBoot.default.build.cdc_on_boot=1
41594-
Geekble_ESP32C3.menu.CDCOnBoot.cdc=Disabled
41595-
Geekble_ESP32C3.menu.CDCOnBoot.cdc.build.cdc_on_boot=0
41596-
4159741601
Geekble_ESP32C3.menu.PartitionScheme.default=Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
4159841602
Geekble_ESP32C3.menu.PartitionScheme.default.build.partitions=default
4159941603
Geekble_ESP32C3.menu.PartitionScheme.defaultffat=Default 4MB with ffat (1.2MB APP/1.5MB FATFS)
@@ -41614,39 +41618,6 @@ Geekble_ESP32C3.menu.PartitionScheme.huge_app=Huge APP (3MB No OTA/1MB SPIFFS)
4161441618
Geekble_ESP32C3.menu.PartitionScheme.huge_app.build.partitions=huge_app
4161541619
Geekble_ESP32C3.menu.PartitionScheme.huge_app.upload.maximum_size=3145728
4161641620

41617-
Geekble_ESP32C3.menu.CPUFreq.160=160MHz (WiFi) (Default)
41618-
Geekble_ESP32C3.menu.CPUFreq.160.build.f_cpu=160000000L
41619-
Geekble_ESP32C3.menu.CPUFreq.80=80MHz (WiFi)
41620-
Geekble_ESP32C3.menu.CPUFreq.80.build.f_cpu=80000000L
41621-
Geekble_ESP32C3.menu.CPUFreq.40=40MHz
41622-
Geekble_ESP32C3.menu.CPUFreq.40.build.f_cpu=40000000L
41623-
Geekble_ESP32C3.menu.CPUFreq.20=20MHz
41624-
Geekble_ESP32C3.menu.CPUFreq.20.build.f_cpu=20000000L
41625-
Geekble_ESP32C3.menu.CPUFreq.10=10MHz
41626-
Geekble_ESP32C3.menu.CPUFreq.10.build.f_cpu=10000000L
41627-
41628-
Geekble_ESP32C3.menu.FlashMode.qio=QIO (Default)
41629-
Geekble_ESP32C3.menu.FlashMode.qio.build.flash_mode=dio
41630-
Geekble_ESP32C3.menu.FlashMode.qio.build.boot=qio
41631-
Geekble_ESP32C3.menu.FlashMode.dio=DIO
41632-
Geekble_ESP32C3.menu.FlashMode.dio.build.flash_mode=dio
41633-
Geekble_ESP32C3.menu.FlashMode.dio.build.boot=dio
41634-
Geekble_ESP32C3.menu.FlashMode.qout=QOUT
41635-
Geekble_ESP32C3.menu.FlashMode.qout.build.flash_mode=dout
41636-
Geekble_ESP32C3.menu.FlashMode.qout.build.boot=qout
41637-
Geekble_ESP32C3.menu.FlashMode.dout=DOUT
41638-
Geekble_ESP32C3.menu.FlashMode.dout.build.flash_mode=dout
41639-
41640-
Geekble_ESP32C3.menu.FlashFreq.80=80MHz (Default)
41641-
Geekble_ESP32C3.menu.FlashFreq.80.build.flash_freq=80m
41642-
Geekble_ESP32C3.menu.FlashFreq.40=40MHz
41643-
Geekble_ESP32C3.menu.FlashFreq.40.build.flash_freq=40m
41644-
41645-
Geekble_ESP32C3.menu.FlashSize.4M=4MB (Default)
41646-
Geekble_ESP32C3.menu.FlashSize.4M.build.flash_size=4MB
41647-
Geekble_ESP32C3.menu.FlashSize.2M=2MB
41648-
Geekble_ESP32C3.menu.FlashSize.2M.build.flash_size=2MB
41649-
4165041621
Geekble_ESP32C3.menu.UploadSpeed.921600=921600 (Default)
4165141622
Geekble_ESP32C3.menu.UploadSpeed.921600.upload.speed=921600
4165241623
Geekble_ESP32C3.menu.UploadSpeed.115200=115200

cores/esp32/esp32-hal-ledc.c

Lines changed: 113 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,93 @@ typedef struct {
4545

4646
ledc_periph_t ledc_handle = {0};
4747

48+
// Helper function to find a timer with matching frequency and resolution
49+
static bool find_matching_timer(uint8_t speed_mode, uint32_t freq, uint8_t resolution, uint8_t *timer_num) {
50+
log_d("Searching for timer with freq=%u, resolution=%u", freq, resolution);
51+
// Check all channels to find one with matching frequency and resolution
52+
for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) {
53+
if (!perimanPinIsValid(i)) {
54+
continue;
55+
}
56+
peripheral_bus_type_t type = perimanGetPinBusType(i);
57+
if (type == ESP32_BUS_TYPE_LEDC) {
58+
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC);
59+
if (bus != NULL && (bus->channel / 8) == speed_mode && bus->freq_hz == freq && bus->channel_resolution == resolution) {
60+
log_d("Found matching timer %u for freq=%u, resolution=%u", bus->timer_num, freq, resolution);
61+
*timer_num = bus->timer_num;
62+
return true;
63+
}
64+
}
65+
}
66+
log_d("No matching timer found for freq=%u, resolution=%u", freq, resolution);
67+
return false;
68+
}
69+
70+
// Helper function to find an unused timer
71+
static bool find_free_timer(uint8_t speed_mode, uint8_t *timer_num) {
72+
// Check which timers are in use
73+
uint8_t used_timers = 0;
74+
for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) {
75+
if (!perimanPinIsValid(i)) {
76+
continue;
77+
}
78+
peripheral_bus_type_t type = perimanGetPinBusType(i);
79+
if (type == ESP32_BUS_TYPE_LEDC) {
80+
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC);
81+
if (bus != NULL && (bus->channel / 8) == speed_mode) {
82+
log_d("Timer %u is in use by channel %u", bus->timer_num, bus->channel);
83+
used_timers |= (1 << bus->timer_num);
84+
}
85+
}
86+
}
87+
88+
// Find first unused timer
89+
for (uint8_t i = 0; i < SOC_LEDC_TIMER_NUM; i++) {
90+
if (!(used_timers & (1 << i))) {
91+
log_d("Found free timer %u", i);
92+
*timer_num = i;
93+
return true;
94+
}
95+
}
96+
log_e("No free timers available");
97+
return false;
98+
}
99+
100+
// Helper function to remove a channel from a timer and clear timer if no channels are using it
101+
static void remove_channel_from_timer(uint8_t speed_mode, uint8_t timer_num, uint8_t channel) {
102+
log_d("Removing channel %u from timer %u in speed_mode %u", channel, timer_num, speed_mode);
103+
104+
// Check if any other channels are using this timer
105+
bool timer_in_use = false;
106+
for (uint8_t i = 0; i < SOC_GPIO_PIN_COUNT; i++) {
107+
if (!perimanPinIsValid(i)) {
108+
continue;
109+
}
110+
peripheral_bus_type_t type = perimanGetPinBusType(i);
111+
if (type == ESP32_BUS_TYPE_LEDC) {
112+
ledc_channel_handle_t *bus = (ledc_channel_handle_t *)perimanGetPinBus(i, ESP32_BUS_TYPE_LEDC);
113+
if (bus != NULL && (bus->channel / 8) == speed_mode && bus->timer_num == timer_num && bus->channel != channel) {
114+
log_d("Timer %u is still in use by channel %u", timer_num, bus->channel);
115+
timer_in_use = true;
116+
break;
117+
}
118+
}
119+
}
120+
121+
if (!timer_in_use) {
122+
log_d("No other channels using timer %u, deconfiguring timer", timer_num);
123+
// Stop the timer
124+
ledc_timer_pause(speed_mode, timer_num);
125+
// Deconfigure the timer
126+
ledc_timer_config_t ledc_timer;
127+
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
128+
ledc_timer.speed_mode = speed_mode;
129+
ledc_timer.timer_num = timer_num;
130+
ledc_timer.deconfigure = true;
131+
ledc_timer_config(&ledc_timer);
132+
}
133+
}
134+
48135
static bool fade_initialized = false;
49136

50137
static ledc_clk_cfg_t clock_source = LEDC_DEFAULT_CLK;
@@ -81,6 +168,8 @@ static bool ledcDetachBus(void *bus) {
81168
}
82169
pinMatrixOutDetach(handle->pin, false, false);
83170
if (!channel_found) {
171+
uint8_t group = (handle->channel / 8);
172+
remove_channel_from_timer(group, handle->timer_num, handle->channel % 8);
84173
ledc_handle.used_channels &= ~(1UL << handle->channel);
85174
}
86175
free(handle);
@@ -117,26 +206,37 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c
117206
return false;
118207
}
119208

120-
uint8_t group = (channel / 8), timer = ((channel / 2) % 4);
209+
uint8_t group = (channel / 8);
210+
uint8_t timer = 0;
121211
bool channel_used = ledc_handle.used_channels & (1UL << channel);
212+
122213
if (channel_used) {
123214
log_i("Channel %u is already set up, given frequency and resolution will be ignored", channel);
124215
if (ledc_set_pin(pin, group, channel % 8) != ESP_OK) {
125216
log_e("Attaching pin to already used channel failed!");
126217
return false;
127218
}
128219
} else {
129-
ledc_timer_config_t ledc_timer;
130-
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
131-
ledc_timer.speed_mode = group;
132-
ledc_timer.timer_num = timer;
133-
ledc_timer.duty_resolution = resolution;
134-
ledc_timer.freq_hz = freq;
135-
ledc_timer.clk_cfg = clock_source;
220+
// Find a timer with matching frequency and resolution, or a free timer
221+
if (!find_matching_timer(group, freq, resolution, &timer)) {
222+
if (!find_free_timer(group, &timer)) {
223+
log_e("No free timers available for speed mode %u", group);
224+
return false;
225+
}
136226

137-
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
138-
log_e("ledc setup failed!");
139-
return false;
227+
// Configure the timer if we're using a new one
228+
ledc_timer_config_t ledc_timer;
229+
memset((void *)&ledc_timer, 0, sizeof(ledc_timer_config_t));
230+
ledc_timer.speed_mode = group;
231+
ledc_timer.timer_num = timer;
232+
ledc_timer.duty_resolution = resolution;
233+
ledc_timer.freq_hz = freq;
234+
ledc_timer.clk_cfg = clock_source;
235+
236+
if (ledc_timer_config(&ledc_timer) != ESP_OK) {
237+
log_e("ledc setup failed!");
238+
return false;
239+
}
140240
}
141241

142242
uint32_t duty = ledc_get_duty(group, (channel % 8));
@@ -157,6 +257,8 @@ bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t c
157257
ledc_channel_handle_t *handle = (ledc_channel_handle_t *)malloc(sizeof(ledc_channel_handle_t));
158258
handle->pin = pin;
159259
handle->channel = channel;
260+
handle->timer_num = timer;
261+
handle->freq_hz = freq;
160262
#ifndef SOC_LEDC_SUPPORT_FADE_STOP
161263
handle->lock = NULL;
162264
#endif

0 commit comments

Comments
 (0)