Skip to content

Commit 3d54e6d

Browse files
committed
Add support to HAL for APB frequencies different than 80MHz
1 parent 3e66aef commit 3d54e6d

File tree

8 files changed

+46
-22
lines changed

8 files changed

+46
-22
lines changed

cores/esp32/esp32-hal-i2c.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "soc/i2c_reg.h"
2424
#include "soc/i2c_struct.h"
2525
#include "soc/dport_reg.h"
26+
#include "soc/rtc.h"
2627
#include "esp_attr.h"
2728

2829
//#define I2C_DEV(i) (volatile i2c_dev_t *)((i)?DR_REG_I2C1_EXT_BASE:DR_REG_I2C_EXT_BASE)
@@ -1611,7 +1612,7 @@ i2c_err_t i2cSetFrequency(i2c_t * i2c, uint32_t clk_speed)
16111612
}
16121613
I2C_FIFO_CONF_t f;
16131614

1614-
uint32_t period = (APB_CLK_FREQ/clk_speed) / 2;
1615+
uint32_t period = (rtc_clk_apb_freq_get()/clk_speed) / 2;
16151616
uint32_t halfPeriod = period/2;
16161617
uint32_t quarterPeriod = period/4;
16171618

@@ -1657,7 +1658,7 @@ uint32_t i2cGetFrequency(i2c_t * i2c)
16571658
uint32_t result = 0;
16581659
uint32_t old_count = (i2c->dev->scl_low_period.period+i2c->dev->scl_high_period.period);
16591660
if(old_count>0) {
1660-
result = APB_CLK_FREQ / old_count;
1661+
result = rtc_clk_apb_freq_get() / old_count;
16611662
} else {
16621663
result = 0;
16631664
}

cores/esp32/esp32-hal-ledc.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "soc/dport_reg.h"
2222
#include "soc/ledc_reg.h"
2323
#include "soc/ledc_struct.h"
24+
#include "soc/rtc.h"
2425

2526
#if CONFIG_DISABLE_HAL_LOCKS
2627
#define LEDC_MUTEX_LOCK()
@@ -84,7 +85,7 @@ static void _ledcSetupTimer(uint8_t chan, uint32_t div_num, uint8_t bit_num, boo
8485
//max bit_num 0x1F (31)
8586
static double _ledcSetupTimerFreq(uint8_t chan, double freq, uint8_t bit_num)
8687
{
87-
uint64_t clk_freq = APB_CLK_FREQ;
88+
uint64_t clk_freq = rtc_clk_apb_freq_get();
8889
clk_freq <<= 8;//div_num is 8 bit decimal
8990
uint32_t div_num = (clk_freq >> bit_num) / freq;
9091
bool apb_clk = true;
@@ -117,7 +118,7 @@ static double _ledcTimerRead(uint8_t chan)
117118
LEDC_MUTEX_UNLOCK();
118119
uint64_t clk_freq = 1000000;
119120
if(apb_clk) {
120-
clk_freq *= 80;
121+
clk_freq = rtc_clk_apb_freq_get();
121122
}
122123
clk_freq <<= 8;//div_num is 8 bit decimal
123124
return (clk_freq >> bit_num) / (double)div_num;

cores/esp32/esp32-hal-misc.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,35 @@ void yield()
4242
vPortYield();
4343
}
4444

45-
static uint32_t _cpu_freq_mhz = 240;
45+
static uint32_t _cpu_freq_mhz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ;
4646

47-
bool cpuFrequencySet(uint32_t cpu_freq_mhz){
48-
if(_cpu_freq_mhz == cpu_freq_mhz){
47+
bool setCpuFrequency(uint32_t cpu_freq_mhz){
48+
rtc_cpu_freq_config_t conf, cconf;
49+
rtc_clk_cpu_freq_get_config(&cconf);
50+
if(cconf.freq_mhz == cpu_freq_mhz && _cpu_freq_mhz == cpu_freq_mhz){
4951
return true;
5052
}
51-
rtc_cpu_freq_config_t conf;
5253
if(!rtc_clk_cpu_freq_mhz_to_config(cpu_freq_mhz, &conf)){
5354
log_e("CPU clock could not be set to %u MHz", cpu_freq_mhz);
5455
return false;
5556
}
57+
log_i("%s: %u / %u = %u Mhz", (conf.source == RTC_CPU_FREQ_SRC_PLL)?"PLL":((conf.source == RTC_CPU_FREQ_SRC_APLL)?"APLL":((conf.source == RTC_CPU_FREQ_SRC_XTAL)?"XTAL":"8M")), conf.source_freq_mhz, conf.div, conf.freq_mhz);
58+
delay(1);
5659
rtc_clk_cpu_freq_set_config(&conf);
5760
_cpu_freq_mhz = conf.freq_mhz;
5861
return true;
5962
}
6063

61-
uint32_t cpuFrequencyGet(){
64+
uint32_t getCpuFrequency(){
6265
rtc_cpu_freq_config_t conf;
6366
rtc_clk_cpu_freq_get_config(&conf);
6467
return conf.freq_mhz;
6568
}
6669

70+
uint32_t getApbFrequency(){
71+
return rtc_clk_apb_freq_get();
72+
}
73+
6774
unsigned long IRAM_ATTR micros()
6875
{
6976
return (unsigned long) ((esp_timer_get_time() * 240) / _cpu_freq_mhz);
@@ -109,6 +116,9 @@ bool btInUse(){ return false; }
109116

110117
void initArduino()
111118
{
119+
#ifdef ARDUINO_CPU_FREQ
120+
setCpuFrequency(ARDUINO_CPU_FREQ);
121+
#endif
112122
#if CONFIG_SPIRAM_SUPPORT
113123
psramInit();
114124
#endif

cores/esp32/esp32-hal-sigmadelta.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "esp32-hal-matrix.h"
2121
#include "soc/gpio_sd_reg.h"
2222
#include "soc/gpio_sd_struct.h"
23+
#include "soc/rtc.h"
2324

2425

2526
#if CONFIG_DISABLE_HAL_LOCKS
@@ -43,7 +44,8 @@ uint32_t sigmaDeltaSetup(uint8_t channel, uint32_t freq) //chan 0-7 freq 1220-31
4344
_sd_sys_lock = xSemaphoreCreateMutex();
4445
}
4546
#endif
46-
uint32_t prescale = (10000000/(freq*32)) - 1;
47+
uint32_t apb_freq = rtc_clk_apb_freq_get();
48+
uint32_t prescale = (apb_freq/(freq*256)) - 1;
4749
if(prescale > 0xFF) {
4850
prescale = 0xFF;
4951
}
@@ -52,7 +54,7 @@ uint32_t sigmaDeltaSetup(uint8_t channel, uint32_t freq) //chan 0-7 freq 1220-31
5254
SIGMADELTA.cg.clk_en = 0;
5355
SIGMADELTA.cg.clk_en = 1;
5456
SD_MUTEX_UNLOCK();
55-
return 10000000/((prescale + 1) * 32);
57+
return apb_freq/((prescale + 1) * 256);
5658
}
5759

5860
void sigmaDeltaWrite(uint8_t channel, uint8_t duty) //chan 0-7 duty 8 bit

cores/esp32/esp32-hal-spi.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "soc/io_mux_reg.h"
2727
#include "soc/gpio_sig_map.h"
2828
#include "soc/dport_reg.h"
29+
#include "soc/rtc.h"
2930

3031
#define SPI_CLK_IDX(p) ((p==0)?SPICLK_OUT_IDX:((p==1)?SPICLK_OUT_IDX:((p==2)?HSPICLK_OUT_IDX:((p==3)?VSPICLK_OUT_IDX:0))))
3132
#define SPI_MISO_IDX(p) ((p==0)?SPIQ_OUT_IDX:((p==1)?SPIQ_OUT_IDX:((p==2)?HSPIQ_OUT_IDX:((p==3)?VSPIQ_OUT_IDX:0))))
@@ -750,7 +751,7 @@ void spiEndTransaction(spi_t * spi)
750751
SPI_MUTEX_UNLOCK();
751752
}
752753

753-
void spiWriteByteNL(spi_t * spi, uint8_t data)
754+
void IRAM_ATTR spiWriteByteNL(spi_t * spi, uint8_t data)
754755
{
755756
if(!spi) {
756757
return;
@@ -776,7 +777,7 @@ uint8_t spiTransferByteNL(spi_t * spi, uint8_t data)
776777
return data;
777778
}
778779

779-
void spiWriteShortNL(spi_t * spi, uint16_t data)
780+
void IRAM_ATTR spiWriteShortNL(spi_t * spi, uint16_t data)
780781
{
781782
if(!spi) {
782783
return;
@@ -811,7 +812,7 @@ uint16_t spiTransferShortNL(spi_t * spi, uint16_t data)
811812
return data;
812813
}
813814

814-
void spiWriteLongNL(spi_t * spi, uint32_t data)
815+
void IRAM_ATTR spiWriteLongNL(spi_t * spi, uint32_t data)
815816
{
816817
if(!spi) {
817818
return;
@@ -959,7 +960,7 @@ void spiTransferBitsNL(spi_t * spi, uint32_t data, uint32_t * out, uint8_t bits)
959960
}
960961
}
961962

962-
void spiWritePixelsNL(spi_t * spi, const void * data_in, size_t len){
963+
void IRAM_ATTR spiWritePixelsNL(spi_t * spi, const void * data_in, size_t len){
963964
size_t longs = len >> 2;
964965
if(len & 3){
965966
longs++;
@@ -1017,18 +1018,20 @@ typedef union {
10171018
};
10181019
} spiClk_t;
10191020

1020-
#define ClkRegToFreq(reg) (CPU_CLK_FREQ / (((reg)->regPre + 1) * ((reg)->regN + 1)))
1021+
#define ClkRegToFreq(reg) (apb_freq / (((reg)->regPre + 1) * ((reg)->regN + 1)))
10211022

10221023
uint32_t spiClockDivToFrequency(uint32_t clockDiv)
10231024
{
1025+
uint32_t apb_freq = rtc_clk_apb_freq_get();
10241026
spiClk_t reg = { clockDiv };
10251027
return ClkRegToFreq(&reg);
10261028
}
10271029

10281030
uint32_t spiFrequencyToClockDiv(uint32_t freq)
10291031
{
1032+
uint32_t apb_freq = rtc_clk_apb_freq_get();
10301033

1031-
if(freq >= CPU_CLK_FREQ) {
1034+
if(freq >= apb_freq) {
10321035
return SPI_CLK_EQU_SYSCLK;
10331036
}
10341037

@@ -1051,7 +1054,7 @@ uint32_t spiFrequencyToClockDiv(uint32_t freq)
10511054
reg.regN = calN;
10521055

10531056
while(calPreVari++ <= 1) {
1054-
calPre = (((CPU_CLK_FREQ / (reg.regN + 1)) / freq) - 1) + calPreVari;
1057+
calPre = (((apb_freq / (reg.regN + 1)) / freq) - 1) + calPreVari;
10551058
if(calPre > 0x1FFF) {
10561059
reg.regPre = 0x1FFF;
10571060
} else if(calPre <= 0) {

cores/esp32/esp32-hal-timer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ void IRAM_ATTR __timerISR(void * arg){
8484
i = 4;
8585
//call callbacks
8686
while(i--){
87-
if(__timerInterruptHandlers[i] && status & (1 << i)){
87+
if(__timerInterruptHandlers[i] && (status & (1 << i))){
8888
__timerInterruptHandlers[i]();
8989
}
9090
}

cores/esp32/esp32-hal-uart.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "soc/io_mux_reg.h"
2828
#include "soc/gpio_sig_map.h"
2929
#include "soc/dport_reg.h"
30+
#include "soc/rtc.h"
3031
#include "esp_intr_alloc.h"
3132

3233
#define UART_REG_BASE(u) ((u==0)?DR_REG_UART_BASE:( (u==1)?DR_REG_UART1_BASE:( (u==2)?DR_REG_UART2_BASE:0)))
@@ -352,7 +353,7 @@ void uartSetBaudRate(uart_t* uart, uint32_t baud_rate)
352353
return;
353354
}
354355
UART_MUTEX_LOCK();
355-
uint32_t clk_div = ((UART_CLK_FREQ<<4)/baud_rate);
356+
uint32_t clk_div = ((rtc_clk_apb_freq_get()<<4)/baud_rate);
356357
uart->dev->clk_div.div_int = clk_div>>4 ;
357358
uart->dev->clk_div.div_frag = clk_div & 0xf;
358359
UART_MUTEX_UNLOCK();

cores/esp32/esp32-hal.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,14 @@ void yield(void);
7272
//returns chip temperature in Celsius
7373
float temperatureRead();
7474

75-
bool cpuFrequencySet(uint32_t cpu_freq_mhz);
76-
uint32_t cpuFrequencyGet();
75+
//function takes the following frequencies as valid values:
76+
// 240, 160, 80 <<< For all XTAL types
77+
// 40, 20, 13, 10, 8, 5, 4, 3, 2, 1 <<< For 40MHz XTAL
78+
// 26, 13, 5, 4, 3, 2, 1 <<< For 26MHz XTAL
79+
// 24, 12, 8, 6, 4, 3, 2, 1 <<< For 24MHz XTAL
80+
bool setCpuFrequency(uint32_t cpu_freq_mhz);
81+
uint32_t getCpuFrequency();
82+
uint32_t getApbFrequency();
7783

7884
unsigned long micros();
7985
unsigned long millis();

0 commit comments

Comments
 (0)