From df777e83d16d24c737caff3d8bac58a360e5d2cd Mon Sep 17 00:00:00 2001 From: Philippe G Date: Wed, 5 Jan 2022 11:53:29 -0800 Subject: [PATCH] Some SPI displays require cs_post adjusted per speed - release --- components/display/SH1106.c | 6 +++++- components/display/core/gds_private.h | 3 ++- components/display/core/ifaces/default_if_spi.c | 7 +++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/components/display/SH1106.c b/components/display/SH1106.c index c7d2da2e..7bd28182 100644 --- a/components/display/SH1106.c +++ b/components/display/SH1106.c @@ -86,6 +86,10 @@ static void SetContrast( struct GDS_Device* Device, uint8_t Contrast ) { Device->WriteCommand( Device, Contrast ); } +static void SPIParams(int Speed, uint8_t *mode, uint8_t *CS_pre, uint8_t *CS_post) { + *CS_post = Speed / (8*1000*1000); +} + static bool Init( struct GDS_Device* Device ) { #ifdef SHADOW_BUFFER struct PrivateSpace *Private = (struct PrivateSpace*) Device->Private; @@ -140,7 +144,7 @@ static const struct GDS_Device SH1106 = { .SetLayout = SetLayout, .Update = Update, .Init = Init, .Depth = 1, - .CS_post = 2, + .SPIParams = SPIParams, #if !defined SHADOW_BUFFER && defined USE_IRAM .Alloc = GDS_ALLOC_IRAM_SPI; #endif diff --git a/components/display/core/gds_private.h b/components/display/core/gds_private.h index db0339b4..6b098ebe 100644 --- a/components/display/core/gds_private.h +++ b/components/display/core/gds_private.h @@ -86,7 +86,6 @@ struct GDS_Device { struct { spi_device_handle_t SPIHandle; int8_t CSPin; - int8_t CS_pre, CS_post, SPI_mode; }; }; @@ -125,6 +124,8 @@ struct GDS_Device { // may provide for optimization void (*DrawRGB)( struct GDS_Device* Device, uint8_t *Image,int x, int y, int Width, int Height, int RGB_Mode ); void (*ClearWindow)( struct GDS_Device* Device, int x1, int y1, int x2, int y2, int Color ); + // may provide for tweaking + void (*SPIParams)(int Speed, uint8_t *mode, uint8_t *CS_pre, uint8_t *CS_post); // interface-specific methods WriteCommandProc WriteCommand; diff --git a/components/display/core/ifaces/default_if_spi.c b/components/display/core/ifaces/default_if_spi.c index 1ce03dbf..968ce51c 100644 --- a/components/display/core/ifaces/default_if_spi.c +++ b/components/display/core/ifaces/default_if_spi.c @@ -51,10 +51,9 @@ bool GDS_SPIAttachDevice( struct GDS_Device* Device, int Width, int Height, int SPIDeviceConfig.spics_io_num = CSPin; SPIDeviceConfig.queue_size = 1; SPIDeviceConfig.flags = SPI_DEVICE_NO_DUMMY; - SPIDeviceConfig.cs_ena_pretrans = Device->CS_pre; - SPIDeviceConfig.cs_ena_posttrans = Device->CS_post; - SPIDeviceConfig.mode = Device->SPI_mode; - + if (Device->SPIParams) Device->SPIParams(SPIDeviceConfig.clock_speed_hz, &SPIDeviceConfig.mode, + &SPIDeviceConfig.cs_ena_pretrans, &SPIDeviceConfig.cs_ena_posttrans); + ESP_ERROR_CHECK_NONFATAL( spi_bus_add_device( SPIHost, &SPIDeviceConfig, &SPIDevice ), return false ); Device->WriteCommand = SPIDefaultWriteCommand;