Add SPI driver for the Freescale KL25Z

This commit is contained in:
Gregory Nutt
2013-06-19 12:10:01 -06:00
parent f597172733
commit 2a2de71b5d
9 changed files with 798 additions and 59 deletions
+4
View File
@@ -79,12 +79,16 @@ config KL_FLEXCAN1
config KL_SPI0
bool "SPI0"
default n
select SPI
select SPI_EXCHANGE
---help---
Support SPI0
config KL_SPI1
bool "SPI1"
default n
select SPI
select SPI_EXCHANGE
---help---
Support SPI1
+10 -2
View File
@@ -33,7 +33,7 @@
#
############################################################################
HEAD_ASRC =
HEAD_ASRC =
CMN_ASRCS = up_exception.S up_saveusercontext.S up_fullcontextrestore.S
CMN_ASRCS += up_switchcontext.S vfork.S
@@ -67,7 +67,7 @@ ifeq ($(CONFIG_DEBUG),y)
CMN_CSRCS += up_dumpnvic.c
endif
CHIP_ASRCS =
CHIP_ASRCS =
CHIP_CSRCS = kl_clockconfig.c kl_gpio.c kl_idle.c kl_irq.c kl_irqprio.c
CHIP_CSRCS += kl_lowputc.c kl_serial.c kl_start.c kl_timerisr.c kl_cfmconfig.c
@@ -75,6 +75,14 @@ ifeq ($(CONFIG_NUTTX_KERNEL),y)
CHIP_CSRCS += kl_userspace.c
endif
ifeq ($(CONFIG_KL_SPI0),y)
CHIP_CSRCS += kl_spi.c
else
ifeq ($(CONFIG_KL_SPI1),y)
CHIP_CSRCS += kl_spi.c
endif
endif
ifeq ($(CONFIG_DEBUG),y)
CHIP_CSRCS += kl_dumpgpio.c
endif
+1 -1
View File
@@ -260,7 +260,7 @@
#define SIM_SCGC4_USBOTG (1 << 18) /* Bit 18: USB Clock Gate Control */
#define SIM_SCGC4_CMP (1 << 19) /* Bit 19: Comparator Clock Gate Control */
/* Bits 20-21: Reserved */
#define SIM_SCGC4_SPI10 (1 << 22) /* Bit 22: SPI0 Clock Gate Control */
#define SIM_SCGC4_SPI0 (1 << 22) /* Bit 22: SPI0 Clock Gate Control */
#define SIM_SCGC4_SPI1 (1 << 23) /* Bit 23: SPI1 Clock Gate Control */
/* Bits 24-31: Reserved */
/* System Clock Gating Control Register 5 */
+2 -3
View File
@@ -77,7 +77,6 @@
/* SPI control register 1 */
#define SPI_C1_LSBFE (1 << 0) /* Bit 0: LSB first (shifter direction) */
#define SPI_C1_SSOE (1 << 1) /* Bit 1: Slave select output enable */
#define SPI_C1_CPHA (1 << 2) /* Bit 2: Clock phase */
@@ -87,7 +86,6 @@
#define SPI_C1_SPE (1 << 6) /* Bit 6: SPI system enable */
#define SPI_C1_SPIE (1 << 7) /* Bit 7: SPI interrupt enable: for SPRF and MODF */
/* SPI control register 2 */
#define SPI_C2_SPC0 (1 << 0) /* Bit 0: SPI pin control 0 */
@@ -102,6 +100,7 @@
#define SPI_BR_SPR_SHIFT (0) /* Bits 0-3: SPI baud rate divisor */
#define SPI_BR_SPR_MASK (15 << SPI_BR_SPR_SHIFT)
# define SPI_BR_SPR_DIV(n) (((n)-1) << SPI_BR_SPR_SHIFT) /* Baud rate divisor is 2^(n-1) */
# define SPI_BR_SPR_DIV2 (0 << SPI_BR_SPR_SHIFT) /* Baud rate divisor is 2 */
# define SPI_BR_SPR_DIV4 (1 << SPI_BR_SPR_SHIFT) /* Baud rate divisor is 4 */
# define SPI_BR_SPR_DIV8 (2 << SPI_BR_SPR_SHIFT) /* Baud rate divisor is 8 */
@@ -113,7 +112,7 @@
# define SPI_BR_SPR_DIV512 (8 << SPI_BR_SPR_SHIFT) /* Baud rate divisor is 512 */
#define SPI_BR_SPPR_SHIFT (4) /* Bits 4-6: SPI baud rate prescale divisor */
#define SPI_BR_SPPR_MASK (7 << SPI_BR_SPPR_SHIFT)
# define SPI_BR_SPPR(n) (((n)-1) << SPI_BR_SPPR_SHIFT) /* Prescaler=n, n=1-8 */
# define SPI_BR_SPPR(n) (((n)-1) << SPI_BR_SPPR_SHIFT) /* Prescaler=n, n=1-8 */
/* Bit 7: Reserved */
/* SPI status register */
/* Bits 0-3: Reserved */
+737
View File
File diff suppressed because it is too large Load Diff
+33 -41
View File
@@ -1,4 +1,4 @@
/****************************************************************************
/************************************************************************************
* arch/arm/src/kl/kl_gpio.h
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
@@ -31,24 +31,26 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
************************************************************************************/
#ifndef __ARCH_ARM_SRC_KL_KL_SPI_H
#define __ARCH_ARM_SRC_KL_KL_SPI_H
/****************************************************************************
/************************************************************************************
* Included Files
****************************************************************************/
************************************************************************************/
#include <nuttx/config.h>
/****************************************************************************
* Pre-processor Declarations
****************************************************************************/
#if defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI1)
/****************************************************************************
/************************************************************************************
* Pre-processor Declarations
************************************************************************************/
/************************************************************************************
* Public Data
****************************************************************************/
************************************************************************************/
#ifndef __ASSEMBLY__
@@ -60,17 +62,34 @@ extern "C" {
#define EXTERN extern
#endif
/****************************************************************************
/************************************************************************************
* Public Function Prototypes
************************************************************************************/
/****************************************************************************
* Name: kl_spiinitialize
*
* Description:
* Initialize the selected SPI port.
*
* Input Parameter:
* Port number (for hardware that has mutiple SPI interfaces)
*
* Returned Value:
* Valid SPI device structure reference on succcess; a NULL on failure
*
****************************************************************************/
struct spi_dev_s;
FAR struct spi_dev_s *kl_spiinitialize(int port);
/************************************************************************************
* Name: kl_spi[n]select, kl_spi[n]status, and kl_spi[n]cmddata
*
* Description:
* These external functions must be provided by board-specific logic. They are
* implementations of the select, status, and cmddata methods of the SPI interface
* defined by struct spi_ops_s (see include/nuttx/spi.h). All other methods
* defined by struct spi_ops_s (see include/nuttx/spi.h). All other methods
* including up_spiinitialize()) are provided by common Kinetis logic. To use
* this common SPI logic on your board:
*
@@ -86,13 +105,12 @@ extern "C" {
* 3. Add a call to up_spiinitialize() in your low level application
* initialization logic
* 4. The handle returned by up_spiinitialize() may then be used to bind the
* SPI driver to higher level logic (e.g., calling
* SPI driver to higher level logic (e.g., calling
* mmcsd_spislotinitialize(), for example, will bind the SPI driver to
* the SPI MMC/SD driver).
*
************************************************************************************/
struct spi_dev_s;
enum spi_dev_e;
#ifdef CONFIG_KL_SPI0
@@ -102,6 +120,7 @@ uint8_t kl_spi0status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
int kl_spi0cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
#endif
#endif
#ifdef CONFIG_KL_SPI1
void kl_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
uint8_t kl_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
@@ -109,34 +128,7 @@ uint8_t kl_spi1status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
int kl_spi1cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
#endif
#endif
#ifdef CONFIG_KL_SPI2
void kl_spi2select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
uint8_t kl_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
#ifdef CONFIG_SPI_CMDDATA
int kl_spi2cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
#endif
#endif
/****************************************************************************
* Name: ssp_flush
*
* Description:
* Flush and discard any words left in the RX fifo. This can be called
* from spi[n]select after a device is deselected (if you worry about such
* things).
*
* Input Parameters:
* dev - Device-specific state data
*
* Returned Value:
* None
*
****************************************************************************/
#if defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI2)
struct spi_dev_s;
void spi_flush(FAR struct spi_dev_s *dev);
#endif
#endif /* __ASSEMBLY__ */
#endif /* CONFIG_KL_SPI0 || CONFIG_KL_SPI1 */
#endif /* __ARCH_ARM_SRC_KL_KL_SPI_H */
-1
View File
@@ -1,6 +1,5 @@
/****************************************************************************
* arch/arm/src/kl/kl_start.c
* arch/arm/src/chip/kl_start.c
*
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
+9 -9
View File
@@ -72,7 +72,7 @@
/* Debug ********************************************************************/
/* The following enable debug output from this file:
*
*
* CONFIG_DEBUG - Define to enable general debug features
* CONFIG_DEBUG_SPI - Define to enable basic SSP debug (needs CONFIG_DEBUG)
* CONFIG_DEBUG_VERBOSE - Define to enable verbose SSP debug
@@ -171,7 +171,7 @@ static const struct spi_ops_s g_spiops =
static struct lpc17_spidev_s g_spidev =
{
.spidev = { &g_spiops },
};
};
/****************************************************************************
* Public Data
@@ -279,7 +279,7 @@ static uint32_t spi_setfrequency(FAR struct spi_dev_s *dev, uint32_t frequency)
divisor = (divisor + 1) & ~1;
/* Save the new divisor value */
putreg32(divisor, LPC17_SPI_CCR);
/* Calculate the new actual */
@@ -332,19 +332,19 @@ static void spi_setmode(FAR struct spi_dev_s *dev, enum spi_mode_e mode)
{
case SPIDEV_MODE0: /* CPOL=0; CPHA=0 */
break;
case SPIDEV_MODE1: /* CPOL=0; CPHA=1 */
regval |= SPI_CR_CPHA;
break;
case SPIDEV_MODE2: /* CPOL=1; CPHA=0 */
regval |= SPI_CR_CPOL;
break;
case SPIDEV_MODE3: /* CPOL=1; CPHA=1 */
regval |= (SPI_CR_CPOL|SPI_CR_CPHA);
break;
default:
DEBUGASSERT(FALSE);
return;
@@ -527,7 +527,7 @@ static void spi_recvblock(FAR struct spi_dev_s *dev, FAR void *buffer, size_t nw
(void)getreg32(LPC17_SPI_SR);
/* Read the received data from the SPI Data Register */
/* Read the received data from the SPI Data Register */
*ptr++ = (uint8_t)getreg32(LPC17_SPI_DR);
nwords--;
@@ -585,7 +585,7 @@ FAR struct spi_dev_s *lpc17_spiinitialize(int port)
regval |= SYSCON_PCONP_PCSPI;
putreg32(regval, LPC17_SYSCON_PCONP);
irqrestore(flags);
/* Configure 8-bit SPI mode and master mode */
putreg32(SPI_CR_BITS_8BITS|SPI_CR_BITENABLE|SPI_CR_MSTR, LPC17_SPI_CR);