• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #pragma once
16 #include "esp_flash.h"
17 
18 struct esp_flash_t;
19 typedef struct esp_flash_t esp_flash_t;
20 
21 typedef struct spi_flash_chip_t spi_flash_chip_t;
22 
23 /** Timeout configurations for flash operations, all in us */
24 typedef struct {
25     uint32_t idle_timeout;          ///< Default timeout for other commands to be sent by host and get done by flash
26     uint32_t chip_erase_timeout;    ///< Timeout for chip erase operation
27     uint32_t block_erase_timeout;   ///< Timeout for block erase operation
28     uint32_t sector_erase_timeout;  ///< Timeout for sector erase operation
29     uint32_t page_program_timeout;  ///< Timeout for page program operation
30 } flash_chip_op_timeout_t;
31 
32 typedef enum {
33     SPI_FLASH_REG_STATUS = 1,
34 } spi_flash_register_t;
35 
36 /** @brief SPI flash chip driver definition structure.
37  *
38  * The chip driver structure contains chip-specific pointers to functions to perform SPI flash operations, and some
39  * chip-specific numeric values.
40  *
41  * @note This is not a public API. These functions are called from the public API (declared in
42  * esp_flash.h). They assume the caller has already validated arguments and enabled relevant protections
43  * (disabling flash cache, prevent concurrent SPI access, etc.)
44  *
45  * Do not call chip driver functions directly in other contexts.
46  *
47  * A generic driver for generic chips and its related operations are defined in
48  * spi_flash_chip_generic.h which can be used as building blocks for written
49  * new/specific SPI flash chip drivers.
50  *
51  * @note All of these functions may be called with SPI flash cache disabled, so must only ever access IRAM/DRAM/ROM.
52  */
53 struct spi_flash_chip_t {
54     const char *name; ///< Name of the chip driver
55     const flash_chip_op_timeout_t *timeout; ///< Timeout configuration for this chip
56     /* Probe to detect if a supported SPI flash chip is found.
57      *
58      * Attempts to configure 'chip' with these operations and probes for a matching SPI flash chip.
59      *
60      * Auto-detection of a SPI flash chip calls this function in turn on each registered driver (see esp_flash_registered_flash_drivers).
61      *
62      * ID - as read by spi_flash_generic_read_id() - is supplied so each probe
63      * function doesn't need to unnecessarily read ID, but probe is permitted
64      * to interrogate flash in any non-destructive way.
65      *
66      * It is permissible for the driver to modify the 'chip' structure if probing succeeds (specifically, to assign something to the
67      * driver_data pointer if that is useful for the driver.)
68      *
69      * @return ESP_OK if probing was successful, an error otherwise. Driver may
70      * assume that returning ESP_OK means it has claimed this chip.
71      */
72     esp_err_t (*probe)(esp_flash_t *chip, uint32_t flash_id);
73 
74     esp_err_t (*reset)(esp_flash_t *chip);
75 
76 
77     /* Detect SPI flash size
78      *
79      * Interrogate the chip to detect its size.
80      */
81     esp_err_t (*detect_size)(esp_flash_t *chip, uint32_t *size);
82 
83     /* Erase the entire chip
84 
85        Caller has verified the chip is not write protected.
86      */
87     esp_err_t (*erase_chip)(esp_flash_t *chip);
88 
89     /* Erase a sector of the chip. Sector size is specified in the 'sector_size' field.
90 
91        sector_address is an offset in bytes.
92 
93        Caller has verified that this sector should be non-write-protected.
94      */
95     esp_err_t (*erase_sector)(esp_flash_t *chip, uint32_t sector_address);
96 
97     /* Erase a multi-sector block of the chip. Block size is specified in the 'block_erase_size' field.
98        sector_address is an offset in bytes.
99 
100        Caller has verified that this block should be non-write-protected.
101      */
102     esp_err_t (*erase_block)(esp_flash_t *chip, uint32_t block_address);
103 
104     uint32_t sector_size; /* Sector is minimum erase size */
105     uint32_t block_erase_size; /* Optimal (fastest) block size for multi-sector erases on this chip */
106 
107     /* Read the write protect status of the entire chip. */
108     esp_err_t (*get_chip_write_protect)(esp_flash_t *chip, bool *out_write_protected);
109 
110     /* Set the write protect status of the entire chip. */
111     esp_err_t (*set_chip_write_protect)(esp_flash_t *chip, bool chip_write_protect);
112 
113     /* Number of individually write protectable regions on this chip. Range 0-63. */
114     uint8_t num_protectable_regions;
115     /* Pointer to an array describing each protectable region. Should have num_protectable_regions elements. */
116     const esp_flash_region_t *protectable_regions;
117     /* Get a bitmask describing all protectable regions on the chip. Each bit represents one entry in the
118        protectable_regions array, ie bit (1<<N) is set then the region at array entry N is write protected. */
119     esp_err_t (*get_protected_regions)(esp_flash_t *chip, uint64_t *regions);
120 
121     /* Set protectable regions on the chip. Each bit represents on entry in the protectable regions array. */
122     esp_err_t (*set_protected_regions)(esp_flash_t *chip, uint64_t regions);
123 
124     /* Read data from the chip.
125      *
126      * 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.
127      */
128     esp_err_t (*read)(esp_flash_t *chip, void *buffer, uint32_t address, uint32_t length);
129 
130     /* Write any amount of data to the chip.
131      */
132     esp_err_t (*write)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length);
133 
134 
135     /* Use the page program command to write data to the chip.
136      *
137      * This function is expected to be called by chip->drv->write (if the
138      * chip->drv->write implementation doesn't call it then it can be left as NULL.)
139      *
140      * - The length argument supplied to this function is at most 'page_size' bytes.
141      *
142      * - The region between 'address' and 'address + length' will not cross a page_size aligned boundary (the write
143      *   implementation is expected to split such a write into two before calling page_program.)
144      */
145     esp_err_t (*program_page)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length);
146 
147     /* Page size as written by the page_program function. Usually 256 bytes. */
148     uint32_t page_size;
149 
150     /* Perform an encrypted write to the chip, using internal flash encryption hardware. */
151     esp_err_t (*write_encrypted)(esp_flash_t *chip, const void *buffer, uint32_t address, uint32_t length);
152 
153 
154     /* 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.
155 
156        timeout_ms should be a timeout (in milliseconds) before the function returns ESP_ERR_TIMEOUT. This is useful to avoid hanging
157        if the chip is otherwise unresponsive (ie returns all 0xFF or similar.)
158     */
159     esp_err_t (*wait_idle)(esp_flash_t *chip, uint32_t timeout_us);
160 
161     /* Configure both the SPI host and the chip for the read mode specified in chip->read_mode.
162      *
163      * This function is called by the higher-level API before the 'read' function is called.
164      *
165      * Can return ESP_ERR_FLASH_UNSUPPORTED_HOST or ESP_ERR_FLASH_UNSUPPORTED_CHIP if the specified mode is unsupported.
166      */
167     esp_err_t (*set_io_mode)(esp_flash_t *chip);
168 
169     /*
170      * Get whether the Quad Enable (QE) is set. (*out_io_mode)=SPI_FLASH_QOUT if
171      * enabled, otherwise disabled
172      */
173     esp_err_t (*get_io_mode)(esp_flash_t *chip, esp_flash_io_mode_t* out_io_mode);
174 
175     /*
176      * Read the chip ID. Called when chip driver is set, but we want to know the exact chip id (to
177      * get the size, etc.).
178      */
179     esp_err_t (*read_id)(esp_flash_t *chip, uint32_t* out_chip_id);
180 
181     /*
182      * Read the requested register (status, etc.).
183      */
184     esp_err_t (*read_reg)(esp_flash_t *chip, spi_flash_register_t reg_id, uint32_t* out_reg);
185 
186     /** Yield to other tasks. Called during erase operations. */
187     esp_err_t (*yield)(esp_flash_t *chip, uint32_t wip);
188 
189     /** Setup flash suspend configuration. */
190     esp_err_t (*sus_setup)(esp_flash_t *chip);
191 };
192 
193 /* Pointer to an array of pointers to all known drivers for flash chips. This array is used
194    by esp_flash_init() to detect the flash chip driver, if none is supplied by the caller.
195 
196    Array is terminated with a NULL pointer.
197 
198    This pointer can be overwritten with a pointer to a new array, to update the list of known flash chips.
199  */
200 extern const spi_flash_chip_t **esp_flash_registered_chips;
201