44
44
#define CMD_RD_DEVID (0x9f)
45
45
#define CMD_CHIP_ERASE (0xc7)
46
46
#define CMD_C4READ (0xeb)
47
+ // 32 bit addressing commands
48
+ #define CMD_WRITE_32 (0x12)
49
+ #define CMD_READ_32 (0x13)
50
+ #define CMD_SEC_ERASE_32 (0x21)
51
+ #define CMD_C4READ_32 (0xec)
47
52
48
53
#define WAIT_SR_TIMEOUT (1000000)
49
54
@@ -76,18 +81,26 @@ STATIC void mp_spiflash_write_cmd_data(mp_spiflash_t *self, uint8_t cmd, size_t
76
81
}
77
82
}
78
83
79
- STATIC void mp_spiflash_write_cmd_addr_data (mp_spiflash_t * self , uint8_t cmd , uint32_t addr , size_t len , const uint8_t * src ) {
84
+ STATIC void mp_spiflash_transfer_cmd_addr_data (mp_spiflash_t * self , uint8_t cmd , uint32_t addr , size_t len , const uint8_t * src , uint8_t * dest ) {
80
85
const mp_spiflash_config_t * c = self -> config ;
81
86
if (c -> bus_kind == MP_SPIFLASH_BUS_SPI ) {
82
- uint8_t buf [4 ] = {cmd , addr >> 16 , addr >> 8 , addr };
87
+ uint8_t buf [5 ] = {cmd , 0 };
88
+ uint8_t buff_len = 1 + mp_spi_set_addr_buff (& buf [1 ], addr );
83
89
mp_hal_pin_write (c -> bus .u_spi .cs , 0 );
84
- c -> bus .u_spi .proto -> transfer (c -> bus .u_spi .data , 4 , buf , NULL );
85
- if (len ) {
90
+ c -> bus .u_spi .proto -> transfer (c -> bus .u_spi .data , buff_len , buf , NULL );
91
+ if (len && ( src != NULL ) ) {
86
92
c -> bus .u_spi .proto -> transfer (c -> bus .u_spi .data , len , src , NULL );
93
+ } else if (len && (dest != NULL )) {
94
+ c -> bus .u_spi .proto -> transfer (c -> bus .u_spi .data , len , dest , dest );
87
95
}
96
+
88
97
mp_hal_pin_write (c -> bus .u_spi .cs , 1 );
89
98
} else {
90
- c -> bus .u_qspi .proto -> write_cmd_addr_data (c -> bus .u_qspi .data , cmd , addr , len , src );
99
+ if (dest != NULL ) {
100
+ c -> bus .u_qspi .proto -> read_cmd_qaddr_qdata (c -> bus .u_qspi .data , cmd , addr , len , dest );
101
+ } else {
102
+ c -> bus .u_qspi .proto -> write_cmd_addr_data (c -> bus .u_qspi .data , cmd , addr , len , src );
103
+ }
91
104
}
92
105
}
93
106
@@ -108,24 +121,16 @@ STATIC uint32_t mp_spiflash_read_cmd(mp_spiflash_t *self, uint8_t cmd, size_t le
108
121
STATIC void mp_spiflash_read_data (mp_spiflash_t * self , uint32_t addr , size_t len , uint8_t * dest ) {
109
122
const mp_spiflash_config_t * c = self -> config ;
110
123
if (c -> bus_kind == MP_SPIFLASH_BUS_SPI ) {
111
- uint8_t buf [4 ] = {CMD_READ , addr >> 16 , addr >> 8 , addr };
112
- mp_hal_pin_write (c -> bus .u_spi .cs , 0 );
113
- c -> bus .u_spi .proto -> transfer (c -> bus .u_spi .data , 4 , buf , NULL );
114
- c -> bus .u_spi .proto -> transfer (c -> bus .u_spi .data , len , dest , dest );
115
- mp_hal_pin_write (c -> bus .u_spi .cs , 1 );
124
+ mp_spiflash_transfer_cmd_addr_data (self , MP_SPI_ADDR_32B (addr )?CMD_READ_32 :CMD_READ , addr , len , NULL , dest );
116
125
} else {
117
- c -> bus . u_qspi . proto -> read_cmd_qaddr_qdata ( c -> bus . u_qspi . data , CMD_C4READ , addr , len , dest );
126
+ mp_spiflash_transfer_cmd_addr_data ( self , MP_SPI_ADDR_32B ( addr )? CMD_C4READ_32 : CMD_C4READ , addr , len , NULL , dest );
118
127
}
119
128
}
120
129
121
130
STATIC void mp_spiflash_write_cmd (mp_spiflash_t * self , uint8_t cmd ) {
122
131
mp_spiflash_write_cmd_data (self , cmd , 0 , 0 );
123
132
}
124
133
125
- STATIC void mp_spiflash_write_cmd_addr (mp_spiflash_t * self , uint8_t cmd , uint32_t addr ) {
126
- mp_spiflash_write_cmd_addr_data (self , cmd , addr , 0 , NULL );
127
- }
128
-
129
134
STATIC int mp_spiflash_wait_sr (mp_spiflash_t * self , uint8_t mask , uint8_t val , uint32_t timeout ) {
130
135
uint8_t sr ;
131
136
do {
@@ -210,7 +215,7 @@ STATIC int mp_spiflash_erase_block_internal(mp_spiflash_t *self, uint32_t addr)
210
215
}
211
216
212
217
// erase the sector
213
- mp_spiflash_write_cmd_addr (self , CMD_SEC_ERASE , addr );
218
+ mp_spiflash_transfer_cmd_addr_data (self , MP_SPI_ADDR_32B ( addr )? CMD_SEC_ERASE_32 : CMD_SEC_ERASE , addr , 0 , NULL , NULL );
214
219
215
220
// wait WIP=0
216
221
return mp_spiflash_wait_wip0 (self );
@@ -227,7 +232,7 @@ STATIC int mp_spiflash_write_page(mp_spiflash_t *self, uint32_t addr, size_t len
227
232
}
228
233
229
234
// write the page
230
- mp_spiflash_write_cmd_addr_data (self , CMD_WRITE , addr , len , src );
235
+ mp_spiflash_transfer_cmd_addr_data (self , MP_SPI_ADDR_32B ( addr )? CMD_WRITE_32 : CMD_WRITE , addr , len , src , NULL );
231
236
232
237
// wait WIP=0
233
238
return mp_spiflash_wait_wip0 (self );
0 commit comments