Skip to content

Commit 20bb19e

Browse files
committed
Remove software limitation of mixing DMA and non-DMA SPI transactions.
1 parent 3f60df5 commit 20bb19e

1 file changed

Lines changed: 10 additions & 20 deletions

File tree

Libraries/PeriphDrivers/Source/SPI/spi_reva2.c

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ typedef struct {
6161
mxc_spi_tscontrol_t ts_control;
6262

6363
// DMA Settings.
64+
bool dma_in_use;
6465
mxc_dma_reva_regs_t *dma;
6566
int tx_dma_ch;
6667
int rx_dma_ch;
@@ -294,6 +295,7 @@ static void MXC_SPI_RevA2_process(mxc_spi_reva_regs_t *spi)
294295

295296
// Target is done after callback (if valid) is handled.
296297
STATES[spi_num].transaction_done = true;
298+
STATES[spi_num].dma_in_use = false;
297299

298300
// Reset the SPI to complete the on-going transaction.
299301
// SPIn may remain busy (SPI_STAT) even after the target select input
@@ -330,6 +332,7 @@ static void MXC_SPI_RevA2_resetStateStruct(int8_t spi_num)
330332
STATES[spi_num].ts_control = MXC_SPI_TSCONTROL_HW_AUTO; // Default (0) state.
331333

332334
// DMA
335+
STATES[spi_num].dma_in_use = false;
333336
STATES[spi_num].dma = NULL;
334337
STATES[spi_num].tx_dma_ch = -1;
335338
STATES[spi_num].rx_dma_ch = -1;
@@ -1090,6 +1093,7 @@ static void MXC_SPI_RevA2_transactionSetup(mxc_spi_reva_regs_t *spi, uint8_t *tx
10901093

10911094
// Initialize SPIn state to handle data.
10921095
STATES[spi_num].transaction_done = false;
1096+
STATES[spi_num].dma_in_use = use_dma;
10931097

10941098
STATES[spi_num].tx_buffer = tx_buffer;
10951099
STATES[spi_num].tx_count_bytes = 0;
@@ -1240,6 +1244,7 @@ static void MXC_SPI_RevA2_transactionSetup(mxc_spi_reva_regs_t *spi, uint8_t *tx
12401244
// does not trigger a CTZ interrupt.
12411245
if (rx_length_frames > 0 && rx_buffer != NULL) {
12421246
STATES[spi_num].transaction_done = true;
1247+
STATES[spi_num].dma_in_use = false;
12431248
}
12441249

12451250
STATES[spi_num].tx_done = true;
@@ -1378,11 +1383,6 @@ int MXC_SPI_RevA2_ControllerTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_bu
13781383

13791384
spi_num = MXC_SPI_GET_IDX((mxc_spi_regs_t *)spi);
13801385

1381-
// Make sure DMA is not initialized.
1382-
if (STATES[spi_num].dma_initialized == true) {
1383-
return E_BAD_STATE;
1384-
}
1385-
13861386
// Make sure SPI Instance is in Controller mode (L. Master).
13871387
if (STATES[spi_num].controller_target != MXC_SPI_TYPE_CONTROLLER) {
13881388
return E_BAD_STATE;
@@ -1406,6 +1406,7 @@ int MXC_SPI_RevA2_ControllerTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_bu
14061406
if (STATES[spi_num].tx_done == true && STATES[spi_num].rx_done == true) {
14071407
if (!(spi->stat & MXC_F_SPI_REVA_STAT_BUSY)) {
14081408
STATES[spi_num].transaction_done = true;
1409+
STATES[spi_num].dma_in_use = false;
14091410
}
14101411
}
14111412

@@ -1424,11 +1425,6 @@ int MXC_SPI_RevA2_ControllerTransactionAsync(mxc_spi_reva_regs_t *spi, uint8_t *
14241425

14251426
spi_num = MXC_SPI_GET_IDX((mxc_spi_regs_t *)spi);
14261427

1427-
// Make sure DMA is not initialized.
1428-
if (STATES[spi_num].dma_initialized == true) {
1429-
return E_BAD_STATE;
1430-
}
1431-
14321428
// Make sure SPI Instance is in Controller mode (L. Master).
14331429
if (STATES[spi_num].controller_target != MXC_SPI_TYPE_CONTROLLER) {
14341430
return E_BAD_STATE;
@@ -1501,11 +1497,6 @@ int MXC_SPI_RevA2_TargetTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_buffer
15011497
// Ensure valid SPI Instance.
15021498
spi_num = MXC_SPI_GET_IDX((mxc_spi_regs_t *)spi);
15031499

1504-
// Make sure DMA is not initialized.
1505-
if (STATES[spi_num].dma_initialized == true) {
1506-
return E_BAD_STATE;
1507-
}
1508-
15091500
// Make sure SPI Instance is in Target mode (L. Slave).
15101501
if (STATES[spi_num].controller_target != MXC_SPI_TYPE_TARGET) {
15111502
return E_BAD_STATE;
@@ -1523,6 +1514,7 @@ int MXC_SPI_RevA2_TargetTransaction(mxc_spi_reva_regs_t *spi, uint8_t *tx_buffer
15231514
if (STATES[spi_num].tx_count_bytes == STATES[spi_num].tx_length_bytes &&
15241515
STATES[spi_num].rx_count_bytes == STATES[spi_num].rx_length_bytes) {
15251516
STATES[spi_num].transaction_done = true;
1517+
STATES[spi_num].dma_in_use = false;
15261518
}
15271519

15281520
MXC_SPI_RevA2_process(spi);
@@ -1543,11 +1535,6 @@ int MXC_SPI_RevA2_TargetTransactionAsync(mxc_spi_reva_regs_t *spi, uint8_t *tx_b
15431535
// Ensure valid SPI Instance.
15441536
spi_num = MXC_SPI_GET_IDX((mxc_spi_regs_t *)spi);
15451537

1546-
// Make sure DMA is not initialized.
1547-
if (STATES[spi_num].dma_initialized == true) {
1548-
return E_BAD_STATE;
1549-
}
1550-
15511538
// Make sure SPI Instance is in Target mode (L. Slave).
15521539
if (STATES[spi_num].controller_target != MXC_SPI_TYPE_TARGET) {
15531540
return E_BAD_STATE;
@@ -1612,6 +1599,7 @@ void MXC_SPI_RevA2_Handler(mxc_spi_reva_regs_t *spi)
16121599

16131600
// Controller is done after callback (if valid) is handled.
16141601
STATES[spi_num].transaction_done = true;
1602+
STATES[spi_num].dma_in_use = false;
16151603
}
16161604

16171605
// Handle RX Threshold
@@ -1662,6 +1650,7 @@ void MXC_SPI_RevA2_DMA_TX_Handler(mxc_spi_reva_regs_t *spi)
16621650
// TX Transaction is done if there's no RX transaction.
16631651
if (STATES[spi_num].rx_length_bytes == 0 || STATES[spi_num].tx_buffer == NULL) {
16641652
STATES[spi_num].transaction_done = true;
1653+
STATES[spi_num].dma_in_use = false;
16651654
}
16661655
}
16671656

@@ -1707,6 +1696,7 @@ void MXC_SPI_RevA2_DMA_RX_Handler(mxc_spi_reva_regs_t *spi)
17071696
// RX transaction determines the controller is done if TX transaction is also present.
17081697
if (STATES[spi_num].tx_length_bytes > 0 && STATES[spi_num].tx_buffer != NULL) {
17091698
STATES[spi_num].transaction_done = true;
1699+
STATES[spi_num].dma_in_use = false;
17101700
}
17111701
}
17121702

0 commit comments

Comments
 (0)