25#ifndef HAL_FLASH_DEVICE_H
26#define HAL_FLASH_DEVICE_H
36#define SNOR_DEVICE_SUPPORTS_XIP TRUE
43#define W25Q_SUPPORTED_MANUFACTURE_IDS {0xEF}
44#define W25Q_SUPPORTED_MEMORY_TYPE_IDS {0x40, 0x60}
51#define W25Q_CMD_RESET_ENABLE 0x66
52#define W25Q_CMD_RESET 0x99
53#define W25Q_CMD_READ_JEDEC_ID 0x9F
54#define W25Q_CMD_READ_SFDP_REGISTER 0x5A
55#define W25Q_CMD_READ 0x03
56#define W25Q_CMD_FAST_READ 0x0B
57#define W25Q_CMD_WRITE_ENABLE 0x06
58#define W25Q_CMD_WRITE_DISABLE 0x04
59#define W25Q_CMD_READ_STATUS_REGISTER 0x05
60#define W25Q_CMD_WRITE_STATUS_REGISTER 0x01
61#define W25Q_CMD_PAGE_PROGRAM 0x02
62#define W25Q_CMD_SECTOR_ERASE 0x20
63#define W25Q_CMD_32K_BLOCK_ERASE 0x53
64#define W25Q_CMD_64K_BLOCK_ERASE 0xD8
65#define W25Q_CMD_BULK_ERASE 0xC7
66#define W25Q_CMD_PROGRAM_ERASE_RESUME 0x7A
67#define W25Q_CMD_PROGRAM_ERASE_SUSPEND 0x75
68#define W25Q_CMD_READ_UID_ARRAY 0x4B
69#define W25Q_CMD_PROGRAM_SECURITY_REGS 0x42
76#define W25Q_FLAGS_BUSY 0x01U
83#define W25Q_BUS_MODE_WSPI1L 1U
84#define W25Q_BUS_MODE_WSPI2L 2U
85#define W25Q_BUS_MODE_WSPI4L 4U
100#if !defined(W25Q_SWITCH_WIDTH) || defined(__DOXYGEN__)
101#define W25Q_SWITCH_WIDTH TRUE
112#if !defined(W25Q_BUS_MODE) || defined(__DOXYGEN__)
113#define W25Q_BUS_MODE W25Q_BUS_MODE_WSPI4L
122#if !defined(W25Q_NICE_WAITING) || defined(__DOXYGEN__)
123#define W25Q_NICE_WAITING TRUE
129#if !defined(W25Q_USE_SUB_SECTORS) || defined(__DOXYGEN__)
130#define W25Q_USE_SUB_SECTORS TRUE
140#if !defined(W25Q_COMPARE_BUFFER_SIZE) || defined(__DOXYGEN__)
141#define W25Q_COMPARE_BUFFER_SIZE 32
149#if !defined(W25Q_READ_DUMMY_CYCLES) || defined(__DOXYGEN__)
150#define W25Q_READ_DUMMY_CYCLES 1
157#if (W25Q_COMPARE_BUFFER_SIZE & (W25Q_COMPARE_BUFFER_SIZE - 1)) != 0
158#error "invalid W25Q_COMPARE_BUFFER_SIZE value"
161#if (W25Q_READ_DUMMY_CYCLES < 1) || (W25Q_READ_DUMMY_CYCLES > 15)
162#error "invalid W25Q_READ_DUMMY_CYCLES value (1..15)"
165#if (W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI4L) || defined(__DOXYGEN__)
169#define SNOR_WSPI_CFG_CMD (WSPI_CFG_CMD_MODE_FOUR_LINES | \
170 WSPI_CFG_ADDR_MODE_NONE | \
171 WSPI_CFG_ALT_MODE_NONE | \
172 WSPI_CFG_DATA_MODE_NONE | \
173 WSPI_CFG_CMD_SIZE_8 | \
174 WSPI_CFG_ADDR_SIZE_24)
179#define SNOR_WSPI_CFG_CMD_ADDR (WSPI_CFG_CMD_MODE_FOUR_LINES | \
180 WSPI_CFG_ADDR_MODE_FOUR_LINES | \
181 WSPI_CFG_ALT_MODE_NONE | \
182 WSPI_CFG_DATA_MODE_NONE | \
183 WSPI_CFG_CMD_SIZE_8 | \
184 WSPI_CFG_ADDR_SIZE_24)
189#define SNOR_WSPI_CFG_CMD_DATA (WSPI_CFG_CMD_MODE_FOUR_LINES | \
190 WSPI_CFG_ADDR_MODE_NONE | \
191 WSPI_CFG_ALT_MODE_NONE | \
192 WSPI_CFG_DATA_MODE_FOUR_LINES | \
193 WSPI_CFG_CMD_SIZE_8 | \
194 WSPI_CFG_ADDR_SIZE_24)
199#define SNOR_WSPI_CFG_CMD_ADDR_DATA (WSPI_CFG_CMD_MODE_FOUR_LINES | \
200 WSPI_CFG_ADDR_MODE_FOUR_LINES | \
201 WSPI_CFG_ALT_MODE_NONE | \
202 WSPI_CFG_DATA_MODE_FOUR_LINES | \
203 WSPI_CFG_CMD_SIZE_8 | \
204 WSPI_CFG_ADDR_SIZE_24)
206#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI2L
207#define SNOR_WSPI_CFG_CMD (WSPI_CFG_CMD_MODE_TWO_LINES | \
208 WSPI_CFG_ADDR_MODE_NONE | \
209 WSPI_CFG_ALT_MODE_NONE | \
210 WSPI_CFG_DATA_MODE_NONE | \
211 WSPI_CFG_CMD_SIZE_8 | \
212 WSPI_CFG_ADDR_SIZE_24)
214#define SNOR_WSPI_CFG_CMD_ADDR (WSPI_CFG_CMD_MODE_TWO_LINES | \
215 WSPI_CFG_ADDR_MODE_TWO_LINES | \
216 WSPI_CFG_ALT_MODE_NONE | \
217 WSPI_CFG_DATA_MODE_NONE | \
218 WSPI_CFG_CMD_SIZE_8 | \
219 WSPI_CFG_ADDR_SIZE_24)
221#define SNOR_WSPI_CFG_CMD_DATA (WSPI_CFG_CMD_MODE_TWO_LINES | \
222 WSPI_CFG_ADDR_MODE_NONE | \
223 WSPI_CFG_ALT_MODE_NONE | \
224 WSPI_CFG_DATA_MODE_TWO_LINES | \
225 WSPI_CFG_CMD_SIZE_8 | \
226 WSPI_CFG_ADDR_SIZE_24)
228#define SNOR_WSPI_CFG_CMD_ADDR_DATA (WSPI_CFG_CMD_MODE_ONE_LINE | \
229 WSPI_CFG_ADDR_MODE_ONE_LINE | \
230 WSPI_CFG_ALT_MODE_NONE | \
231 WSPI_CFG_DATA_MODE_ONE_LINE | \
232 WSPI_CFG_CMD_SIZE_8 | \
233 WSPI_CFG_ADDR_SIZE_24)
235#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI1L
236#define SNOR_WSPI_CFG_CMD (WSPI_CFG_CMD_MODE_ONE_LINE | \
237 WSPI_CFG_ADDR_MODE_NONE | \
238 WSPI_CFG_ALT_MODE_NONE | \
239 WSPI_CFG_DATA_MODE_NONE | \
240 WSPI_CFG_CMD_SIZE_8 | \
241 WSPI_CFG_ADDR_SIZE_24)
243#define SNOR_WSPI_CFG_CMD_ADDR (WSPI_CFG_CMD_MODE_ONE_LINE | \
244 WSPI_CFG_ADDR_MODE_ONE_LINE | \
245 WSPI_CFG_ALT_MODE_NONE | \
246 WSPI_CFG_DATA_MODE_NONE | \
247 WSPI_CFG_CMD_SIZE_8 | \
248 WSPI_CFG_ADDR_SIZE_24)
250#define SNOR_WSPI_CFG_CMD_DATA (WSPI_CFG_CMD_MODE_ONE_LINE | \
251 WSPI_CFG_ADDR_MODE_NONE | \
252 WSPI_CFG_ALT_MODE_NONE | \
253 WSPI_CFG_DATA_MODE_ONE_LINE | \
254 WSPI_CFG_CMD_SIZE_8 | \
255 WSPI_CFG_ADDR_SIZE_24)
257#define SNOR_WSPI_CFG_CMD_ADDR_DATA (WSPI_CFG_CMD_MODE_ONE_LINE | \
258 WSPI_CFG_ADDR_MODE_ONE_LINE | \
259 WSPI_CFG_ALT_MODE_NONE | \
260 WSPI_CFG_DATA_MODE_ONE_LINE | \
261 WSPI_CFG_CMD_SIZE_8 | \
262 WSPI_CFG_ADDR_SIZE_24)
265#error "invalid W25Q_BUS_MODE setting"
280#if !defined(__DOXYGEN__)
284#if (SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI) && (WSPI_SUPPORTS_MEMMAP == TRUE)
293 size_t n, uint8_t *rp);
295 size_t n,
const uint8_t *pp);
298 flash_sector_t sector);
300 flash_sector_t sector);
303 size_t n, uint8_t *rp);
304#if (SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI) && \
305 (SNOR_DEVICE_SUPPORTS_XIP == TRUE)
void snor_activate_xip(SNORDriver *devp)
flash_error_t snor_device_verify_erase(SNORDriver *devp, flash_sector_t sector)
flash_error_t snor_device_query_erase(SNORDriver *devp, uint32_t *msec)
flash_error_t snor_device_read_sfdp(SNORDriver *devp, flash_offset_t offset, size_t n, uint8_t *rp)
void snor_reset_xip(SNORDriver *devp)
flash_error_t snor_device_start_erase_sector(SNORDriver *devp, flash_sector_t sector)
const wspi_command_t snor_memmap_read
Fast read command for memory mapped mode.
flash_error_t snor_device_read(SNORDriver *devp, flash_offset_t offset, size_t n, uint8_t *rp)
flash_error_t snor_device_program(SNORDriver *devp, flash_offset_t offset, size_t n, const uint8_t *pp)
flash_descriptor_t snor_descriptor
Flash descriptor.
void snor_device_init(SNORDriver *devp)
flash_error_t snor_device_start_erase_all(SNORDriver *devp)