Skip to content

Commit 2c0240e

Browse files
committed
drivers/bus/qspi: Make num_dummy configurable for quad reads.
Signed-off-by: Damien George <[email protected]>
1 parent b078569 commit 2c0240e

File tree

7 files changed

+31
-15
lines changed

7 files changed

+31
-15
lines changed

drivers/bus/qspi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ typedef struct _mp_qspi_proto_t {
4545
int (*write_cmd_data)(void *self, uint8_t cmd, size_t len, uint32_t data);
4646
int (*write_cmd_addr_data)(void *self, uint8_t cmd, uint32_t addr, size_t len, const uint8_t *src);
4747
int (*read_cmd)(void *self, uint8_t cmd, size_t len, uint32_t *dest);
48-
int (*read_cmd_qaddr_qdata)(void *self, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest);
48+
int (*read_cmd_qaddr_qdata)(void *self, uint8_t cmd, uint32_t addr, uint8_t num_dummy, size_t len, uint8_t *dest);
4949
} mp_qspi_proto_t;
5050

5151
typedef struct _mp_soft_qspi_obj_t {

drivers/bus/softqspi.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,13 @@ static int mp_soft_qspi_read_cmd(void *self_in, uint8_t cmd, size_t len, uint32_
189189
return 0;
190190
}
191191

192-
static int mp_soft_qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
192+
static int mp_soft_qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, uint8_t num_dummy, size_t len, uint8_t *dest) {
193193
mp_soft_qspi_obj_t *self = (mp_soft_qspi_obj_t*)self_in;
194-
uint8_t cmd_buf[7] = {cmd};
194+
uint8_t cmd_buf[16] = {cmd};
195195
uint8_t addr_len = mp_spi_set_addr_buff(&cmd_buf[1], addr);
196196
CS_LOW(self);
197197
mp_soft_qspi_transfer(self, 1, cmd_buf, NULL);
198-
mp_soft_qspi_qwrite(self, addr_len + 3, &cmd_buf[1]); // 3/4 addr bytes, 1 extra byte (0), 2 dummy bytes (4 dummy cycles)
198+
mp_soft_qspi_qwrite(self, addr_len + 1 + num_dummy, &cmd_buf[1]); // 3/4 addr bytes, 1 extra byte (0), N dummy bytes (2*N dummy cycles)
199199
mp_soft_qspi_qread(self, len, dest);
200200
CS_HIGH(self);
201201
return 0;

drivers/memory/spiflash.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@
3535
#error "CHECK_DEVID no longer supported, use MICROPY_HW_SPIFLASH_DETECT_DEVICE instead"
3636
#endif
3737

38+
// The default number of dummy bytes for quad-read is 2. This can be changed by enabling
39+
// MICROPY_HW_SPIFLASH_CHIP_PARAMS and configuring the value in mp_spiflash_chip_params_t.
40+
#if MICROPY_HW_SPIFLASH_CHIP_PARAMS
41+
#define MICROPY_HW_SPIFLASH_QREAD_NUM_DUMMY(spiflash) (spiflash->chip_params->qread_num_dummy)
42+
#else
43+
#define MICROPY_HW_SPIFLASH_QREAD_NUM_DUMMY(spiflash) (2)
44+
#endif
45+
3846
#define QSPI_QE_MASK (0x02)
3947
#define USE_WR_DELAY (1)
4048

@@ -115,7 +123,8 @@ static int mp_spiflash_transfer_cmd_addr_data(mp_spiflash_t *self, uint8_t cmd,
115123
mp_hal_pin_write(c->bus.u_spi.cs, 1);
116124
} else {
117125
if (dest != NULL) {
118-
ret = c->bus.u_qspi.proto->read_cmd_qaddr_qdata(c->bus.u_qspi.data, cmd, addr, len, dest);
126+
uint8_t num_dummy = MICROPY_HW_SPIFLASH_QREAD_NUM_DUMMY(self);
127+
ret = c->bus.u_qspi.proto->read_cmd_qaddr_qdata(c->bus.u_qspi.data, cmd, addr, num_dummy, len, dest);
119128
} else {
120129
ret = c->bus.u_qspi.proto->write_cmd_addr_data(c->bus.u_qspi.data, cmd, addr, len, src);
121130
}
@@ -186,7 +195,8 @@ void mp_spiflash_init(mp_spiflash_t *self) {
186195
mp_hal_pin_output(self->config->bus.u_spi.cs);
187196
self->config->bus.u_spi.proto->ioctl(self->config->bus.u_spi.data, MP_SPI_IOCTL_INIT);
188197
} else {
189-
self->config->bus.u_qspi.proto->ioctl(self->config->bus.u_qspi.data, MP_QSPI_IOCTL_INIT, 0);
198+
uint8_t num_dummy = MICROPY_HW_SPIFLASH_QREAD_NUM_DUMMY(self);
199+
self->config->bus.u_qspi.proto->ioctl(self->config->bus.u_qspi.data, MP_QSPI_IOCTL_INIT, num_dummy);
190200
}
191201

192202
mp_spiflash_acquire_bus(self);

ports/stm32/boards/STM32F769DISC/board_init.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
// This configuration is needed for mboot to be able to write to the external QSPI flash
55

6+
#define QSPI_QREAD_NUM_DUMMY (2)
7+
68
#if MICROPY_HW_SPIFLASH_ENABLE_CACHE
79
static mp_spiflash_cache_t spi_bdev_cache;
810
#endif
@@ -21,6 +23,6 @@ spi_bdev_t spi_bdev;
2123
// This init function is needed to memory map the QSPI flash early in the boot process
2224

2325
void board_early_init(void) {
24-
qspi_init();
26+
qspi_init(QSPI_QREAD_NUM_DUMMY);
2527
qspi_memory_map();
2628
}

ports/stm32/octospi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ static int octospi_read_cmd(void *self_in, uint8_t cmd, size_t len, uint32_t *de
283283
return 0;
284284
}
285285

286-
static int octospi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
286+
static int octospi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, uint8_t num_dummy, size_t len, uint8_t *dest) {
287287
(void)self_in;
288288

289289
#if defined(MICROPY_HW_OSPIFLASH_IO1) && !defined(MICROPY_HW_OSPIFLASH_IO2) && !defined(MICROPY_HW_OSPIFLASH_IO4)
@@ -293,7 +293,7 @@ static int octospi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t add
293293
uint32_t adsize = MICROPY_HW_SPI_ADDR_IS_32BIT(addr) ? 3 : 2;
294294
uint32_t dmode = 2; // data on 2-lines
295295
uint32_t admode = 2; // address on 2-lines
296-
uint32_t dcyc = 4; // 4 dummy cycles
296+
uint32_t dcyc = 2 * num_dummy; // 2N dummy cycles
297297

298298
if (cmd == 0xeb || cmd == 0xec) {
299299
// Convert to 2-line command.

ports/stm32/qspi.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@
6262
#define QSPI_ADSIZE 2
6363
#endif
6464

65+
static uint8_t qspi_num_dummy;
66+
6567
static inline void qspi_mpu_disable_all(void) {
6668
// Configure MPU to disable access to entire QSPI region, to prevent CPU
6769
// speculative execution from accessing this region and modifying QSPI registers.
@@ -110,7 +112,9 @@ static inline void qspi_mpu_enable_mapped(void) {
110112
mpu_config_end(irq_state);
111113
}
112114

113-
void qspi_init(void) {
115+
void qspi_init(uint8_t num_dummy) {
116+
qspi_num_dummy = num_dummy;
117+
114118
qspi_mpu_disable_all();
115119

116120
// Configure pins
@@ -158,7 +162,7 @@ void qspi_memory_map(void) {
158162
| 0 << QUADSPI_CCR_SIOO_Pos // send instruction every transaction
159163
| 3 << QUADSPI_CCR_FMODE_Pos // memory-mapped mode
160164
| 3 << QUADSPI_CCR_DMODE_Pos // data on 4 lines
161-
| 4 << QUADSPI_CCR_DCYC_Pos // 4 dummy cycles
165+
| (2 * qspi_num_dummy) << QUADSPI_CCR_DCYC_Pos // 2N dummy cycles
162166
| 0 << QUADSPI_CCR_ABSIZE_Pos // 8-bit alternate byte
163167
| 3 << QUADSPI_CCR_ABMODE_Pos // alternate byte on 4 lines
164168
| QSPI_ADSIZE << QUADSPI_CCR_ADSIZE_Pos
@@ -193,7 +197,7 @@ static int qspi_ioctl(void *self_in, uint32_t cmd, uintptr_t arg) {
193197
(void)self_in;
194198
switch (cmd) {
195199
case MP_QSPI_IOCTL_INIT:
196-
qspi_init();
200+
qspi_init(arg);
197201
break;
198202
case MP_QSPI_IOCTL_BUS_ACQUIRE:
199203
// Disable memory-mapped region during bus access
@@ -369,7 +373,7 @@ static int qspi_read_cmd(void *self_in, uint8_t cmd, size_t len, uint32_t *dest)
369373
return 0;
370374
}
371375

372-
static int qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, size_t len, uint8_t *dest) {
376+
static int qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr, uint8_t num_dummy, size_t len, uint8_t *dest) {
373377
(void)self_in;
374378

375379
uint8_t adsize = MICROPY_HW_SPI_ADDR_IS_32BIT(addr) ? 3 : 2;
@@ -383,7 +387,7 @@ static int qspi_read_cmd_qaddr_qdata(void *self_in, uint8_t cmd, uint32_t addr,
383387
| 0 << QUADSPI_CCR_SIOO_Pos // send instruction every transaction
384388
| 1 << QUADSPI_CCR_FMODE_Pos // indirect read mode
385389
| 3 << QUADSPI_CCR_DMODE_Pos // data on 4 lines
386-
| 4 << QUADSPI_CCR_DCYC_Pos // 4 dummy cycles
390+
| (2 * num_dummy) << QUADSPI_CCR_DCYC_Pos // 2N dummy cycles
387391
| 0 << QUADSPI_CCR_ABSIZE_Pos // 8-bit alternate byte
388392
| 3 << QUADSPI_CCR_ABMODE_Pos // alternate byte on 4 lines
389393
| adsize << QUADSPI_CCR_ADSIZE_Pos // 32 or 24-bit address size

ports/stm32/qspi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
extern const mp_qspi_proto_t qspi_proto;
3535

36-
void qspi_init(void);
36+
void qspi_init(uint8_t num_dummy);
3737
void qspi_memory_map(void);
3838
void qspi_memory_map_exit(void);
3939
void qspi_memory_map_restart(void);

0 commit comments

Comments
 (0)