From 71805266451b6b6bee7539eeef044ff86ea2dbd2 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Tue, 15 Jun 2021 15:11:47 +0800 Subject: [PATCH] spi_flash: fix cs line setup to make the flash driver more stable --- components/soc/esp32/include/hal/spi_flash_ll.h | 6 ++++++ components/soc/esp32s2beta/include/hal/gpspi_flash_ll.h | 5 +++++ components/soc/esp32s2beta/include/hal/spi_flash_ll.h | 2 ++ components/soc/esp32s2beta/include/hal/spimem_flash_ll.h | 6 ++++++ components/soc/src/hal/spi_flash_hal_common.inc | 1 + 5 files changed, 20 insertions(+) diff --git a/components/soc/esp32/include/hal/spi_flash_ll.h b/components/soc/esp32/include/hal/spi_flash_ll.h index 814dc3817e..8999728d79 100644 --- a/components/soc/esp32/include/hal/spi_flash_ll.h +++ b/components/soc/esp32/include/hal/spi_flash_ll.h @@ -359,3 +359,9 @@ static inline void spi_flash_ll_set_dummy(spi_dev_t *dev, uint32_t dummy_n) dev->user.usr_dummy = dummy_n ? 1 : 0; dev->user1.usr_dummy_cyclelen = dummy_n - 1; } + +static inline void spi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup_time) +{ + dev->user.cs_setup = (cs_setup_time > 0 ? 1 : 0); + dev->ctrl2.setup_time = cs_setup_time - 1; +} diff --git a/components/soc/esp32s2beta/include/hal/gpspi_flash_ll.h b/components/soc/esp32s2beta/include/hal/gpspi_flash_ll.h index 5e1f0e0655..51b77d4b43 100644 --- a/components/soc/esp32s2beta/include/hal/gpspi_flash_ll.h +++ b/components/soc/esp32s2beta/include/hal/gpspi_flash_ll.h @@ -321,3 +321,8 @@ static inline void gpspi_flash_ll_set_dummy(spi_dev_t *dev, uint32_t dummy_n) dev->user1.usr_dummy_cyclelen = dummy_n - 1; } +static inline void gpspi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup_time) +{ + dev->user.cs_setup = (cs_setup_time > 0 ? 1 : 0); + dev->ctrl2.cs_setup_time = cs_setup_time - 1; +} diff --git a/components/soc/esp32s2beta/include/hal/spi_flash_ll.h b/components/soc/esp32s2beta/include/hal/spi_flash_ll.h index ced6103e38..1e2da8daa7 100644 --- a/components/soc/esp32s2beta/include/hal/spi_flash_ll.h +++ b/components/soc/esp32s2beta/include/hal/spi_flash_ll.h @@ -66,6 +66,7 @@ typedef union { #define spi_flash_ll_set_addr_bitlen(dev, bitlen) gpspi_flash_ll_set_addr_bitlen((spi_dev_t*)dev, bitlen) #define spi_flash_ll_set_address(dev, addr) gpspi_flash_ll_set_address((spi_dev_t*)dev, addr) #define spi_flash_ll_set_dummy(dev, dummy) gpspi_flash_ll_set_dummy((spi_dev_t*)dev, dummy) +#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) gpspi_flash_ll_set_cs_setup((spi_dev_t*)dev, cs_setup_time) #else #define spi_flash_ll_reset(dev) spimem_flash_ll_reset((spi_mem_dev_t*)dev) #define spi_flash_ll_cmd_is_done(dev) spimem_flash_ll_cmd_is_done((spi_mem_dev_t*)dev) @@ -88,4 +89,5 @@ typedef union { #define spi_flash_ll_set_addr_bitlen(dev, bitlen) spimem_flash_ll_set_addr_bitlen((spi_mem_dev_t*)dev, bitlen) #define spi_flash_ll_set_address(dev, addr) spimem_flash_ll_set_address((spi_mem_dev_t*)dev, addr) #define spi_flash_ll_set_dummy(dev, dummy) spimem_flash_ll_set_dummy((spi_mem_dev_t*)dev, dummy) +#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) spimem_flash_ll_set_cs_setup((spi_mem_dev_t*)dev, cs_setup_time) #endif diff --git a/components/soc/esp32s2beta/include/hal/spimem_flash_ll.h b/components/soc/esp32s2beta/include/hal/spimem_flash_ll.h index fdf26fd3fe..72ae82455c 100644 --- a/components/soc/esp32s2beta/include/hal/spimem_flash_ll.h +++ b/components/soc/esp32s2beta/include/hal/spimem_flash_ll.h @@ -353,3 +353,9 @@ static inline void spimem_flash_ll_set_dummy(spi_mem_dev_t *dev, uint32_t dummy_ dev->user.usr_dummy = dummy_n ? 1 : 0; dev->user1.usr_dummy_cyclelen = dummy_n - 1; } + +static inline void spimem_flash_ll_set_cs_setup(spi_mem_dev_t *dev, uint32_t cs_setup_time) +{ + dev->user.cs_setup = (cs_setup_time > 0 ? 1 : 0); + dev->ctrl2.cs_setup_time = cs_setup_time - 1; +} diff --git a/components/soc/src/hal/spi_flash_hal_common.inc b/components/soc/src/hal/spi_flash_hal_common.inc index fe888b3e23..2e8f510b9c 100644 --- a/components/soc/src/hal/spi_flash_hal_common.inc +++ b/components/soc/src/hal/spi_flash_hal_common.inc @@ -40,6 +40,7 @@ esp_err_t spi_flash_hal_device_config(spi_flash_host_driver_t *host) spi_flash_ll_reset(dev); spi_flash_ll_set_cs_pin(dev, drv_data->cs_num); spi_flash_ll_set_clock(dev, &drv_data->clock_conf); + spi_flash_ll_set_cs_setup(dev, 1); return ESP_OK; }