2019-01-08 05:29:25 -05:00
// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2017-05-23 22:35:12 -04:00
# pragma once
2019-01-08 05:29:25 -05:00
# include "esp_flash.h"
2021-05-18 00:05:41 -04:00
# include "esp_attr.h"
2019-01-08 05:29:25 -05:00
struct esp_flash_t ;
typedef struct esp_flash_t esp_flash_t ;
2017-05-23 22:35:12 -04:00
2019-01-08 05:29:25 -05:00
typedef struct spi_flash_chip_t spi_flash_chip_t ;
2020-04-29 22:37:35 -04:00
/** Timeout configurations for flash operations, all in us */
typedef struct {
2021-01-08 05:36:23 -05:00
uint32_t idle_timeout ; ///< Default timeout for other commands to be sent by host and get done by flash
2020-04-29 22:37:35 -04:00
uint32_t chip_erase_timeout ; ///< Timeout for chip erase operation
uint32_t block_erase_timeout ; ///< Timeout for block erase operation
uint32_t sector_erase_timeout ; ///< Timeout for sector erase operation
uint32_t page_program_timeout ; ///< Timeout for page program operation
} flash_chip_op_timeout_t ;
2020-07-26 15:13:07 -04:00
typedef enum {
SPI_FLASH_REG_STATUS = 1 ,
} spi_flash_register_t ;
2021-05-18 00:05:41 -04:00
typedef enum {
SPI_FLASH_CHIP_CAP_SUSPEND = BIT ( 0 ) , ///< Flash chip support suspend feature.
SPI_FLASH_CHIP_CAP_32MB_SUPPORT = BIT ( 1 ) , ///< Flash chip driver support flash size larger than 32M Bytes.
} spi_flash_caps_t ;
FLAG_ATTR ( spi_flash_caps_t )
2019-01-08 05:29:25 -05:00
/** @brief SPI flash chip driver definition structure.
2017-05-23 22:35:12 -04:00
*
2019-01-08 05:29:25 -05:00
* The chip driver structure contains chip - specific pointers to functions to perform SPI flash operations , and some
2017-05-23 22:35:12 -04:00
* chip - specific numeric values .
*
2019-01-08 05:29:25 -05:00
* @ note This is not a public API . These functions are called from the public API ( declared in
* esp_flash . h ) . They assume the caller has already validated arguments and enabled relevant protections
2017-05-23 22:35:12 -04:00
* ( disabling flash cache , prevent concurrent SPI access , etc . )
*
2019-01-08 05:29:25 -05:00
* Do not call chip driver functions directly in other contexts .
2017-05-23 22:35:12 -04:00
*
2019-01-08 05:29:25 -05:00
* A generic driver for generic chips and its related operations are defined in
* spi_flash_chip_generic . h which can be used as building blocks for written
* new / specific SPI flash chip drivers .
2017-05-23 22:35:12 -04:00
*
* @ note All of these functions may be called with SPI flash cache disabled , so must only ever access IRAM / DRAM / ROM .
*/
2019-01-08 05:29:25 -05:00
struct spi_flash_chip_t {
const char * name ; ///< Name of the chip driver
2020-04-29 22:37:35 -04:00
const flash_chip_op_timeout_t * timeout ; ///< Timeout configuration for this chip
2017-05-23 22:35:12 -04:00
/* Probe to detect if a supported SPI flash chip is found.
*
* Attempts to configure ' chip ' with these operations and probes for a matching SPI flash chip .
*
* Auto - detection of a SPI flash chip calls this function in turn on each registered driver ( see esp_flash_registered_flash_drivers ) .
*
* ID - as read by spi_flash_generic_read_id ( ) - is supplied so each probe
* function doesn ' t need to unnecessarily read ID , but probe is permitted
* to interrogate flash in any non - destructive way .
*
* It is permissible for the driver to modify the ' chip ' structure if probing succeeds ( specifically , to assign something to the
* driver_data pointer if that is useful for the driver . )
*
2019-01-08 05:29:25 -05:00
* @ return ESP_OK if probing was successful , an error otherwise . Driver may
* assume that returning ESP_OK means it has claimed this chip .
2017-05-23 22:35:12 -04:00
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * probe ) ( esp_flash_t * chip , uint32_t flash_id ) ;
esp_err_t ( * reset ) ( esp_flash_t * chip ) ;
2017-05-23 22:35:12 -04:00
/* Detect SPI flash size
*
2019-01-08 05:29:25 -05:00
* Interrogate the chip to detect its size .
2017-05-23 22:35:12 -04:00
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * detect_size ) ( esp_flash_t * chip , uint32_t * size ) ;
2017-05-23 22:35:12 -04:00
/* Erase the entire chip
Caller has verified the chip is not write protected .
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * erase_chip ) ( esp_flash_t * chip ) ;
2017-05-23 22:35:12 -04:00
/* Erase a sector of the chip. Sector size is specified in the 'sector_size' field.
sector_address is an offset in bytes .
Caller has verified that this sector should be non - write - protected .
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * erase_sector ) ( esp_flash_t * chip , uint32_t sector_address ) ;
2017-05-23 22:35:12 -04:00
/* Erase a multi-sector block of the chip. Block size is specified in the 'block_erase_size' field.
sector_address is an offset in bytes .
Caller has verified that this block should be non - write - protected .
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * erase_block ) ( esp_flash_t * chip , uint32_t block_address ) ;
2017-05-23 22:35:12 -04:00
uint32_t sector_size ; /* Sector is minimum erase size */
uint32_t block_erase_size ; /* Optimal (fastest) block size for multi-sector erases on this chip */
/* Read the write protect status of the entire chip. */
2019-08-02 01:04:48 -04:00
esp_err_t ( * get_chip_write_protect ) ( esp_flash_t * chip , bool * out_write_protected ) ;
2017-05-23 22:35:12 -04:00
/* Set the write protect status of the entire chip. */
2019-08-02 01:04:48 -04:00
esp_err_t ( * set_chip_write_protect ) ( esp_flash_t * chip , bool chip_write_protect ) ;
2017-05-23 22:35:12 -04:00
/* Number of individually write protectable regions on this chip. Range 0-63. */
uint8_t num_protectable_regions ;
/* Pointer to an array describing each protectable region. Should have num_protectable_regions elements. */
const esp_flash_region_t * protectable_regions ;
/* Get a bitmask describing all protectable regions on the chip. Each bit represents one entry in the
protectable_regions array , ie bit ( 1 < < N ) is set then the region at array entry N is write protected . */
2019-01-08 05:29:25 -05:00
esp_err_t ( * get_protected_regions ) ( esp_flash_t * chip , uint64_t * regions ) ;
2017-05-23 22:35:12 -04:00
/* Set protectable regions on the chip. Each bit represents on entry in the protectable regions array. */
2019-01-08 05:29:25 -05:00
esp_err_t ( * set_protected_regions ) ( esp_flash_t * chip , uint64_t regions ) ;
2017-05-23 22:35:12 -04:00
/* Read data from the chip.
*
* Before calling this function , the caller will have called chip - > drv - > set_read_mode ( chip ) in order to configure the chip ' s read mode correctly .
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * read ) ( esp_flash_t * chip , void * buffer , uint32_t address , uint32_t length ) ;
2017-05-23 22:35:12 -04:00
/* Write any amount of data to the chip.
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * write ) ( esp_flash_t * chip , const void * buffer , uint32_t address , uint32_t length ) ;
2017-05-23 22:35:12 -04:00
/* Use the page program command to write data to the chip.
*
* This function is expected to be called by chip - > drv - > write ( if the
* chip - > drv - > write implementation doesn ' t call it then it can be left as NULL . )
*
* - The length argument supplied to this function is at most ' page_size ' bytes .
*
* - The region between ' address ' and ' address + length ' will not cross a page_size aligned boundary ( the write
* implementation is expected to split such a write into two before calling page_program . )
*/
2019-01-08 05:29:25 -05:00
esp_err_t ( * program_page ) ( esp_flash_t * chip , const void * buffer , uint32_t address , uint32_t length ) ;
2017-05-23 22:35:12 -04:00
/* Page size as written by the page_program function. Usually 256 bytes. */
uint32_t page_size ;
/* Perform an encrypted write to the chip, using internal flash encryption hardware. */
2019-01-08 05:29:25 -05:00
esp_err_t ( * write_encrypted ) ( esp_flash_t * chip , const void * buffer , uint32_t address , uint32_t length ) ;
2017-05-23 22:35:12 -04:00
/* Wait for the SPI flash chip to be idle (any write operation to be complete.) This function is both called from the higher-level API functions, and from other functions in this structure.
2019-01-08 05:29:25 -05:00
timeout_ms should be a timeout ( in milliseconds ) before the function returns ESP_ERR_TIMEOUT . This is useful to avoid hanging
2017-05-23 22:35:12 -04:00
if the chip is otherwise unresponsive ( ie returns all 0xFF or similar . )
*/
2020-08-21 00:09:52 -04:00
esp_err_t ( * wait_idle ) ( esp_flash_t * chip , uint32_t timeout_us ) ;
2017-05-23 22:35:12 -04:00
/* Configure both the SPI host and the chip for the read mode specified in chip->read_mode.
*
* This function is called by the higher - level API before the ' read ' function is called .
*
2019-01-08 05:29:25 -05:00
* Can return ESP_ERR_FLASH_UNSUPPORTED_HOST or ESP_ERR_FLASH_UNSUPPORTED_CHIP if the specified mode is unsupported .
2017-05-23 22:35:12 -04:00
*/
2019-09-05 01:11:36 -04:00
esp_err_t ( * set_io_mode ) ( esp_flash_t * chip ) ;
/*
* Get whether the Quad Enable ( QE ) is set . ( * out_io_mode ) = SPI_FLASH_QOUT if
* enabled , otherwise disabled
*/
esp_err_t ( * get_io_mode ) ( esp_flash_t * chip , esp_flash_io_mode_t * out_io_mode ) ;
2020-07-26 15:13:07 -04:00
/*
* Read the chip ID . Called when chip driver is set , but we want to know the exact chip id ( to
* get the size , etc . ) .
*/
esp_err_t ( * read_id ) ( esp_flash_t * chip , uint32_t * out_chip_id ) ;
/*
* Read the requested register ( status , etc . ) .
*/
esp_err_t ( * read_reg ) ( esp_flash_t * chip , spi_flash_register_t reg_id , uint32_t * out_reg ) ;
2020-12-15 22:50:13 -05:00
/** Yield to other tasks. Called during erase operations. */
esp_err_t ( * yield ) ( esp_flash_t * chip , uint32_t wip ) ;
2020-12-17 23:57:55 -05:00
/** Setup flash suspend configuration. */
esp_err_t ( * sus_setup ) ( esp_flash_t * chip ) ;
2021-05-18 00:05:41 -04:00
/**
* Get the capabilities of the flash chip . See SPI_FLASH_CHIP_CAP_ * macros as reference .
*/
spi_flash_caps_t ( * get_chip_caps ) ( esp_flash_t * chip ) ;
2019-01-08 05:29:25 -05:00
} ;
2017-05-23 22:35:12 -04:00
/* Pointer to an array of pointers to all known drivers for flash chips. This array is used
by esp_flash_init ( ) to detect the flash chip driver , if none is supplied by the caller .
Array is terminated with a NULL pointer .
This pointer can be overwritten with a pointer to a new array , to update the list of known flash chips .
*/
2019-01-08 05:29:25 -05:00
extern const spi_flash_chip_t * * esp_flash_registered_chips ;