You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2020/02/04 19:50:30 UTC
[incubator-nuttx] branch master updated:
arch/arm/src/kinetis/kinetis_spi.c: Clear the MDIS bit before trying to
disable TX or RX.
This is an automated email from the ASF dual-hosted git repository.
aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new af68c22 arch/arm/src/kinetis/kinetis_spi.c: Clear the MDIS bit before trying to disable TX or RX.
af68c22 is described below
commit af68c22a2e29945169dbf83b806d98ec51536e54
Author: Alan Carvalho de Assis <ac...@gmail.com>
AuthorDate: Tue Feb 4 20:45:00 2020 +0000
arch/arm/src/kinetis/kinetis_spi.c: Clear the MDIS bit before trying to
disable TX or RX.
---
arch/arm/src/kinetis/kinetis_spi.c | 96 +++++++++++++++++++++++---------------
1 file changed, 59 insertions(+), 37 deletions(-)
diff --git a/arch/arm/src/kinetis/kinetis_spi.c b/arch/arm/src/kinetis/kinetis_spi.c
index 82f2412..9ec568f 100644
--- a/arch/arm/src/kinetis/kinetis_spi.c
+++ b/arch/arm/src/kinetis/kinetis_spi.c
@@ -119,15 +119,18 @@ struct kinetis_spidev_s
/* Helpers */
-static inline uint32_t spi_getreg(FAR struct kinetis_spidev_s *priv, uint8_t offset);
-static inline void spi_putreg(FAR struct kinetis_spidev_s *priv, uint8_t offset,
- uint32_t value);
-static inline uint16_t spi_getreg16(FAR struct kinetis_spidev_s *priv, uint8_t offset);
-static inline void spi_putreg16(FAR struct kinetis_spidev_s *priv, uint8_t offset,
- uint16_t value);
-static inline uint8_t spi_getreg8(FAR struct kinetis_spidev_s *priv, uint8_t offset);
-static inline void spi_putreg8(FAR struct kinetis_spidev_s *priv, uint8_t offset,
- uint8_t value);
+static inline uint32_t spi_getreg(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset);
+static inline void spi_putreg(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset, uint32_t value);
+static inline uint16_t spi_getreg16(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset);
+static inline void spi_putreg16(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset, uint16_t value);
+static inline uint8_t spi_getreg8(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset);
+static inline void spi_putreg8(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset, uint8_t value);
static inline uint16_t spi_readword(FAR struct kinetis_spidev_s *priv);
static inline void spi_writeword(FAR struct kinetis_spidev_s *priv,
uint16_t word);
@@ -136,28 +139,31 @@ static inline void spi_run(FAR struct kinetis_spidev_s *priv, bool enable);
static inline void spi_write_control(FAR struct kinetis_spidev_s *priv,
uint32_t control);
static inline void spi_write_status(FAR struct kinetis_spidev_s *priv,
- uint32_t status);
+ uint32_t status);
static inline void spi_wait_status(FAR struct kinetis_spidev_s *priv,
- uint32_t status);
-static uint16_t spi_send_data(FAR struct kinetis_spidev_s *priv, uint16_t wd,
- bool last);
+ uint32_t status);
+static uint16_t spi_send_data(FAR struct kinetis_spidev_s *priv,
+ uint16_t wd, bool last);
/* SPI methods */
static int spi_lock(FAR struct spi_dev_s *dev, bool lock);
-static uint32_t spi_setfrequency(FAR struct spi_dev_s *dev, uint32_t frequency);
-static void spi_setmode(FAR struct spi_dev_s *dev, enum spi_mode_e mode);
+static uint32_t spi_setfrequency(FAR struct spi_dev_s *dev,
+ uint32_t frequency);
+static void spi_setmode(FAR struct spi_dev_s *dev,
+ enum spi_mode_e mode);
static void spi_setbits(FAR struct spi_dev_s *dev, int nbits);
#ifdef CONFIG_SPI_HWFEATURES
static int spi_hwfeatures(FAR struct spi_dev_s *dev,
spi_hwfeatures_t features);
#endif
static uint16_t spi_send(FAR struct spi_dev_s *dev, uint16_t wd);
-static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
+static void spi_exchange(FAR struct spi_dev_s *dev,
+ FAR const void *txbuffer,
FAR void *rxbuffer, size_t nwords);
#ifndef CONFIG_SPI_EXCHANGE
-static void spi_sndblock(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
- size_t nwords);
+static void spi_sndblock(FAR struct spi_dev_s *dev,
+ FAR const void *txbuffer, size_t nwords);
static void spi_recvblock(FAR struct spi_dev_s *dev, FAR void *rxbuffer,
size_t nwords);
#endif
@@ -347,7 +353,8 @@ static inline void spi_putreg(FAR struct kinetis_spidev_s *priv, uint8_t offset,
*
************************************************************************************/
-static inline uint16_t spi_getreg16(FAR struct kinetis_spidev_s *priv, uint8_t offset)
+static inline uint16_t spi_getreg16(FAR struct kinetis_spidev_s *priv,
+ uint8_t offset)
{
return getreg16(priv->spibase + offset);
}
@@ -431,9 +438,9 @@ static inline void spi_putreg8(FAR struct kinetis_spidev_s *priv, uint8_t offset
*
************************************************************************************/
-static inline void spi_write_status(FAR struct kinetis_spidev_s *priv, uint32_t status)
+static inline void spi_write_status(FAR struct kinetis_spidev_s *priv,
+ uint32_t status)
{
-
/* Write the SR Register */
spi_putreg(priv, KINETIS_SPI_SR_OFFSET, status);
@@ -454,9 +461,9 @@ static inline void spi_write_status(FAR struct kinetis_spidev_s *priv, uint32_t
*
************************************************************************************/
-static inline void spi_wait_status(FAR struct kinetis_spidev_s *priv, uint32_t status)
+static inline void spi_wait_status(FAR struct kinetis_spidev_s *priv,
+ uint32_t status)
{
-
while (status != (spi_getreg(priv, KINETIS_SPI_SR_OFFSET) & status));
}
@@ -475,9 +482,9 @@ static inline void spi_wait_status(FAR struct kinetis_spidev_s *priv, uint32_t s
*
************************************************************************************/
-static inline void spi_write_control(FAR struct kinetis_spidev_s *priv, uint32_t control)
+static inline void spi_write_control(FAR struct kinetis_spidev_s *priv,
+ uint32_t control)
{
-
/* Write the control word to the SPI Data Register */
spi_putreg16(priv, KINETIS_SPI_PUSHR_OFFSET + 2, (uint16_t) (control >> 16));
@@ -520,7 +527,7 @@ static inline void spi_writeword(FAR struct kinetis_spidev_s *priv, uint16_t wor
*
* Returned Value:
* The 8-bit value from the FIFO
- *
+ *
************************************************************************************/
static inline uint16_t spi_readword(FAR struct kinetis_spidev_s *priv)
@@ -529,7 +536,7 @@ static inline uint16_t spi_readword(FAR struct kinetis_spidev_s *priv)
spi_wait_status(priv, SPI_SR_RFDF | SPI_SR_TCF);
- /* Return the data */
+ /* Return the data */
return spi_getreg16(priv, KINETIS_SPI_POPR_OFFSET);
}
@@ -803,7 +810,7 @@ static void spi_setbits(FAR struct spi_dev_s *dev, int nbits)
regval = spi_getreg(priv, priv->ctarsel);
regval &= ~(SPI_CTARM_FMSZ_MASK);
- regval |= SPI_CTARM_FMSZ(nbits-1);
+ regval |= SPI_CTARM_FMSZ(nbits - 1);
spi_putreg(priv, priv->ctarsel, regval);
/* Save the selection so the subsequence re-configurations will be faster */
@@ -950,7 +957,8 @@ static uint16_t spi_send(FAR struct spi_dev_s *dev, uint16_t wd)
* nwords - the length of data to be exchaned in units of words.
* The wordsize is determined by the number of bits-per-word
* selected for the SPI interface. If nbits <= 8, the data is
- * packed into uint8_t's; if nbits >8, the data is packed into uint16_t's
+ * packed into uint8_t's; if nbits > 8, the data is packed into
+ * uint16_t's
*
* Returned Value:
* None
@@ -1001,7 +1009,6 @@ static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
}
else
{
-
/* 8-bit mode */
while (nwords-- > 0)
@@ -1019,7 +1026,8 @@ static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
/* Exchange one word */
- byte = (uint8_t) spi_send_data(priv, (uint16_t)byte, nwords ? false : true);
+ byte = (uint8_t) spi_send_data(priv, (uint16_t)byte,
+ nwords ? false : true);
/* Is there a buffer to receive the return value? */
@@ -1030,6 +1038,7 @@ static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
}
}
}
+
/************************************************************************************
* Name: spi_sndblock
*
@@ -1042,7 +1051,8 @@ static void spi_exchange(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
* nwords - the length of data to send from the buffer in number of words.
* The wordsize is determined by the number of bits-per-word
* selected for the SPI interface. If nbits <= 8, the data is
- * packed into uint8_t's; if nbits >8, the data is packed into uint16_t's
+ * packed into uint8_t's; if nbits >8, the data is packed into
+ * uint16_t's
*
* Returned Value:
* None
@@ -1070,7 +1080,8 @@ static void spi_sndblock(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
* nwords - the length of data that can be received in the buffer in number
* of words. The wordsize is determined by the number of bits-per-word
* selected for the SPI interface. If nbits <= 8, the data is
- * packed into uint8_t's; if nbits >8, the data is packed into uint16_t's
+ * packed into uint8_t's; if nbits >8, the data is packed into
+ * uint16_t's
*
* Returned Value:
* None
@@ -1078,7 +1089,8 @@ static void spi_sndblock(FAR struct spi_dev_s *dev, FAR const void *txbuffer,
************************************************************************************/
#ifndef CONFIG_SPI_EXCHANGE
-static void spi_recvblock(FAR struct spi_dev_s *dev, FAR void *rxbuffer, size_t nwords)
+static void spi_recvblock(FAR struct spi_dev_s *dev, FAR void *rxbuffer,
+ size_t nwords)
{
spiinfo("rxbuffer=%p nwords=%d\n", rxbuffer, nwords);
return spi_exchange(dev, NULL, rxbuffer, nwords);
@@ -1182,6 +1194,15 @@ FAR struct spi_dev_s *kinetis_spibus_initialize(int port)
spi_run(priv, false);
+ /* Read MCR register and clear MDIS (to Enable module clock)
+ * It is necessary because to disable RX and TX FIFO the MDIS
+ * bit should be cleared first.
+ */
+
+ regval = spi_getreg(priv, KINETIS_SPI_MCR_OFFSET);
+ regval &= ~(SPI_MCR_MDIS);
+ spi_putreg(priv, KINETIS_SPI_MCR_OFFSET, regval);
+
/* Configure master mode:
* Master Mode - Enabled
* Continuous SCK - Disabled
@@ -1201,9 +1222,10 @@ FAR struct spi_dev_s *kinetis_spibus_initialize(int port)
*
*/
- spi_putreg(priv, KINETIS_SPI_MCR_OFFSET, SPI_MCR_MSTR | SPI_MCR_DCONF_SPI |
- SPI_MCR_SMPL_PT_0CLKS | SPI_MCR_PCSIS_MASK | SPI_MCR_HALT|
- SPI_MCR_DIS_RXF | SPI_MCR_DIS_TXF);
+ regval |= SPI_MCR_MSTR | SPI_MCR_DCONF_SPI | SPI_MCR_SMPL_PT_0CLKS |
+ SPI_MCR_PCSIS_MASK | SPI_MCR_HALT | SPI_MCR_DIS_RXF |
+ SPI_MCR_DIS_TXF;
+ spi_putreg(priv, KINETIS_SPI_MCR_OFFSET, regval);
/* Set the initial SPI configuration */