@@ -76,6 +76,21 @@ static struct nu_spi_var spi4_var = {
76
76
#endif
77
77
};
78
78
79
+ /* Change to QSPI version functions
80
+ *
81
+ * In most cases, we can control degraded QSPI H/W to standard through BSP SPI driver
82
+ * directly as if it is just SPI H/W. However, BSP SPI driver distinguishes among
83
+ * SPI H/W instances in below functions:
84
+ *
85
+ * SPI_Open
86
+ * SPI_Close
87
+ * SPI_SetBusClock
88
+ * SPI_GetBusClock
89
+ *
90
+ * In these cases, we must change to QSPI version instead for QSPI H/W.
91
+ */
92
+ static int spi_is_qspi (spi_t * obj );
93
+
79
94
/* Synchronous version of SPI_ENABLE()/SPI_DISABLE() macros
80
95
*
81
96
* The SPI peripheral clock is asynchronous with the system clock. In order to make sure the SPI
@@ -210,7 +225,11 @@ void spi_free(spi_t *obj)
210
225
}
211
226
#endif
212
227
213
- SPI_Close ((SPI_T * ) NU_MODBASE (obj -> spi .spi ));
228
+ if (spi_is_qspi (obj )) {
229
+ QSPI_Close ((QSPI_T * ) NU_MODBASE (obj -> spi .spi ));
230
+ } else {
231
+ SPI_Close ((SPI_T * ) NU_MODBASE (obj -> spi .spi ));
232
+ }
214
233
215
234
const struct nu_modinit_s * modinit = get_modinit (obj -> spi .spi , spi_modinit_tab );
216
235
MBED_ASSERT (modinit != NULL );
@@ -248,11 +267,19 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
248
267
249
268
SPI_DISABLE_SYNC (spi_base );
250
269
251
- SPI_Open (spi_base ,
252
- slave ? SPI_SLAVE : SPI_MASTER ,
253
- (mode == 0 ) ? SPI_MODE_0 : (mode == 1 ) ? SPI_MODE_1 : (mode == 2 ) ? SPI_MODE_2 : SPI_MODE_3 ,
254
- bits ,
255
- SPI_GetBusClock (spi_base ));
270
+ if (spi_is_qspi (obj )) {
271
+ QSPI_Open ((QSPI_T * ) spi_base ,
272
+ slave ? QSPI_SLAVE : QSPI_MASTER ,
273
+ (mode == 0 ) ? QSPI_MODE_0 : (mode == 1 ) ? QSPI_MODE_1 : (mode == 2 ) ? QSPI_MODE_2 : QSPI_MODE_3 ,
274
+ bits ,
275
+ QSPI_GetBusClock ((QSPI_T * )spi_base ));
276
+ } else {
277
+ SPI_Open (spi_base ,
278
+ slave ? SPI_SLAVE : SPI_MASTER ,
279
+ (mode == 0 ) ? SPI_MODE_0 : (mode == 1 ) ? SPI_MODE_1 : (mode == 2 ) ? SPI_MODE_2 : SPI_MODE_3 ,
280
+ bits ,
281
+ SPI_GetBusClock (spi_base ));
282
+ }
256
283
// NOTE: Hardcode to be MSB first.
257
284
SPI_SET_MSB_FIRST (spi_base );
258
285
@@ -281,7 +308,11 @@ void spi_frequency(spi_t *obj, int hz)
281
308
282
309
SPI_DISABLE_SYNC (spi_base );
283
310
284
- SPI_SetBusClock ((SPI_T * ) NU_MODBASE (obj -> spi .spi ), hz );
311
+ if (spi_is_qspi (obj )) {
312
+ QSPI_SetBusClock ((QSPI_T * ) NU_MODBASE (obj -> spi .spi ), hz );
313
+ } else {
314
+ SPI_SetBusClock ((SPI_T * ) NU_MODBASE (obj -> spi .spi ), hz );
315
+ }
285
316
}
286
317
287
318
@@ -617,6 +648,13 @@ uint8_t spi_active(spi_t *obj)
617
648
return vec ? 1 : 0 ;
618
649
}
619
650
651
+ static int spi_is_qspi (spi_t * obj )
652
+ {
653
+ SPI_T * spi_base = (SPI_T * ) NU_MODBASE (obj -> spi .spi );
654
+
655
+ return (spi_base == ((SPI_T * ) QSPI0 ));
656
+ }
657
+
620
658
static int spi_writeable (spi_t * obj )
621
659
{
622
660
// Receive FIFO must not be full to avoid receive FIFO overflow on next transmit/receive
0 commit comments