|
@@ -56,14 +56,12 @@ typedef struct nu_uspi *uspi_t;
|
|
/* Private functions ------------------------------------------------------------*/
|
|
/* Private functions ------------------------------------------------------------*/
|
|
static rt_err_t nu_uspi_bus_configure(struct rt_spi_device *device, struct rt_spi_configuration *configuration);
|
|
static rt_err_t nu_uspi_bus_configure(struct rt_spi_device *device, struct rt_spi_configuration *configuration);
|
|
static rt_uint32_t nu_uspi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message);
|
|
static rt_uint32_t nu_uspi_bus_xfer(struct rt_spi_device *device, struct rt_spi_message *message);
|
|
-static void nu_uspi_transmission_with_poll(struct nu_uspi *uspi_bus,
|
|
|
|
- uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word);
|
|
|
|
|
|
+static void nu_uspi_transmission_with_poll(struct nu_uspi *uspi_bus, uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word);
|
|
static int nu_uspi_register_bus(struct nu_uspi *uspi_bus, const char *name);
|
|
static int nu_uspi_register_bus(struct nu_uspi *uspi_bus, const char *name);
|
|
static void nu_uspi_drain_rxfifo(USPI_T *uspi_base);
|
|
static void nu_uspi_drain_rxfifo(USPI_T *uspi_base);
|
|
|
|
|
|
#if defined(BSP_USING_USPI_PDMA)
|
|
#if defined(BSP_USING_USPI_PDMA)
|
|
static void nu_pdma_uspi_rx_cb(void *pvUserData, uint32_t u32EventFilter);
|
|
static void nu_pdma_uspi_rx_cb(void *pvUserData, uint32_t u32EventFilter);
|
|
- static void nu_pdma_uspi_tx_cb(void *pvUserData, uint32_t u32EventFilter);
|
|
|
|
static rt_err_t nu_pdma_uspi_rx_config(struct nu_uspi *uspi_bus, uint8_t *pu8Buf, int32_t i32RcvLen, uint8_t bytes_per_word);
|
|
static rt_err_t nu_pdma_uspi_rx_config(struct nu_uspi *uspi_bus, uint8_t *pu8Buf, int32_t i32RcvLen, uint8_t bytes_per_word);
|
|
static rt_err_t nu_pdma_uspi_tx_config(struct nu_uspi *uspi_bus, const uint8_t *pu8Buf, int32_t i32SndLen, uint8_t bytes_per_word);
|
|
static rt_err_t nu_pdma_uspi_tx_config(struct nu_uspi *uspi_bus, const uint8_t *pu8Buf, int32_t i32SndLen, uint8_t bytes_per_word);
|
|
static rt_size_t nu_uspi_pdma_transmit(struct nu_uspi *uspi_bus, const uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word);
|
|
static rt_size_t nu_uspi_pdma_transmit(struct nu_uspi *uspi_bus, const uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word);
|
|
@@ -187,12 +185,12 @@ static rt_err_t nu_uspi_bus_configure(struct rt_spi_device *device,
|
|
if (configuration->mode & RT_SPI_MSB)
|
|
if (configuration->mode & RT_SPI_MSB)
|
|
{
|
|
{
|
|
/* Set sequence to MSB first */
|
|
/* Set sequence to MSB first */
|
|
- SPI_SET_MSB_FIRST(uspi_bus->uspi_base);
|
|
|
|
|
|
+ USPI_SET_MSB_FIRST(uspi_bus->uspi_base);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
/* Set sequence to LSB first */
|
|
/* Set sequence to LSB first */
|
|
- SPI_SET_LSB_FIRST(uspi_bus->uspi_base);
|
|
|
|
|
|
+ USPI_SET_LSB_FIRST(uspi_bus->uspi_base);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -212,17 +210,11 @@ static void nu_pdma_uspi_rx_cb(void *pvUserData, uint32_t u32EventFilter)
|
|
|
|
|
|
RT_ASSERT(uspi_bus != RT_NULL);
|
|
RT_ASSERT(uspi_bus != RT_NULL);
|
|
|
|
|
|
- /* Get base address of uspi register */
|
|
|
|
- USPI_T *uspi_base = uspi_bus->uspi_base;
|
|
|
|
-
|
|
|
|
- if (u32EventFilter & NU_PDMA_EVENT_TRANSFER_DONE)
|
|
|
|
- {
|
|
|
|
- USPI_DISABLE_RX_PDMA(uspi_base); // Stop DMA TX transfer
|
|
|
|
- }
|
|
|
|
|
|
+ rt_sem_release(uspi_bus->m_psSemBus);
|
|
}
|
|
}
|
|
static rt_err_t nu_pdma_uspi_rx_config(struct nu_uspi *uspi_bus, uint8_t *pu8Buf, int32_t i32RcvLen, uint8_t bytes_per_word)
|
|
static rt_err_t nu_pdma_uspi_rx_config(struct nu_uspi *uspi_bus, uint8_t *pu8Buf, int32_t i32RcvLen, uint8_t bytes_per_word)
|
|
{
|
|
{
|
|
- rt_err_t result = RT_EOK;
|
|
|
|
|
|
+ rt_err_t result = RT_ERROR;
|
|
rt_uint8_t *dst_addr = NULL;
|
|
rt_uint8_t *dst_addr = NULL;
|
|
nu_pdma_memctrl_t memctrl = eMemCtl_Undefined;
|
|
nu_pdma_memctrl_t memctrl = eMemCtl_Undefined;
|
|
|
|
|
|
@@ -269,27 +261,9 @@ exit_nu_pdma_uspi_rx_config:
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
-static void nu_pdma_uspi_tx_cb(void *pvUserData, uint32_t u32EventFilter)
|
|
|
|
-{
|
|
|
|
- struct nu_uspi *uspi_bus;
|
|
|
|
- uspi_bus = (struct nu_uspi *)pvUserData;
|
|
|
|
-
|
|
|
|
- RT_ASSERT(uspi_bus != RT_NULL);
|
|
|
|
-
|
|
|
|
- /* Get base address of uspi register */
|
|
|
|
- USPI_T *uspi_base = uspi_bus->uspi_base;
|
|
|
|
-
|
|
|
|
- if (u32EventFilter & NU_PDMA_EVENT_TRANSFER_DONE)
|
|
|
|
- {
|
|
|
|
- USPI_DISABLE_TX_PDMA(uspi_base); // Stop DMA TX transfer
|
|
|
|
- }
|
|
|
|
- rt_sem_release(uspi_bus->m_psSemBus);
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static rt_err_t nu_pdma_uspi_tx_config(struct nu_uspi *uspi_bus, const uint8_t *pu8Buf, int32_t i32SndLen, uint8_t bytes_per_word)
|
|
static rt_err_t nu_pdma_uspi_tx_config(struct nu_uspi *uspi_bus, const uint8_t *pu8Buf, int32_t i32SndLen, uint8_t bytes_per_word)
|
|
{
|
|
{
|
|
- rt_err_t result = RT_EOK;
|
|
|
|
|
|
+ rt_err_t result = RT_ERROR;
|
|
rt_uint8_t *src_addr = NULL;
|
|
rt_uint8_t *src_addr = NULL;
|
|
nu_pdma_memctrl_t memctrl = eMemCtl_Undefined;
|
|
nu_pdma_memctrl_t memctrl = eMemCtl_Undefined;
|
|
|
|
|
|
@@ -298,15 +272,6 @@ static rt_err_t nu_pdma_uspi_tx_config(struct nu_uspi *uspi_bus, const uint8_t *
|
|
|
|
|
|
rt_uint8_t uspi_pdma_tx_chid = uspi_bus->pdma_chanid_tx;
|
|
rt_uint8_t uspi_pdma_tx_chid = uspi_bus->pdma_chanid_tx;
|
|
|
|
|
|
- result = nu_pdma_callback_register(uspi_pdma_tx_chid,
|
|
|
|
- nu_pdma_uspi_tx_cb,
|
|
|
|
- (void *)uspi_bus,
|
|
|
|
- NU_PDMA_EVENT_TRANSFER_DONE);
|
|
|
|
- if (result != RT_EOK)
|
|
|
|
- {
|
|
|
|
- goto exit_nu_pdma_uspi_tx_config;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if (pu8Buf == RT_NULL)
|
|
if (pu8Buf == RT_NULL)
|
|
{
|
|
{
|
|
uspi_bus->dummy = 0;
|
|
uspi_bus->dummy = 0;
|
|
@@ -343,7 +308,7 @@ exit_nu_pdma_uspi_tx_config:
|
|
*/
|
|
*/
|
|
static rt_size_t nu_uspi_pdma_transmit(struct nu_uspi *uspi_bus, const uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word)
|
|
static rt_size_t nu_uspi_pdma_transmit(struct nu_uspi *uspi_bus, const uint8_t *send_addr, uint8_t *recv_addr, int length, uint8_t bytes_per_word)
|
|
{
|
|
{
|
|
- rt_err_t result = RT_EOK;
|
|
|
|
|
|
+ rt_err_t result = RT_ERROR;
|
|
|
|
|
|
/* Get base address of uspi register */
|
|
/* Get base address of uspi register */
|
|
USPI_T *uspi_base = uspi_bus->uspi_base;
|
|
USPI_T *uspi_base = uspi_bus->uspi_base;
|
|
@@ -354,13 +319,13 @@ static rt_size_t nu_uspi_pdma_transmit(struct nu_uspi *uspi_bus, const uint8_t *
|
|
RT_ASSERT(result == RT_EOK);
|
|
RT_ASSERT(result == RT_EOK);
|
|
|
|
|
|
/* Trigger TX/RX at the same time. */
|
|
/* Trigger TX/RX at the same time. */
|
|
- USPI_TRIGGER_TX_PDMA(uspi_base);
|
|
|
|
- USPI_TRIGGER_RX_PDMA(uspi_base);
|
|
|
|
|
|
+ USPI_TRIGGER_TX_RX_PDMA(uspi_base);
|
|
|
|
|
|
/* Wait PDMA transfer done */
|
|
/* Wait PDMA transfer done */
|
|
rt_sem_take(uspi_bus->m_psSemBus, RT_WAITING_FOREVER);
|
|
rt_sem_take(uspi_bus->m_psSemBus, RT_WAITING_FOREVER);
|
|
|
|
|
|
- while (USPI_IS_BUSY(uspi_base));
|
|
|
|
|
|
+ /* Stop DMA TX/RX transfer */
|
|
|
|
+ USPI_DISABLE_TX_RX_PDMA(uspi_base);
|
|
|
|
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
@@ -404,7 +369,6 @@ static void nu_uspi_drain_rxfifo(USPI_T *uspi_base)
|
|
static int nu_uspi_read(USPI_T *uspi_base, uint8_t *recv_addr, uint8_t bytes_per_word)
|
|
static int nu_uspi_read(USPI_T *uspi_base, uint8_t *recv_addr, uint8_t bytes_per_word)
|
|
{
|
|
{
|
|
int size = 0;
|
|
int size = 0;
|
|
- uint32_t val;
|
|
|
|
|
|
|
|
// Read RX data
|
|
// Read RX data
|
|
if (!USPI_GET_RX_EMPTY_FLAG(uspi_base))
|
|
if (!USPI_GET_RX_EMPTY_FLAG(uspi_base))
|
|
@@ -412,6 +376,7 @@ static int nu_uspi_read(USPI_T *uspi_base, uint8_t *recv_addr, uint8_t bytes_per
|
|
// Read data from USPI RX FIFO
|
|
// Read data from USPI RX FIFO
|
|
switch (bytes_per_word)
|
|
switch (bytes_per_word)
|
|
{
|
|
{
|
|
|
|
+ uint32_t val;
|
|
case 2:
|
|
case 2:
|
|
val = USPI_READ_RX(uspi_base);
|
|
val = USPI_READ_RX(uspi_base);
|
|
nu_set16_le(recv_addr, val);
|
|
nu_set16_le(recv_addr, val);
|
|
@@ -419,6 +384,8 @@ static int nu_uspi_read(USPI_T *uspi_base, uint8_t *recv_addr, uint8_t bytes_per
|
|
case 1:
|
|
case 1:
|
|
*recv_addr = USPI_READ_RX(uspi_base);
|
|
*recv_addr = USPI_READ_RX(uspi_base);
|
|
break;
|
|
break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
size = bytes_per_word;
|
|
size = bytes_per_word;
|
|
}
|
|
}
|
|
@@ -439,6 +406,8 @@ static int nu_uspi_write(USPI_T *uspi_base, const uint8_t *send_addr, uint8_t by
|
|
case 1:
|
|
case 1:
|
|
USPI_WRITE_TX(uspi_base, *((uint8_t *)send_addr));
|
|
USPI_WRITE_TX(uspi_base, *((uint8_t *)send_addr));
|
|
break;
|
|
break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
|
|
return bytes_per_word;
|
|
return bytes_per_word;
|
|
@@ -475,6 +444,7 @@ static void nu_uspi_transmission_with_poll(struct nu_uspi *uspi_bus,
|
|
length -= nu_uspi_write(uspi_base, (const uint8_t *)&uspi_bus->dummy, bytes_per_word);
|
|
length -= nu_uspi_write(uspi_base, (const uint8_t *)&uspi_bus->dummy, bytes_per_word);
|
|
|
|
|
|
/* Read data from RX FIFO */
|
|
/* Read data from RX FIFO */
|
|
|
|
+ while (USPI_GET_RX_EMPTY_FLAG(uspi_base));
|
|
recv_addr += nu_uspi_read(uspi_base, recv_addr, bytes_per_word);
|
|
recv_addr += nu_uspi_read(uspi_base, recv_addr, bytes_per_word);
|
|
}
|
|
}
|
|
} // else if (send_addr == RT_NULL && recv_addr != RT_NULL)
|
|
} // else if (send_addr == RT_NULL && recv_addr != RT_NULL)
|
|
@@ -488,11 +458,12 @@ static void nu_uspi_transmission_with_poll(struct nu_uspi *uspi_bus,
|
|
length -= bytes_per_word;
|
|
length -= bytes_per_word;
|
|
|
|
|
|
/* Read data from RX FIFO */
|
|
/* Read data from RX FIFO */
|
|
|
|
+ while (USPI_GET_RX_EMPTY_FLAG(uspi_base));
|
|
recv_addr += nu_uspi_read(uspi_base, recv_addr, bytes_per_word);
|
|
recv_addr += nu_uspi_read(uspi_base, recv_addr, bytes_per_word);
|
|
}
|
|
}
|
|
} // else
|
|
} // else
|
|
|
|
|
|
- /* Wait RX or drian RX-FIFO */
|
|
|
|
|
|
+ /* Wait RX or drain RX-FIFO */
|
|
if (recv_addr)
|
|
if (recv_addr)
|
|
{
|
|
{
|
|
// Wait SPI transmission done
|
|
// Wait SPI transmission done
|
|
@@ -521,9 +492,8 @@ static void nu_uspi_transfer(struct nu_uspi *uspi_bus, uint8_t *tx, uint8_t *rx,
|
|
#if defined(BSP_USING_USPI_PDMA)
|
|
#if defined(BSP_USING_USPI_PDMA)
|
|
/* DMA transfer constrains */
|
|
/* DMA transfer constrains */
|
|
if ((uspi_bus->pdma_chanid_rx >= 0) &&
|
|
if ((uspi_bus->pdma_chanid_rx >= 0) &&
|
|
- (!(uint32_t)tx % bytes_per_word) &&
|
|
|
|
- (!(uint32_t)rx % bytes_per_word) &&
|
|
|
|
- (bytes_per_word != 3))
|
|
|
|
|
|
+ !((uint32_t)tx % bytes_per_word) &&
|
|
|
|
+ !((uint32_t)rx % bytes_per_word) )
|
|
nu_uspi_pdma_transmit(uspi_bus, tx, rx, length, bytes_per_word);
|
|
nu_uspi_pdma_transmit(uspi_bus, tx, rx, length, bytes_per_word);
|
|
else
|
|
else
|
|
nu_uspi_transmission_with_poll(uspi_bus, tx, rx, length, bytes_per_word);
|
|
nu_uspi_transmission_with_poll(uspi_bus, tx, rx, length, bytes_per_word);
|