Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions src/M5GFX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -753,7 +753,18 @@ namespace m5gfx
#elif defined (CONFIG_IDF_TARGET_ESP32C5)

static constexpr int32_t i2c_freq = 400000;
// 内部 I2C (G2/G3) は LP_I2C の固定パッドと一致するため LP ポートへ割り当てる。
// PortA も同じバスの物理分配のため、これで HP の I2C0 が丸ごと空く。
// (ポート番号は HP ポート数の次 = C5 では 1。Arduino ビルドでも LP は
// TwoWire を介さず ESP-IDF ドライバで直接駆動される)
// 条件は common.cpp が LP 対応をコンパイルする条件と同一に保つこと
// (条件を満たさない SDK では LP ポートを開けないため HP へフォールバックする)
#if defined ( SOC_LP_I2C_NUM ) && ( SOC_LP_I2C_NUM > 0 ) && __has_include ( <driver/i2c_master.h> ) \
&& defined ( ESP_IDF_VERSION_VAL ) && ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
static constexpr int_fast16_t i2c_port = LP_I2C_NUM_0;
#else
static constexpr int_fast16_t i2c_port = I2C_NUM_0;
#endif

struct Light_M5ToughC5 : public lgfx::ILight
{
Expand Down Expand Up @@ -3290,7 +3301,7 @@ The usage of each pin is as follows.
lgfx::i2c::init(i2c_port, toughc5_i2c_sda, toughc5_i2c_scl);

bus_spi->release();
bus_cfg.freq_write = 20000000;
bus_cfg.freq_write = 40000000;
bus_cfg.freq_read = 16000000;
bus_spi->config(bus_cfg);

Expand Down Expand Up @@ -3320,7 +3331,7 @@ The usage of each pin is as follows.
cfg.pin_sda = toughc5_i2c_sda;
cfg.pin_scl = toughc5_i2c_scl;
cfg.i2c_addr = 0x2E;
cfg.i2c_port = I2C_NUM_0;
cfg.i2c_port = i2c_port;
cfg.freq = 400000;
cfg.x_min = 0;
cfg.x_max = 319;
Expand Down
14 changes: 11 additions & 3 deletions src/lgfx/v1/platforms/esp32/Bus_SPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ Original Source:
#define DMA_OUTLINK_START_CH0 AHB_DMA_OUTLINK_START_CH0
#define DMA_OUTFIFO_EMPTY_CH0 AHB_DMA_OUTFIFO_EMPTY_CH0
#define SIZE_OF_DMA_OUT_CH (sizeof(AHB_DMA.channel[0]))
// AHB_DMA 世代のうち C5/C61 は OUT_LINK レジスタが制御ビットのみになり、
// ディスクリプタアドレスは別レジスタ (チャンネルごとに 4 バイト刻み) へ書く;
// (同じ AHB_DMA でも H4 はアドレスレジスタをチャンネルブロック内に持つため対象外)
#if defined (CONFIG_IDF_TARGET_ESP32C5) || defined (CONFIG_IDF_TARGET_ESP32C61)
#define DMA_OUT_LINK_ADDR_CH0_REG AHB_DMA_OUT_LINK_ADDR_CH0_REG
#endif
#else
#if __has_include(<soc/gdma_struct.h>)
#if !defined DMA_OUT_LINK_CH0_REG
Expand Down Expand Up @@ -224,6 +230,8 @@ namespace lgfx
_spi_dma_outstatus_reg = reg(DMA_OUTFIFO_STATUS_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH);
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
_spi_dma_out_link2_reg = reg(AXI_DMA_OUT_LINK2_CH0_REG + assigned_dma_ch * SIZE_OF_DMA_OUT_CH);
#elif defined ( DMA_OUT_LINK_ADDR_CH0_REG )
_spi_dma_out_link2_reg = reg(DMA_OUT_LINK_ADDR_CH0_REG + assigned_dma_ch * sizeof(uint32_t));
#endif
}
#elif defined ( CONFIG_IDF_TARGET_ESP32 ) || !defined ( CONFIG_IDF_TARGET )
Expand Down Expand Up @@ -712,7 +720,7 @@ namespace lgfx
if (use_dma)
{
auto spi_dma_out_link_reg = _spi_dma_out_link_reg;
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
#if defined ( CONFIG_IDF_TARGET_ESP32P4 ) || defined ( DMA_OUT_LINK_ADDR_CH0_REG )
auto spi_dma_out_link2_reg = _spi_dma_out_link2_reg;
#endif
auto cmd = _spi_cmd_reg;
Expand All @@ -728,7 +736,7 @@ namespace lgfx
auto dma = reg(SPI_DMA_CONF_REG(_spi_port));
*dma = 0; /// Clear previous transfer
uint32_t len = ((length - 1) & ((SPI_MS_DATA_BITLEN)>>3)) + 1;
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
#if defined ( CONFIG_IDF_TARGET_ESP32P4 ) || defined ( DMA_OUT_LINK_ADDR_CH0_REG )
*spi_dma_out_link2_reg = ((uint32_t)(_dmadesc));
*spi_dma_out_link_reg = DMA_OUTLINK_START_CH0 ;
#else
Expand Down Expand Up @@ -946,7 +954,7 @@ namespace lgfx
*_spi_dma_out_link_reg = 0;

#if defined ( SOC_GDMA_SUPPORTED ) && defined ( DMA_OUTLINK_START_CH0 )
#if defined ( CONFIG_IDF_TARGET_ESP32P4 )
#if defined ( CONFIG_IDF_TARGET_ESP32P4 ) || defined ( DMA_OUT_LINK_ADDR_CH0_REG )
*_spi_dma_out_link2_reg = ((uint32_t)(_dmadesc));
*_spi_dma_out_link_reg = DMA_OUTLINK_START_CH0;
#else
Expand Down
3 changes: 2 additions & 1 deletion src/lgfx/v1/platforms/esp32/Bus_SPI.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ namespace lgfx
volatile uint32_t* _spi_cmd_reg = nullptr;
volatile uint32_t* _spi_user_reg = nullptr;
volatile uint32_t* _spi_dma_out_link_reg = nullptr;
#if defined (CONFIG_IDF_TARGET_ESP32P4)
// P4 (AXI_DMA) と C5/C61 (AHB_DMA) はディスクリプタアドレスを OUT_LINK と別のレジスタへ書く;
#if defined (CONFIG_IDF_TARGET_ESP32P4) || defined (CONFIG_IDF_TARGET_ESP32C5) || defined (CONFIG_IDF_TARGET_ESP32C61)
volatile uint32_t* _spi_dma_out_link2_reg = nullptr;
#endif
volatile uint32_t* _spi_dma_outstatus_reg = nullptr;
Expand Down
10 changes: 7 additions & 3 deletions src/lgfx/v1/touch/Touch_CHSC6540.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,17 @@ namespace lgfx
{
flip = !flip;
size_t points = std::min<uint_fast8_t>(count, tmp[0]);
if (points && lgfx::i2c::readBytes(_cfg.i2c_port, &tmp[1], points * 6 - 2))
{}
if (points && !lgfx::i2c::readBytes(_cfg.i2c_port, &tmp[1], points * 6 - 2))
{ // 座標を読み切れなかったフレームは破棄する (ゼロ埋めの座標を有効タッチとして返さないため);
tmp[0] = 0;
}
}
if (lgfx::i2c::endTransaction(_cfg.i2c_port)) {}
if (tmp[0] == 0 || memcmp(buf[0], buf[1], len) == 0) break;
}
if (0 == --retry) return 0;
// リトライを使い切った場合はタッチ無しとせず直近の読み値を採用する。
// (指の移動中は連続読出しが一致しないため、return 0 だとフリックが取れない)
if (0 == --retry) { break; }
}
if (count > tmp[0]) count = tmp[0];

Expand Down
Loading