Skip to content

Commit a266398

Browse files
committed
tweak for ESP32P4
1 parent 327d699 commit a266398

File tree

6 files changed

+124
-49
lines changed

6 files changed

+124
-49
lines changed

src/lgfx/v1/LGFXBase.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ namespace lgfx
302302
LGFX_INLINE_T void clear ( const T& color) { setBaseColor(color); clearDisplay(); }
303303
LGFX_INLINE void clear ( void ) { clearDisplay(); }
304304
LGFX_INLINE_T void clearDisplay( const T& color) { setBaseColor(color); clearDisplay(); }
305-
LGFX_INLINE void clearDisplay( void ) { fillScreen(~_base_rgb888); fillScreen(_base_rgb888); }
305+
LGFX_INLINE void clearDisplay( void ) { if (isEPD()) { fillScreen(~_base_rgb888); } fillScreen(_base_rgb888); }
306306

307307
LGFX_INLINE void setPivot(float x, float y) { _xpivot = x; _ypivot = y; }
308308
LGFX_INLINE float getPivotX(void) const { return _xpivot; }

src/lgfx/v1/gitTagVersion.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#define LGFX_VERSION_MAJOR 1
22
#define LGFX_VERSION_MINOR 2
3-
#define LGFX_VERSION_PATCH 4
3+
#define LGFX_VERSION_PATCH 6
44
#define LOVYANGFX_VERSION F( LGFX_VERSION_MAJOR "." LGFX_VERSION_MINOR "." LGFX_VERSION_PATCH )

src/lgfx/v1/platforms/esp32/Bus_I2C.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ namespace lgfx
104104
auto dev = &I2C0;
105105
#endif
106106

107-
#if defined (CONFIG_IDF_TARGET_ESP32C3) || defined (CONFIG_IDF_TARGET_ESP32C6) || defined (CONFIG_IDF_TARGET_ESP32S3)
107+
#if defined (CONFIG_IDF_TARGET_ESP32C3) || defined (CONFIG_IDF_TARGET_ESP32C6) || defined (CONFIG_IDF_TARGET_ESP32S3) || defined (CONFIG_IDF_TARGET_ESP32P4)
108108
while (dev->sr.bus_busy) { taskYIELD(); }
109109
#else
110110
while (dev->status_reg.bus_busy) { taskYIELD(); }
@@ -119,7 +119,7 @@ namespace lgfx
119119
auto dev = &I2C0;
120120
#endif
121121

122-
#if defined (CONFIG_IDF_TARGET_ESP32C3) || defined (CONFIG_IDF_TARGET_ESP32C6) || defined (CONFIG_IDF_TARGET_ESP32S3)
122+
#if defined (CONFIG_IDF_TARGET_ESP32C3) || defined (CONFIG_IDF_TARGET_ESP32C6) || defined (CONFIG_IDF_TARGET_ESP32S3) || defined (CONFIG_IDF_TARGET_ESP32P4)
123123
return dev->sr.bus_busy;
124124
#else
125125
return dev->status_reg.bus_busy;

src/lgfx/v1/platforms/esp32/Bus_SPI.cpp

+29-12
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,34 @@ Original Source:
6464

6565
#if defined (SOC_GDMA_SUPPORTED) // for C3/C6/S3
6666
#include <soc/gdma_channel.h>
67-
#include <soc/gdma_reg.h>
68-
#include <soc/gdma_struct.h>
69-
#if !defined DMA_OUT_LINK_CH0_REG
70-
#define DMA_OUT_LINK_CH0_REG GDMA_OUT_LINK_CH0_REG
71-
#define DMA_OUTFIFO_STATUS_CH0_REG GDMA_OUTFIFO_STATUS_CH0_REG
72-
#define DMA_OUTLINK_START_CH0 GDMA_OUTLINK_START_CH0
73-
#if defined (GDMA_OUTFIFO_EMPTY_L3_CH0)
74-
#define DMA_OUTFIFO_EMPTY_CH0 GDMA_OUTFIFO_EMPTY_L3_CH0
75-
#else
76-
#define DMA_OUTFIFO_EMPTY_CH0 GDMA_OUTFIFO_EMPTY_CH0
67+
#if __has_include(<soc/gdma_reg.h>)
68+
#include <soc/gdma_reg.h>
69+
#elif __has_include(<soc/axi_dma_reg.h>) // ESP32P4
70+
#include <soc/axi_dma_reg.h>
71+
#endif
72+
#if __has_include(<soc/gdma_struct.h>)
73+
#include <soc/gdma_struct.h>
74+
#elif __has_include(<soc/axi_dma_struct.h>) // ESP32P4
75+
#include <soc/axi_dma_struct.h>
76+
#endif
77+
#if defined AXI_DMA_OUT_LINK1_CH0_REG
78+
#define DMA_OUT_LINK_CH0_REG AXI_DMA_OUT_LINK1_CH0_REG
79+
#define DMA_OUTFIFO_STATUS_CH0_REG AXI_DMA_OUTFIFO_STATUS_CH0_REG
80+
#define DMA_OUTLINK_START_CH0 AXI_DMA_OUTLINK_START_CH0
81+
#define DMA_OUTFIFO_EMPTY_CH0 AXI_DMA_OUTFIFO_L3_EMPTY_CH0
82+
#define SIZE_OF_DMA_OUT_CH (sizeof(axi_dma_out_reg_t))
83+
#else
84+
#if !defined DMA_OUT_LINK_CH0_REG
85+
#define DMA_OUT_LINK_CH0_REG GDMA_OUT_LINK_CH0_REG
86+
#define DMA_OUTFIFO_STATUS_CH0_REG GDMA_OUTFIFO_STATUS_CH0_REG
87+
#define DMA_OUTLINK_START_CH0 GDMA_OUTLINK_START_CH0
88+
#if defined (GDMA_OUTFIFO_EMPTY_L3_CH0)
89+
#define DMA_OUTFIFO_EMPTY_CH0 GDMA_OUTFIFO_EMPTY_L3_CH0
90+
#else
91+
#define DMA_OUTFIFO_EMPTY_CH0 GDMA_OUTFIFO_EMPTY_CH0
92+
#endif
7793
#endif
94+
#define SIZE_OF_DMA_OUT_CH (sizeof(GDMA.channel[0]))
7895
#endif
7996
#endif
8097

@@ -152,8 +169,8 @@ namespace lgfx
152169

153170
if (assigned_dma_ch >= 0)
154171
{ // DMAチャンネルが特定できたらそれを使用する;
155-
_spi_dma_out_link_reg = reg(DMA_OUT_LINK_CH0_REG + assigned_dma_ch * sizeof(GDMA.channel[0]));
156-
_spi_dma_outstatus_reg = reg(DMA_OUTFIFO_STATUS_CH0_REG + assigned_dma_ch * sizeof(GDMA.channel[0]));
172+
_spi_dma_out_link_reg = reg(DMA_OUT_LINK_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH);
173+
_spi_dma_outstatus_reg = reg(DMA_OUTFIFO_STATUS_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH);
157174
}
158175
#elif defined ( CONFIG_IDF_TARGET_ESP32 ) || !defined ( CONFIG_IDF_TARGET )
159176

src/lgfx/v1/platforms/esp32/common.cpp

+86-32
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,27 @@ Original Source:
104104
#endif
105105

106106
#if defined (SOC_GDMA_SUPPORTED) // for C3/S3
107-
#include <soc/gdma_reg.h>
108-
#include <soc/gdma_struct.h>
109-
// S3とC3で同じレジスタに異なる定義名がついているため、ここで統一;
110-
#if !defined (DMA_OUT_PERI_SEL_CH0_REG)
111-
#define DMA_OUT_PERI_SEL_CH0_REG GDMA_OUT_PERI_SEL_CH0_REG
107+
#if __has_include(<soc/gdma_reg.h>)
108+
#include <soc/gdma_reg.h>
109+
#elif __has_include(<soc/axi_dma_reg.h>) // ESP32P4
110+
#include <soc/axi_dma_reg.h>
112111
#endif
113-
#if !defined (DMA_IN_PERI_SEL_CH0_REG)
114-
#define DMA_IN_PERI_SEL_CH0_REG GDMA_IN_PERI_SEL_CH0_REG
112+
#if __has_include(<soc/gdma_struct.h>)
113+
#include <soc/gdma_struct.h>
114+
#elif __has_include(<soc/axi_dma_struct.h>) // ESP32P4
115+
#include <soc/axi_dma_struct.h>
116+
#endif
117+
// レジスタに異なる定義名がついているため、ここで統一;
118+
#if defined AXI_DMA_OUT_PERI_SEL_CH0_REG
119+
#define DMA_OUT_PERI_SEL_CH0_REG AXI_DMA_OUT_PERI_SEL_CH0_REG
120+
#define DMA_IN_PERI_SEL_CH0_REG AXI_DMA_IN_PERI_SEL_CH0_REG
121+
#else
122+
#if !defined (DMA_OUT_PERI_SEL_CH0_REG)
123+
#define DMA_OUT_PERI_SEL_CH0_REG GDMA_OUT_PERI_SEL_CH0_REG
124+
#define DMA_IN_PERI_SEL_CH0_REG GDMA_IN_PERI_SEL_CH0_REG
125+
#define DMA_PERI_OUT_SEL_CH0_M GDMA_PERI_OUT_SEL_CH0_M
126+
#define DMA_PERI_IN_SEL_CH0_M GDMA_PERI_IN_SEL_CH0_M
127+
#endif
115128
#endif
116129

117130
#if !defined (SOC_GDMA_PAIRS_PER_GROUP_MAX)
@@ -129,7 +142,7 @@ namespace lgfx
129142

130143
static int search_pin_number(int peripheral_sig)
131144
{
132-
#if defined (CONFIG_IDF_TARGET_ESP32C6)
145+
#if defined (CONFIG_IDF_TARGET_ESP32C6) || defined (CONFIG_IDF_TARGET_ESP32P4)
133146
uint32_t result = GPIO.func_in_sel_cfg[peripheral_sig].in_sel;
134147
#else
135148
uint32_t result = GPIO.func_in_sel_cfg[peripheral_sig].func_sel;
@@ -144,7 +157,11 @@ namespace lgfx
144157
if (conf.freq_mhz >= 80){
145158
return 80 * 1000000;
146159
}
147-
return (conf.source_freq_mhz * 1000000) / conf.div;
160+
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
161+
return (conf.source_freq_mhz * 1000000) / conf.div.integer;
162+
#else
163+
return (conf.source_freq_mhz * 1000000) / conf.div;
164+
#endif
148165
}
149166

150167
uint32_t FreqToClockDiv(uint32_t fapb, uint32_t hz)
@@ -225,8 +242,13 @@ namespace lgfx
225242
// GDMAペリフェラルレジスタの配列を順に調べてペリフェラル番号が一致するDMAチャンネルを特定する;
226243
for (int i = 0; i < SOC_GDMA_PAIRS_PER_GROUP_MAX; ++i)
227244
{
228-
// ESP_LOGD("DBG","GDMA.channel:%d peri_sel:%d", i, GDMA.channel[i].out.peri_sel.sel);
229-
if ((*reg(DMA_OUT_PERI_SEL_CH0_REG + i * sizeof(GDMA.channel[0])) & 0x3F) == peripheral_select)
245+
#if defined AXI_DMA_OUT_PERI_SEL_CH0_REG
246+
bool hit = (*reg(DMA_OUT_PERI_SEL_CH0_REG + i * sizeof(AXI_DMA.out[0])) & AXI_DMA_PERI_OUT_SEL_CH0_M) == peripheral_select;
247+
#else
248+
// ESP_LOGD("DBG","GDMA.channel:%d peri_sel:%d", i, GDMA.channel[i].out.peri_sel.sel);
249+
bool hit = (*reg(DMA_OUT_PERI_SEL_CH0_REG + i * sizeof(GDMA.channel[0])) & DMA_PERI_OUT_SEL_CH0_M) == peripheral_select;
250+
#endif
251+
if (hit)
230252
{
231253
// ESP_LOGD("DBG","GDMA.channel:%d hit", i);
232254
return i;
@@ -246,8 +268,13 @@ namespace lgfx
246268
// GDMAペリフェラルレジスタの配列を順に調べてペリフェラル番号が一致するDMAチャンネルを特定する;
247269
for (int i = 0; i < SOC_GDMA_PAIRS_PER_GROUP_MAX; ++i)
248270
{
249-
// ESP_LOGD("DBG","GDMA.channel:%d peri_sel:%d", i, GDMA.channel[i].out.peri_sel.sel);
250-
if ((*reg(DMA_IN_PERI_SEL_CH0_REG + i * sizeof(GDMA.channel[0])) & 0x3F) == peripheral_select)
271+
#if defined AXI_DMA_OUT_PERI_SEL_CH0_REG
272+
bool hit = (*reg(DMA_IN_PERI_SEL_CH0_REG + i * sizeof(AXI_DMA.in[0])) & AXI_DMA_PERI_IN_SEL_CH0_M) == peripheral_select;
273+
#else
274+
// ESP_LOGD("DBG","GDMA.channel:%d peri_sel:%d", i, GDMA.channel[i].out.peri_sel.sel);
275+
bool hit = (*reg(DMA_IN_PERI_SEL_CH0_REG + i * sizeof(GDMA.channel[0])) & DMA_PERI_IN_SEL_CH0_M) == peripheral_select;
276+
#endif
277+
if (hit)
251278
{
252279
// ESP_LOGD("DBG","GDMA.channel:%d hit", i);
253280
return i;
@@ -286,9 +313,8 @@ namespace lgfx
286313
(volatile uint32_t*)GPIO_ENABLE1_W1TS_REG,
287314
#endif
288315
};
289-
/// pin番号が32未満かどうかで分岐する。 bit0は OUTPUT enか否かで切替。
290-
auto gpio_en_reg = gpio_en_regs[((pin >> 5) << 1) + (mode == pin_mode_t::output ? 1 : 0)];
291-
*gpio_en_reg = 1u << (pin & 31);
316+
/// pin番号が32未満かどうかで分岐する。 bit0は OUTPUT en。
317+
// auto gpio_en_reg = gpio_en_regs[((pin >> 5) << 1) + (mode == pin_mode_t::output ? 1 : 0)];
292318

293319
auto io_mux_reg = (volatile uint32_t*)(GPIO_PIN_MUX_REG[pin]);
294320
auto io_mux_val = *io_mux_reg; // & ~(FUN_PU_M | FUN_PD_M | SLP_PU_M | SLP_PD_M | MCU_SEL_M);
@@ -321,9 +347,15 @@ namespace lgfx
321347

322348
*io_mux_reg = io_mux_val;
323349

324-
GPIO.pin[pin].pad_driver = 0; // 1 = OpenDrain / 0 = normal output
350+
GPIO.pin[pin].pad_driver = (mode == pin_mode_t::output) ? 0 : 1; // 1 = OpenDrain / 0 = normal output
351+
if (mode != pin_mode_t::output) {
352+
gpio_hi(pin);
353+
}
354+
auto gpio_en_reg = gpio_en_regs[((pin >> 5) << 1) + 1];
355+
*gpio_en_reg = 1u << (pin & 31);
356+
325357

326-
#if defined (CONFIG_IDF_TARGET_ESP32C6)
358+
#if defined (CONFIG_IDF_TARGET_ESP32C6) || defined (CONFIG_IDF_TARGET_ESP32P4)
327359
GPIO.func_out_sel_cfg[pin].out_sel = SIG_GPIO_OUT_IDX;
328360
#else
329361
GPIO.func_out_sel_cfg[pin].func_sel = SIG_GPIO_OUT_IDX;
@@ -357,8 +389,14 @@ namespace lgfx
357389

358390
size_t func_num = ((_gpio_func_out_reg >> GPIO_FUNC0_OUT_SEL_S) & GPIO_FUNC0_OUT_SEL_V);
359391
if (func_num < sizeof(GPIO.func_in_sel_cfg) / sizeof(GPIO.func_in_sel_cfg[0])) {
392+
#if defined ( GPIO_FUNC0_IN_SEL_CFG_REG )
360393
_gpio_func_in_reg = *reinterpret_cast<uint32_t*>(GPIO_FUNC0_IN_SEL_CFG_REG + (func_num * 4));
361-
if (func_num == ((_gpio_func_in_reg >> GPIO_FUNC0_IN_SEL_S) & GPIO_FUNC0_IN_SEL_V)) {
394+
bool hit = func_num == ((_gpio_func_in_reg >> GPIO_FUNC0_IN_SEL_S) & GPIO_FUNC0_IN_SEL_V);
395+
#else
396+
_gpio_func_in_reg = *reinterpret_cast<uint32_t*>(GPIO_FUNC1_IN_SEL_CFG_REG + ((func_num - 1) * 4));
397+
bool hit = func_num == ((_gpio_func_in_reg >> GPIO_FUNC1_IN_SEL_S) & GPIO_FUNC1_IN_SEL_V);
398+
#endif
399+
if (hit) {
362400
_in_func_num = func_num;
363401
// ESP_LOGD("DEBUG","backup pin:%d : func_num:%d", pin_num, _in_func_num);
364402
}
@@ -437,6 +475,7 @@ namespace lgfx
437475
while (cmd_list[0] != command_end)
438476
{
439477
auto cmd = (command_t)cmd_list[0];
478+
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
440479
bool res = command(cmd, cmd_list[1]);
441480
if (cmd == command_read) {
442481
result = (result << 1) + res;
@@ -737,7 +776,7 @@ namespace lgfx
737776
}
738777
static volatile uint32_t* getFifoAddr(int num)
739778
{
740-
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
779+
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
741780
return &(getDev(num)->data.val);
742781
#else
743782
return &(getDev(num)->fifo_data.val);
@@ -787,7 +826,7 @@ namespace lgfx
787826
void save_reg(i2c_dev_t* dev)
788827
{
789828
auto reg = (volatile uint32_t*)dev;
790-
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
829+
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
791830
auto fifo_reg = (volatile uint32_t*)(&dev->data);
792831
#else
793832
auto fifo_reg = (volatile uint32_t*)(&dev->fifo_data);
@@ -802,7 +841,7 @@ namespace lgfx
802841
void load_reg(i2c_dev_t* dev)
803842
{
804843
auto reg = (volatile uint32_t*)dev;
805-
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
844+
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
806845
auto fifo_reg = (volatile uint32_t*)(&dev->data);
807846
#else
808847
auto fifo_reg = (volatile uint32_t*)(&dev->fifo_data);
@@ -853,7 +892,7 @@ namespace lgfx
853892
{
854893
#if defined ( CONFIG_IDF_TARGET_ESP32C3 )
855894
return dev->sr.rx_fifo_cnt;
856-
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
895+
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
857896
return dev->sr.rxfifo_cnt;
858897
#else
859898
return dev->status_reg.rx_fifo_cnt;
@@ -959,7 +998,7 @@ namespace lgfx
959998
uint32_t us;
960999
#if defined ( CONFIG_IDF_TARGET_ESP32C3 )
9611000
uint32_t us_limit = (dev->scl_high_period.period + dev->scl_low_period.period + 16 ) * (1 + dev->sr.tx_fifo_cnt);
962-
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1001+
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
9631002
uint32_t us_limit = (dev->scl_high_period.scl_high_period + dev->scl_low_period.scl_low_period + 16 ) * (1 + dev->sr.txfifo_cnt);
9641003
#else
9651004
uint32_t us_limit = (dev->scl_high_period.period + dev->scl_low_period.period + 16 ) * (1 + dev->status_reg.tx_fifo_cnt);
@@ -976,7 +1015,7 @@ namespace lgfx
9761015
dev->int_clr.val = int_raw.val;
9771016
#if !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
9781017
if (!int_raw.end_detect || int_raw.ack_err)
979-
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1018+
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
9801019
if (!int_raw.end_detect_int_raw || int_raw.nack_int_raw)
9811020
#else
9821021
if (!int_raw.end_detect || int_raw.nack)
@@ -990,7 +1029,7 @@ namespace lgfx
9901029

9911030
if (flg_stop || res.has_error())
9921031
{
993-
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1032+
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
9941033
if (i2c_context[i2c_port].state == i2c_context_t::state_read || !int_raw.end_detect_int_raw)
9951034
#else
9961035
if (i2c_context[i2c_port].state == i2c_context_t::state_read || !int_raw.end_detect)
@@ -1011,7 +1050,7 @@ namespace lgfx
10111050
while (!(dev->int_raw.val & intmask_) && ((millis() - ms) < 14));
10121051
#if !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
10131052
if (res.has_value() && dev->int_raw.ack_err)
1014-
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1053+
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
10151054
if (res.has_value() && dev->int_raw.nack_int_raw)
10161055
#else
10171056
if (res.has_value() && dev->int_raw.nack)
@@ -1211,7 +1250,11 @@ namespace lgfx
12111250
uint32_t src_clock = 80 * 1000 * 1000;
12121251
if (cpu_freq_conf.freq_mhz < 80)
12131252
{
1253+
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
1254+
src_clock = (cpu_freq_conf.source_freq_mhz * 1000000) / cpu_freq_conf.div.integer;
1255+
#else
12141256
src_clock = (cpu_freq_conf.source_freq_mhz * 1000000) / cpu_freq_conf.div;
1257+
#endif
12151258
}
12161259
// ESP_LOGI("LGFX", "i2c::restart : port:%d / addr:%02x / freq:%d / rw:%d", i2c_port, i2c_addr, freq, read);
12171260
// ESP_LOGI("LGFX", "cpu_freq_conf.div :%d", cpu_freq_conf.div);
@@ -1236,7 +1279,9 @@ namespace lgfx
12361279
uint32_t val = (cycle > 64) ? (I2C_SCL_FILTER_EN | I2C_SDA_FILTER_EN) : 0;
12371280
dev->filter_cfg.val = val;
12381281
uint32_t scl_high_offset = ( val ? 8 : 7 );
1282+
#if !defined ( CONFIG_IDF_TARGET_ESP32P4 )
12391283
dev->clk_conf.sclk_sel = 0;
1284+
#endif
12401285
#else
12411286
dev->scl_filter_cfg.en = cycle > 64;
12421287
dev->scl_filter_cfg.thres = 0;
@@ -1265,7 +1310,7 @@ namespace lgfx
12651310
cycle = (1<<10)-1;
12661311
}
12671312

1268-
#if defined (CONFIG_IDF_TARGET_ESP32S3) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1313+
#if defined (CONFIG_IDF_TARGET_ESP32S3) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
12691314
auto wait_high = scl_high_period >> 2;
12701315
dev->scl_high_period.scl_high_period = scl_high_period - wait_high;
12711316
dev->scl_high_period.scl_wait_high_period = wait_high;
@@ -1315,7 +1360,7 @@ namespace lgfx
13151360
auto dev = getDev(i2c_port);
13161361
i2c_context[i2c_port].lock();
13171362

1318-
#if defined ( CONFIG_IDF_TARGET_ESP32C3 ) || defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1363+
#if defined ( CONFIG_IDF_TARGET_ESP32C3 ) || defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
13191364
if (dev->sr.bus_busy)
13201365
#else
13211366
if (dev->status_reg.bus_busy)
@@ -1327,7 +1372,7 @@ namespace lgfx
13271372
{
13281373
taskYIELD();
13291374
}
1330-
#if defined ( CONFIG_IDF_TARGET_ESP32C3 ) || defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1375+
#if defined ( CONFIG_IDF_TARGET_ESP32C3 ) || defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
13311376
while (dev->sr.bus_busy && micros() - ms < 128);
13321377
#else
13331378
while (dev->status_reg.bus_busy && micros() - ms < 128);
@@ -1344,7 +1389,7 @@ namespace lgfx
13441389
#if defined ( CONFIG_IDF_TARGET_ESP32C3 )
13451390
dev->timeout.time_out_value = 31;
13461391
dev->timeout.time_out_en = 1;
1347-
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1392+
#elif defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
13481393
dev->to.time_out_value = 31;
13491394
dev->to.time_out_en = 1;
13501395
#else
@@ -1434,7 +1479,7 @@ namespace lgfx
14341479
auto dev = getDev(i2c_port);
14351480

14361481
size_t len = 0;
1437-
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
1482+
#if defined ( CONFIG_IDF_TARGET_ESP32S3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 ) || defined ( CONFIG_IDF_TARGET_ESP32P4 )
14381483
uint32_t us_limit = ((dev->scl_high_period.scl_high_period + dev->scl_high_period.scl_wait_high_period + dev->scl_low_period.scl_low_period) << 1);
14391484
#elif defined ( CONFIG_IDF_TARGET_ESP32C3 )
14401485
uint32_t us_limit = ((dev->scl_high_period.period + dev->scl_low_period.period) << 1);
@@ -1560,6 +1605,15 @@ namespace lgfx
15601605
i2c_temporary_switcher_t::i2c_temporary_switcher_t(int i2c_port, int pin_sda, int pin_scl)
15611606
: _i2c_port { i2c_port }
15621607
{
1608+
#if defined ( I2C0_SDA_PAD_IN_IDX )
1609+
#define I2CEXT0_SDA_IN_IDX I2C0_SDA_PAD_IN_IDX
1610+
#define I2CEXT0_SCL_IN_IDX I2C0_SCL_PAD_IN_IDX
1611+
#if defined ( I2C1_SDA_PAD_IN_IDX )
1612+
#define I2CEXT1_SDA_IN_IDX I2C1_SDA_PAD_IN_IDX
1613+
#define I2CEXT1_SCL_IN_IDX I2C1_SCL_PAD_IN_IDX
1614+
#endif
1615+
#endif
1616+
15631617
int peri_sig_sda = I2CEXT0_SDA_IN_IDX;
15641618
int peri_sig_scl = I2CEXT0_SCL_IN_IDX;
15651619
#if defined (I2CEXT1_SDA_IN_IDX)

src/lgfx/v1/platforms/esp32/common.hpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,11 @@ namespace lgfx
129129
pinMode(pin, mode);
130130
}
131131

132-
#if defined ( CONFIG_IDF_TARGET_ESP32C3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
132+
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
133+
static inline volatile uint32_t* get_gpio_hi_reg(int_fast8_t pin) { return (pin & 32) ? &GPIO.out1_w1ts.val : &GPIO.out_w1ts.val; }
134+
static inline volatile uint32_t* get_gpio_lo_reg(int_fast8_t pin) { return (pin & 32) ? &GPIO.out1_w1tc.val : &GPIO.out_w1tc.val; }
135+
static inline bool gpio_in(int_fast8_t pin) { return ((pin & 32) ? GPIO.in1.val : GPIO.in.val) & (1 << (pin & 31)); }
136+
#elif defined ( CONFIG_IDF_TARGET_ESP32C3 ) || defined ( CONFIG_IDF_TARGET_ESP32C6 )
133137
static inline volatile uint32_t* get_gpio_hi_reg(int_fast8_t pin) { return &GPIO.out_w1ts.val; }
134138
static inline volatile uint32_t* get_gpio_lo_reg(int_fast8_t pin) { return &GPIO.out_w1tc.val; }
135139
static inline bool gpio_in(int_fast8_t pin) { return GPIO.in.val & (1 << (pin & 31)); }

0 commit comments

Comments
 (0)