6262#define QSPI_ADSIZE 2
6363#endif
6464
65+ static uint8_t qspi_num_dummy ;
66+
6567static 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
0 commit comments