1 /* 2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 /*******************************************************************************************************************//** 8 * @ingroup RENESAS_STORAGE_INTERFACES 9 * @defgroup SPI_FLASH_API SPI Flash Interface 10 * @brief Interface for accessing external SPI flash devices. 11 * 12 * @section SPI_FLASH_API_SUMMARY Summary 13 * The SPI flash API provides an interface that configures, writes, and erases sectors in SPI flash devices. 14 * @{ 15 **********************************************************************************************************************/ 16 17 #ifndef R_SPI_FLASH_API_H 18 #define R_SPI_FLASH_API_H 19 20 /*********************************************************************************************************************** 21 * Includes 22 **********************************************************************************************************************/ 23 24 /* Register definitions, common services and error codes. */ 25 #include "bsp_api.h" 26 27 /* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ 28 FSP_HEADER 29 30 /********************************************************************************************************************** 31 * Macro definitions 32 **********************************************************************************************************************/ 33 34 #define SPI_FLASH_ERASE_SIZE_CHIP_ERASE (UINT32_MAX) 35 36 /********************************************************************************************************************** 37 * Typedef definitions 38 **********************************************************************************************************************/ 39 40 /** Read mode. */ 41 typedef enum e_spi_flash_read_mode 42 { 43 SPI_FLASH_READ_MODE_STANDARD = 0, ///< Standard Read Mode (no dummy cycles) 44 SPI_FLASH_READ_MODE_FAST_READ = 1, ///< Fast Read Mode (dummy cycles between address and data) 45 SPI_FLASH_READ_MODE_FAST_READ_DUAL_OUTPUT = 2, ///< Fast Read Dual Output Mode (data on 2 lines) 46 SPI_FLASH_READ_MODE_FAST_READ_DUAL_IO = 3, ///< Fast Read Dual I/O Mode (address and data on 2 lines) 47 SPI_FLASH_READ_MODE_FAST_READ_QUAD_OUTPUT = 4, ///< Fast Read Quad Output Mode (data on 4 lines) 48 SPI_FLASH_READ_MODE_FAST_READ_QUAD_IO = 5, ///< Fast Read Quad I/O Mode (address and data on 4 lines) 49 } spi_flash_read_mode_t; 50 51 /** SPI protocol. */ 52 typedef enum e_spi_flash_protocol 53 { 54 /** Extended SPI mode (commands on 1 line) */ 55 SPI_FLASH_PROTOCOL_EXTENDED_SPI = 0x000, 56 57 /** QPI mode (commands on 4 lines). Note that the application must ensure the device is in QPI mode. */ 58 SPI_FLASH_PROTOCOL_QPI = 0x002, 59 60 /** SOPI mode (command and data on 8 lines). Note that the application must ensure the device is in SOPI mode. */ 61 SPI_FLASH_PROTOCOL_SOPI = 0x003, 62 63 /** DOPI mode (command and data on 8 lines, dual data rate). Note that the application must ensure the device is in DOPI mode. */ 64 SPI_FLASH_PROTOCOL_DOPI = 0x004, 65 66 /** 1S-1S-1S protocol mode */ 67 SPI_FLASH_PROTOCOL_1S_1S_1S = 0x000, 68 69 /** 4S-4D-4D protocol mode */ 70 SPI_FLASH_PROTOCOL_4S_4D_4D = 0x3B2, 71 72 /** 8D-8D-8D protocol mode */ 73 SPI_FLASH_PROTOCOL_8D_8D_8D = 0x3FF, 74 75 /** 1S-2S-2S protocol mode */ 76 SPI_FLASH_PROTOCOL_1S_2S_2S = 0x048, 77 78 /** 2S-2S-2S protocol mode */ 79 SPI_FLASH_PROTOCOL_2S_2S_2S = 0x049, 80 81 /** 1S-4S-4S protocol mode */ 82 SPI_FLASH_PROTOCOL_1S_4S_4S = 0x090, 83 84 /** 4S-4S-4S protocol mode */ 85 SPI_FLASH_PROTOCOL_4S_4S_4S = 0x092 86 } spi_flash_protocol_t; 87 88 /** Number of bytes in the address. */ 89 typedef enum e_spi_flash_address_bytes 90 { 91 SPI_FLASH_ADDRESS_BYTES_3 = 2, ///< 3 address bytes 92 93 /** 4 address bytes with standard commands. If this option is selected, the application must issue the EN4B 94 * command using @ref spi_flash_api_t::directWrite() if required by the device. */ 95 SPI_FLASH_ADDRESS_BYTES_4 = 3, 96 97 /** 4 address bytes using standard 4-byte command set. */ 98 SPI_FLASH_ADDRESS_BYTES_4_4BYTE_READ_CODE = 0x13, 99 } spi_flash_address_bytes_t; 100 101 /** Number of data lines used. */ 102 typedef enum e_spi_flash_data_lines 103 { 104 SPI_FLASH_DATA_LINES_1 = 0, ///< 1 data line 105 SPI_FLASH_DATA_LINES_2 = 1, ///< 2 data lines 106 SPI_FLASH_DATA_LINES_4 = 2, ///< 4 data lines 107 } spi_flash_data_lines_t; 108 109 /** Number of dummy cycles for fast read operations. */ 110 typedef enum e_spi_flash_dummy_clocks 111 { 112 SPI_FLASH_DUMMY_CLOCKS_0 = 0, ///< 0 dummy clocks 113 SPI_FLASH_DUMMY_CLOCKS_1, ///< 1 dummy clocks 114 SPI_FLASH_DUMMY_CLOCKS_2, ///< 2 dummy clocks 115 SPI_FLASH_DUMMY_CLOCKS_3, ///< 3 dummy clocks 116 SPI_FLASH_DUMMY_CLOCKS_4, ///< 4 dummy clocks 117 SPI_FLASH_DUMMY_CLOCKS_5, ///< 5 dummy clocks 118 SPI_FLASH_DUMMY_CLOCKS_6, ///< 6 dummy clocks 119 SPI_FLASH_DUMMY_CLOCKS_7, ///< 7 dummy clocks 120 SPI_FLASH_DUMMY_CLOCKS_8, ///< 8 dummy clocks 121 SPI_FLASH_DUMMY_CLOCKS_9, ///< 9 dummy clocks 122 SPI_FLASH_DUMMY_CLOCKS_10, ///< 10 dummy clocks 123 SPI_FLASH_DUMMY_CLOCKS_11, ///< 11 dummy clocks 124 SPI_FLASH_DUMMY_CLOCKS_12, ///< 12 dummy clocks 125 SPI_FLASH_DUMMY_CLOCKS_13, ///< 13 dummy clocks 126 SPI_FLASH_DUMMY_CLOCKS_14, ///< 14 dummy clocks 127 SPI_FLASH_DUMMY_CLOCKS_15, ///< 15 dummy clocks 128 SPI_FLASH_DUMMY_CLOCKS_16, ///< 16 dummy clocks 129 SPI_FLASH_DUMMY_CLOCKS_17, ///< 17 dummy clocks 130 SPI_FLASH_DUMMY_CLOCKS_18, ///< 18 dummy clocks 131 SPI_FLASH_DUMMY_CLOCKS_19, ///< 19 dummy clocks 132 SPI_FLASH_DUMMY_CLOCKS_20, ///< 20 dummy clocks 133 SPI_FLASH_DUMMY_CLOCKS_21, ///< 21 dummy clocks 134 SPI_FLASH_DUMMY_CLOCKS_22, ///< 22 dummy clocks 135 SPI_FLASH_DUMMY_CLOCKS_23, ///< 23 dummy clocks 136 SPI_FLASH_DUMMY_CLOCKS_24, ///< 24 dummy clocks 137 SPI_FLASH_DUMMY_CLOCKS_25, ///< 25 dummy clocks 138 SPI_FLASH_DUMMY_CLOCKS_26, ///< 26 dummy clocks 139 SPI_FLASH_DUMMY_CLOCKS_27, ///< 27 dummy clocks 140 SPI_FLASH_DUMMY_CLOCKS_28, ///< 28 dummy clocks 141 SPI_FLASH_DUMMY_CLOCKS_29, ///< 29 dummy clocks 142 SPI_FLASH_DUMMY_CLOCKS_30, ///< 30 dummy clocks 143 SPI_FLASH_DUMMY_CLOCKS_31, ///< 31 dummy clocks 144 SPI_FLASH_DUMMY_CLOCKS_DEFAULT = 0xFF, 145 } spi_flash_dummy_clocks_t; 146 147 /** Direct Read and Write direction */ 148 typedef enum e_spi_flash_direct_transfer_dir_option 149 { 150 SPI_FLASH_DIRECT_TRANSFER_DIR_READ = 0x0, 151 SPI_FLASH_DIRECT_TRANSFER_DIR_WRITE = 0x1 152 } spi_flash_direct_transfer_dir_t; 153 154 /** Structure to define an erase command and associated erase size. */ 155 typedef struct st_spi_flash_erase_command 156 { 157 uint16_t command; ///< Erase command 158 uint32_t size; ///< Size of erase for associated command, set to SPI_FLASH_ERASE_SIZE_CHIP_ERASE for chip erase 159 } spi_flash_erase_command_t; 160 161 /** Structure to define a direct transfer. */ 162 typedef struct st_spi_flash_direct_transfer 163 { 164 union 165 { 166 uint64_t data_u64; ///< Data (64-bit) 167 uint32_t data; ///< Data 168 }; 169 uint32_t address; ///< Starting address 170 uint16_t command; ///< Transfer command 171 uint8_t dummy_cycles; ///< Number of dummy cycles 172 uint8_t command_length; ///< Command length 173 uint8_t address_length; ///< Address length 174 uint8_t data_length; ///< Data length 175 } spi_flash_direct_transfer_t; 176 177 /** User configuration structure used by the open function */ 178 typedef struct st_spi_flash_cfg 179 { 180 spi_flash_protocol_t spi_protocol; ///< Initial SPI protocol. SPI protocol can be changed in @ref spi_flash_api_t::spiProtocolSet. 181 spi_flash_read_mode_t read_mode; ///< Read mode 182 spi_flash_address_bytes_t address_bytes; ///< Number of bytes used to represent the address 183 spi_flash_dummy_clocks_t dummy_clocks; ///< Number of dummy clocks to use for fast read operations 184 185 /** Number of lines used to send address for page program command. This should either be 1 or match the number of lines used in 186 * the selected read mode. */ 187 spi_flash_data_lines_t page_program_address_lines; 188 uint8_t write_status_bit; ///< Which bit determines write status 189 uint8_t write_enable_bit; ///< Which bit determines write status 190 uint32_t page_size_bytes; ///< Page size in bytes (maximum number of bytes for page program). Used to specify single continuous write size (bytes) in case of OSPI RAM. 191 uint8_t page_program_command; ///< Page program command 192 uint8_t write_enable_command; ///< Command to enable write or erase, typically 0x06 193 uint8_t status_command; ///< Command to read the write status 194 uint8_t read_command; ///< Read command - OSPI SPI mode only 195 uint8_t xip_enter_command; ///< Command to enter XIP mode 196 uint8_t xip_exit_command; ///< Command to exit XIP mode 197 uint8_t erase_command_list_length; ///< Length of erase command list 198 spi_flash_erase_command_t const * p_erase_command_list; ///< List of all erase commands and associated sizes 199 void const * p_extend; ///< Pointer to implementation specific extended configurations 200 } spi_flash_cfg_t; 201 202 /** SPI flash control block. Allocate an instance specific control block to pass into the SPI flash API calls. 203 */ 204 typedef void spi_flash_ctrl_t; 205 206 /** Status. */ 207 typedef struct st_spi_flash_status 208 { 209 /** Whether or not a write is in progress. This is determined by reading the @ref spi_flash_cfg_t::write_status_bit 210 * from the @ref spi_flash_cfg_t::status_command. */ 211 bool write_in_progress; 212 } spi_flash_status_t; 213 214 /** SPI flash implementations follow this API. */ 215 typedef struct st_spi_flash_api 216 { 217 /** Open the SPI flash driver module. 218 * 219 * @param[in] p_ctrl Pointer to a driver handle 220 * @param[in] p_cfg Pointer to a configuration structure 221 **/ 222 fsp_err_t (* open)(spi_flash_ctrl_t * const p_ctrl, spi_flash_cfg_t const * const p_cfg); 223 224 /** Write raw data to the SPI flash. 225 * 226 * @param[in] p_ctrl Pointer to a driver handle 227 * @param[in] p_src Pointer to raw data to write, must include any required command/address 228 * @param[in] bytes Number of bytes to write 229 * @param[in] read_after_write If true, the slave select remains asserted and the peripheral does not return 230 * to direct communications mode. If false, the slave select is deasserted and 231 * memory mapped access is possible after this function returns if the device 232 * is not busy. 233 **/ 234 fsp_err_t (* directWrite)(spi_flash_ctrl_t * const p_ctrl, uint8_t const * const p_src, uint32_t const bytes, 235 bool const read_after_write); 236 237 /** Read raw data from the SPI flash. Must follow a call to @ref spi_flash_api_t::directWrite. 238 * 239 * @param[in] p_ctrl Pointer to a driver handle 240 * @param[out] p_dest Pointer to read raw data into 241 * @param[in] bytes Number of bytes to read 242 **/ 243 fsp_err_t (* directRead)(spi_flash_ctrl_t * const p_ctrl, uint8_t * const p_dest, uint32_t const bytes); 244 245 /** Direct Read/Write raw data to the SPI flash. 246 * 247 * @param[in] p_ctrl Pointer to a driver handle 248 * @param[in] p_data Pointer to command, address and data values and lengths 249 * @param[in] direction Direct Read/Write 250 **/ 251 fsp_err_t (* directTransfer)(spi_flash_ctrl_t * const p_ctrl, spi_flash_direct_transfer_t * const p_transfer, 252 spi_flash_direct_transfer_dir_t direction); 253 254 /** Change the SPI protocol in the driver. The application must change the SPI protocol on the device. 255 * 256 * @param[in] p_ctrl Pointer to a driver handle 257 * @param[in] spi_protocol Desired SPI protocol 258 **/ 259 fsp_err_t (* spiProtocolSet)(spi_flash_ctrl_t * const p_ctrl, spi_flash_protocol_t spi_protocol); 260 261 /** Program a page of data to the flash. 262 * 263 * @param[in] p_ctrl Pointer to a driver handle 264 * @param[in] p_src The memory address of the data to write to the flash device 265 * @param[in] p_dest The location in the flash device address space to write the data to 266 * @param[in] byte_count The number of bytes to write 267 **/ 268 fsp_err_t (* write)(spi_flash_ctrl_t * const p_ctrl, uint8_t const * const p_src, uint8_t * const p_dest, 269 uint32_t byte_count); 270 271 /** Erase a certain number of bytes of the flash. 272 * 273 * @param[in] p_ctrl Pointer to a driver handle 274 * @param[in] p_device_address The location in the flash device address space to start the erase from 275 * @param[in] byte_count The number of bytes to erase. Set to SPI_FLASH_ERASE_SIZE_CHIP_ERASE to erase entire 276 * chip. 277 **/ 278 fsp_err_t (* erase)(spi_flash_ctrl_t * const p_ctrl, uint8_t * const p_device_address, uint32_t byte_count); 279 280 /** Get the write or erase status of the flash. 281 * 282 * @param[in] p_ctrl Pointer to a driver handle 283 * @param[out] p_status Current status of the SPI flash device stored here. 284 **/ 285 fsp_err_t (* statusGet)(spi_flash_ctrl_t * const p_ctrl, spi_flash_status_t * const p_status); 286 287 /** Enter XIP mode. 288 * 289 * @param[in] p_ctrl Pointer to a driver handle 290 **/ 291 fsp_err_t (* xipEnter)(spi_flash_ctrl_t * const p_ctrl); 292 293 /** Exit XIP mode. 294 * 295 * @param[in] p_ctrl Pointer to a driver handle 296 **/ 297 fsp_err_t (* xipExit)(spi_flash_ctrl_t * const p_ctrl); 298 299 /** Select the bank to access. See implementation for details. 300 * 301 * @param[in] p_ctrl Pointer to a driver handle 302 * @param[in] bank The bank number 303 **/ 304 fsp_err_t (* bankSet)(spi_flash_ctrl_t * const p_ctrl, uint32_t bank); 305 306 /** AutoCalibrate the SPI flash driver module. Expected to be used when auto-calibrating OSPI RAM device. 307 * 308 * @param[in] p_ctrl Pointer to a driver handle 309 **/ 310 fsp_err_t (* autoCalibrate)(spi_flash_ctrl_t * const p_ctrl); 311 312 /** Close the SPI flash driver module. 313 * 314 * @param[in] p_ctrl Pointer to a driver handle 315 **/ 316 fsp_err_t (* close)(spi_flash_ctrl_t * const p_ctrl); 317 } spi_flash_api_t; 318 319 /** This structure encompasses everything that is needed to use an instance of this interface. */ 320 typedef struct st_spi_flash_instance 321 { 322 spi_flash_ctrl_t * p_ctrl; ///< Pointer to the control structure for this instance 323 spi_flash_cfg_t const * p_cfg; ///< Pointer to the configuration structure for this instance 324 spi_flash_api_t const * p_api; ///< Pointer to the API structure for this instance 325 } spi_flash_instance_t; 326 327 /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ 328 FSP_FOOTER 329 330 #endif 331 332 /*******************************************************************************************************************//** 333 * @} (end defgroup SPI_FLASH_API) 334 **********************************************************************************************************************/ 335