72 .cmd = W25Q_CMD_FAST_READ,
74 .dummy = W25Q_READ_DUMMY_CYCLES,
75 .cfg = WSPI_CFG_ADDR_SIZE_24 |
76#if W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI1L
77 WSPI_CFG_CMD_MODE_ONE_LINE |
78 WSPI_CFG_ADDR_MODE_ONE_LINE |
79 WSPI_CFG_DATA_MODE_ONE_LINE |
80#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI2L
81 WSPI_CFG_CMD_MODE_TWO_LINES |
82 WSPI_CFG_ADDR_MODE_TWO_LINES |
83 WSPI_CFG_DATA_MODE_TWO_LINES |
85 WSPI_CFG_CMD_MODE_FOUR_LINES |
86 WSPI_CFG_ADDR_MODE_FOUR_LINES |
87 WSPI_CFG_DATA_MODE_FOUR_LINES |
89 WSPI_CFG_ALT_MODE_FOUR_LINES |
103 .cmd = W25Q_CMD_READ_JEDEC_ID,
105#if W25Q_SWITCH_WIDTH == TRUE
106 WSPI_CFG_CMD_MODE_ONE_LINE |
107 WSPI_CFG_DATA_MODE_ONE_LINE,
109#if W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI1L
110 WSPI_CFG_CMD_MODE_ONE_LINE |
111 WSPI_CFG_DATA_MODE_ONE_LINE,
112#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI2L
113 WSPI_CFG_CMD_MODE_TWO_LINES |
114 WSPI_CFG_DATA_MODE_TWO_LINES,
115#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI4L
116 WSPI_CFG_CMD_MODE_FOUR_LINES |
117 WSPI_CFG_DATA_MODE_FOUR_LINES,
119 WSPI_CFG_CMD_MODE_EIGHT_LINES |
120 WSPI_CFG_DATA_MODE_EIGHT_LINES,
130 .cmd = W25Q_CMD_WRITE_ENHANCED_V_CONF_REGISTER,
132#if W25Q_SWITCH_WIDTH == TRUE
133 WSPI_CFG_CMD_MODE_ONE_LINE |
134 WSPI_CFG_DATA_MODE_ONE_LINE,
136#if W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI1L
137 WSPI_CFG_CMD_MODE_ONE_LINE |
138 WSPI_CFG_DATA_MODE_ONE_LINE,
139#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI2L
140 WSPI_CFG_CMD_MODE_TWO_LINES |
141 WSPI_CFG_DATA_MODE_TWO_LINES,
142#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI4L
143 WSPI_CFG_CMD_MODE_FOUR_LINES |
144 WSPI_CFG_DATA_MODE_FOUR_LINES,
146 WSPI_CFG_CMD_MODE_EIGHT_LINES |
147 WSPI_CFG_DATA_MODE_EIGHT_LINES,
157 .cmd = W25Q_CMD_WRITE_ENABLE,
159#if W25Q_SWITCH_WIDTH == TRUE
160 WSPI_CFG_CMD_MODE_ONE_LINE,
162#if W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI1L
163 WSPI_CFG_CMD_MODE_ONE_LINE,
164#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI2L
165 WSPI_CFG_CMD_MODE_TWO_LINES,
166#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI4L
167 WSPI_CFG_CMD_MODE_FOUR_LINES,
169 WSPI_CFG_CMD_MODE_EIGHT_LINES,
225 static const wspi_command_t cmd_reset_enable_1 = {
226 .cmd = W25Q_CMD_RESET_ENABLE,
227 .cfg = WSPI_CFG_CMD_MODE_ONE_LINE,
234 static const wspi_command_t cmd_reset_1 = {
235 .cmd = W25Q_CMD_RESET,
236 .cfg = WSPI_CFG_CMD_MODE_ONE_LINE,
246#if W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI4L
248 static const wspi_command_t cmd_reset_enable_4 = {
249 .cmd = W25Q_CMD_RESET_ENABLE,
250 .cfg = WSPI_CFG_CMD_MODE_FOUR_LINES,
257 static const wspi_command_t cmd_reset_4 = {
258 .cmd = W25Q_CMD_RESET,
259 .cfg = WSPI_CFG_CMD_MODE_FOUR_LINES,
265 wspiCommand(devp, &cmd_reset_enable_4);
266 wspiCommand(devp, &cmd_reset_memory_4);
269 static const wspi_command_t cmd_reset_enable_2 = {
270 .cmd = W25Q_CMD_RESET_ENABLE,
271 .cfg = WSPI_CFG_CMD_MODE_TWO_LINES,
278 static const wspi_command_t cmd_reset_memory_2 = {
279 .cmd = W25Q_CMD_RESET_MEMORY,
280 .cfg = WSPI_CFG_CMD_MODE_TWO_LINES,
286 wspiCommand(devp, &cmd_reset_enable_2);
287 wspiCommand(devp, &cmd_reset_2);
292 wspiCommand(devp, &cmd_reset_enable_1);
293 wspiCommand(devp, &cmd_reset_1);
341 size_t n, uint8_t *rp) {
343#if SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI
345 bus_cmd_addr_dummy_receive(devp, W25Q_CMD_FAST_READ,
346 offset, W25Q_READ_DUMMY_CYCLES, n, rp);
349 bus_cmd_addr_receive(devp, W25Q_CMD_READ,
353 return FLASH_NO_ERROR;
357 size_t n,
const uint8_t *pp) {
370 bus_cmd(devp, W25Q_CMD_WRITE_ENABLE);
373 bus_cmd_addr_send(devp, W25Q_CMD_PAGE_PROGRAM,
offset,
378 if (err != FLASH_NO_ERROR) {
389 return FLASH_NO_ERROR;
417 flash_sector_t sector) {
418 uint8_t cmpbuf[W25Q_COMPARE_BUFFER_SIZE];
423 offset = (flash_offset_t)(sector * SECTOR_SIZE);
426#if SNOR_BUS_DRIVER == SNOR_BUS_DRIVER_WSPI
427 bus_cmd_addr_dummy_receive(devp, W25Q_CMD_FAST_READ,
428 offset, W25Q_READ_DUMMY_CYCLES,
429 W25Q_COMPARE_BUFFER_SIZE, cmpbuf);
432 bus_cmd_addr_receive(devp, W25Q_CMD_READ,
433 offset, W25Q_COMPARE_BUFFER_SIZE, cmpbuf);
437 for (
size_t i = 0; i < W25Q_COMPARE_BUFFER_SIZE; i++) {
438 if (cmpbuf[i] != 0xFFU) {
440 devp->state = FLASH_READY;
442 return FLASH_ERROR_VERIFY;
446 offset += W25Q_COMPARE_BUFFER_SIZE;
447 n -= W25Q_COMPARE_BUFFER_SIZE;
450 return FLASH_NO_ERROR;
500 cmd.dummy = W25Q_READ_DUMMY_CYCLES;
501 cmd.cfg = WSPI_CFG_CMD_MODE_NONE |
502 WSPI_CFG_ADDR_SIZE_24 |
503#if W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI1L
504 WSPI_CFG_ADDR_MODE_ONE_LINE |
505 WSPI_CFG_DATA_MODE_ONE_LINE |
506#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI2L
507 WSPI_CFG_ADDR_MODE_TWO_LINES |
508 WSPI_CFG_DATA_MODE_TWO_LINES |
509#elif W25Q_BUS_MODE == W25Q_BUS_MODE_WSPI4L
510 WSPI_CFG_ADDR_MODE_FOUR_LINES |
511 WSPI_CFG_DATA_MODE_FOUR_LINES |
513 WSPI_CFG_ADDR_MODE_EIGHT_LINES |
514 WSPI_CFG_DATA_MODE_EIGHT_LINES |
516 WSPI_CFG_ALT_MODE_FOUR_LINES |
518 wspiReceive(devp, &cmd, 1, buf);
521 bus_cmd(devp, W25Q_CMD_WRITE_ENABLE);