summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2013-06-20 13:50:16 -0600
committerGregory Nutt <gnutt@nuttx.org>2013-06-20 13:50:16 -0600
commit39bd870cc0447b7453b690f647ca26eb69ebbfd1 (patch)
treecf4d27509dd3b635ca1d19cce40a4d252a043809
parente262f1de51fe3a429dabe9bc143fdb95ca8e45c9 (diff)
downloadnuttx-39bd870cc0447b7453b690f647ca26eb69ebbfd1.tar.gz
nuttx-39bd870cc0447b7453b690f647ca26eb69ebbfd1.tar.bz2
nuttx-39bd870cc0447b7453b690f647ca26eb69ebbfd1.zip
Add framework for managing SPI-related discretes on the Freedom KL25Z board.
-rw-r--r--nuttx/ChangeLog4
-rw-r--r--nuttx/TODO22
-rwxr-xr-xnuttx/arch/arm/src/kl/kl_spi.c5
-rw-r--r--nuttx/arch/arm/src/kl/kl_spi.h4
-rw-r--r--nuttx/configs/freedom-kl25z/src/Makefile8
-rw-r--r--nuttx/configs/freedom-kl25z/src/kl_boardinitialize.c12
-rw-r--r--nuttx/configs/freedom-kl25z/src/kl_spi.c237
7 files changed, 274 insertions, 18 deletions
diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog
index f42e5495f..402f80a29 100644
--- a/nuttx/ChangeLog
+++ b/nuttx/ChangeLog
@@ -5015,4 +5015,6 @@
* arm/src/sam34/chip/sam4l_pdca.h: Add SAM4L PDCA register definition
file; also renamed sam_dmac.* files to sam3u_dmac.* to identify
them as SAM4U/4S only files (2013-6-19).
-
+ * configs/freedom-lk25z/src/kl_spi.c: Add the framework for
+ controlling SPI-related discrete inputs and outputs. Taken from
+ work by Alan Carvalho de Assis (2013-6-20).
diff --git a/nuttx/TODO b/nuttx/TODO
index e59103d7f..28bd90e84 100644
--- a/nuttx/TODO
+++ b/nuttx/TODO
@@ -1,4 +1,4 @@
-NuttX TODO List (Last updated May 29, 2013)
+NuttX TODO List (Last updated June 20, 2013)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This file summarizes known NuttX bugs, limitations, inconsistencies with
@@ -903,10 +903,22 @@ o Libraries (libc/)
Status: Open
Priority: Low
- Title: FERROR() AND CLEARERR()
- Description: Not implemented: ferror() and clearerr()
- Status: Open
- Priority: Low
+ Title: FERROR()
+ Description: ferror(), feof(), and clearerror() are present, but the
+ implementation of ferror() is limited. There are flags in the
+ stream structure to indicate EOF and error conditions but nothing
+ in the code currently sets the error indication. This is a
+ trivial change to many interfaces and has not yet been done.
+ Instead, for now, ferror() is equivalent to !feof(). If an
+ interface can failure because of an error or and EOF and you
+ only want to distinguish between an error and the EOF then
+ this ferror() will work. However, if no error is reported then
+ this ferror() cannot tell you if an error has occurred or not.
+ Status: Open
+ Priority: Meidum to Low: Some applications use ferror() and not the
+ return value to determine if an error occurred. Those
+ applications will fail with this limited implementation of
+ ferror().
Title: CONCURRENT STREAM READ/WRITE
Description: NuttX only supports a single file pointer so reads and writes
diff --git a/nuttx/arch/arm/src/kl/kl_spi.c b/nuttx/arch/arm/src/kl/kl_spi.c
index e73fa8403..4573e4a07 100755
--- a/nuttx/arch/arm/src/kl/kl_spi.c
+++ b/nuttx/arch/arm/src/kl/kl_spi.c
@@ -311,7 +311,6 @@ static uint32_t spi_setfrequency(FAR struct spi_dev_s *dev, uint32_t frequency)
/* Check if the requested frequence is the same as the frequency selection */
- DEBUGASSERT(priv && frequency <= SPI_CLOCK / 2);
#ifndef CONFIG_SPI_OWNBUS
if (priv->frequency == frequency)
{
@@ -637,7 +636,7 @@ static void spi_recvblock(FAR struct spi_dev_s *dev, FAR void *rxbuffer, size_t
****************************************************************************/
/****************************************************************************
- * Name: kl_spiinitialize
+ * Name: up_spiinitialize
*
* Description:
* Initialize the selected SPI port.
@@ -650,7 +649,7 @@ static void spi_recvblock(FAR struct spi_dev_s *dev, FAR void *rxbuffer, size_t
*
****************************************************************************/
-FAR struct spi_dev_s *kl_spiinitialize(int port)
+FAR struct spi_dev_s *up_spiinitialize(int port)
{
FAR struct kl_spidev_s *priv;
uint32_t regval;
diff --git a/nuttx/arch/arm/src/kl/kl_spi.h b/nuttx/arch/arm/src/kl/kl_spi.h
index 7b93a444d..659ee8f5f 100644
--- a/nuttx/arch/arm/src/kl/kl_spi.h
+++ b/nuttx/arch/arm/src/kl/kl_spi.h
@@ -67,7 +67,7 @@ extern "C" {
************************************************************************************/
/****************************************************************************
- * Name: kl_spiinitialize
+ * Name: up_spiinitialize
*
* Description:
* Initialize the selected SPI port.
@@ -81,7 +81,7 @@ extern "C" {
****************************************************************************/
struct spi_dev_s;
-FAR struct spi_dev_s *kl_spiinitialize(int port);
+FAR struct spi_dev_s *up_spiinitialize(int port);
/************************************************************************************
* Name: kl_spi[n]select, kl_spi[n]status, and kl_spi[n]cmddata
diff --git a/nuttx/configs/freedom-kl25z/src/Makefile b/nuttx/configs/freedom-kl25z/src/Makefile
index 68db441bc..5164f9310 100644
--- a/nuttx/configs/freedom-kl25z/src/Makefile
+++ b/nuttx/configs/freedom-kl25z/src/Makefile
@@ -46,6 +46,10 @@ ifeq ($(CONFIG_KL_TSI),y)
CSRCS += kl_tsi.c
endif
+ifeq ($(CONFIG_KL_SPI0),y)
+CSRCS += kl_spi.c
+endif
+
ifeq ($(CONFIG_HAVE_CXX),y)
CSRCS += kl_cxxinitialize.c
endif
@@ -54,8 +58,8 @@ ifeq ($(CONFIG_ARCH_LEDS),y)
CSRCS += kl_led.c
endif
-ifeq ($(CONFIG_NUC1XX_USBD),y)
-CSRCS += kl_usbd.c
+ifeq ($(CONFIG_KL_USBOTG),y)
+CSRCS += kl_usb.c
endif
ifeq ($(CONFIG_PWM),y)
diff --git a/nuttx/configs/freedom-kl25z/src/kl_boardinitialize.c b/nuttx/configs/freedom-kl25z/src/kl_boardinitialize.c
index eff2873b1..378de8ea4 100644
--- a/nuttx/configs/freedom-kl25z/src/kl_boardinitialize.c
+++ b/nuttx/configs/freedom-kl25z/src/kl_boardinitialize.c
@@ -75,19 +75,20 @@ void kl_boardinitialize(void)
* kl_spiinitialize() has been brought into the link.
*/
-#if defined(CONFIG_NUC1XX_SPI1) || defined(CONFIG_NUC1XX_SPI2) || defined(CONFIG_NUC1XX_SPI3)
+#if defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI1)
if (kl_spiinitialize)
{
kl_spiinitialize();
}
#endif
- /* Initialize USB if the 1) USB device controller is in the configuration and 2)
- * disabled, and 3) the weak function kl_usbinitialize() has been brought
- * into the build. Presumeably either CONFIG_USBDEV is also selected.
+ /* Initialize USB if the 1) USB device controller is in the configuration
+ * and 2) disabled, and 3) the weak function kl_usbinitialize() has been
+ * brought into the build. Presumeably either CONFIG_USBHOST or
+ * CONFIG_USBDEV is also selected.
*/
-#ifdef CONFIG_NUC1XX_USB
+#ifdef CONFIG_KL_USBOTG
if (kl_usbinitialize)
{
kl_usbinitialize();
@@ -100,6 +101,7 @@ void kl_boardinitialize(void)
kl_ledinit();
#endif
}
+
/****************************************************************************
* Name: board_initialize
*
diff --git a/nuttx/configs/freedom-kl25z/src/kl_spi.c b/nuttx/configs/freedom-kl25z/src/kl_spi.c
new file mode 100644
index 000000000..4d927d89b
--- /dev/null
+++ b/nuttx/configs/freedom-kl25z/src/kl_spi.c
@@ -0,0 +1,237 @@
+/****************************************************************************
+ * configs/freedom-kl25z/src/kl_spi.c
+ *
+ * Copyright (C) 2013 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+
+#include <stdbool.h>
+#include <debug.h>
+#include <errno.h>
+
+#include <nuttx/spi.h>
+
+#include "kl_gpio.h"
+#include "kl_spi.h"
+#include "freedom-kl25z.h"
+
+#if defined(CONFIG_KL_SPI0) || defined(CONFIG_KL_SPI1)
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* Enables debug output from this file (needs CONFIG_DEBUG too) */
+
+#undef SPI_DEBUG /* Define to enable debug */
+#undef SPI_VERBOSE /* Define to enable verbose debug */
+
+#ifdef SPI_DEBUG
+# define spidbg lldbg
+# ifdef SPI_VERBOSE
+# define spivdbg lldbg
+# else
+# define spivdbg(x...)
+# endif
+#else
+# undef SPI_VERBOSE
+# define spidbg(x...)
+# define spivdbg(x...)
+#endif
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: kl_spiinitialize
+ *
+ * Description:
+ * Called to configure SPI chip select GPIO pins for the FRDM-KL25Z board.
+ *
+ ****************************************************************************/
+
+void weak_function kl_spiinitialize(void)
+{
+ /* Configure SPI0 chip selects */
+
+#ifdef CONFIG_KL_SPI0
+#endif
+
+ /* Configure SPI1 chip selects */
+
+#ifdef CONFIG_KL_SPI1
+#endif
+}
+
+/****************************************************************************
+ * 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 including up_spiinitialize()) are provided by common
+ * Kinetis logic. To use this common SPI logic on your board:
+ *
+ * 1. Provide logic in kl_boardinitialize() to configure SPI chip select
+ * pins.
+ * 2. Provide kl_spi[n]select() and kl_spi[n]status() functions
+ * in your board-specific logic. These functions will perform chip
+ * selection and status operations using GPIOs in the way your board
+ * is configured.
+ * 2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide
+ * kl_spi[n]cmddata() functions in your board-specific logic. These
+ * functions will perform cmd/data selection operations using GPIOs in
+ * the way your board is configured.
+ * 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
+ * mmcsd_spislotinitialize(), for example, will bind the SPI driver to
+ * the SPI MMC/SD driver).
+ *
+ ****************************************************************************/
+/****************************************************************************
+ * Name: kl_spi[n]select
+ *
+ * Description:
+ * PIO chip select pins may be programmed by the board specific logic in
+ * one of two different ways. First, the pins may be programmed as SPI
+ * peripherals. In that case, the pins are completely controlled by the
+ * SPI driver. This method still needs to be provided, but it may be only
+ * a stub.
+ *
+ * An alternative way to program the PIO chip select pins is as a normal
+ * GPIO output. In that case, the automatic control of the CS pins is
+ * bypassed and this function must provide control of the chip select.
+ * NOTE: In this case, the GPIO output pin does *not* have to be the
+ * same as the NPCS pin normal associated with the chip select number.
+ *
+ * Input Parameters:
+ * devid - Identifies the (logical) device
+ * selected - TRUE:Select the device, FALSE:De-select the device
+ *
+ * Returned Values:
+ * None
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_SPI0
+void kl_spi0select(FAR struct spi_dev_s *dev, enum spi_dev_e devid,
+ bool selected)
+{
+ spivdbg("devid: %d CS: %s\n",
+ (int)devid, selected ? "assert" : "de-assert");
+}
+#endif
+
+#ifdef CONFIG_KL_SPI1
+void kl_spi1select(FAR struct spi_dev_s *dev, enum spi_dev_e devid,
+ bool selected)
+{
+ spivdbg("devid: %d CS: %s\n",
+ (int)devid, selected ? "assert" : "de-assert");
+}
+#endif
+
+/****************************************************************************
+ * Name: kl_spi[n]status
+ *
+ * Description:
+ * Return status information associated with the SPI device.
+ *
+ * Input Parameters:
+ * devid - Identifies the (logical) device
+ *
+ * Returned Values:
+ * Bit-encoded SPI status (see include/nuttx/spi.h.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_KL_SPI0
+uint8_t kl_spi0status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
+{
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_KL_SPI1
+uint8_t kl_spi2status(FAR struct spi_dev_s *dev, enum spi_dev_e devid)
+{
+ return 0;
+}
+#endif
+
+/****************************************************************************
+ * Name: kl_spi[n]cmddata
+ *
+ * Description:
+ * Some SPI interfaces, particularly with LCDs, and an auxilary 9th data
+ * input that determines where the other 8 data bits represent command or
+ * data. These interfaces control that CMD/DATA GPIO output
+ *
+ * Input Parameters:
+ * devid - Identifies the (logical) device
+ * cmd - Determines where command or data should be selected.
+ *
+ * Returned Values:
+ * Bit-encoded SPI status (see include/nuttx/spi.h.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SPI_CMDDATA
+#ifdef CONFIG_KL_SPI0
+int kl_spi0cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
+{
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_KL_SPI1
+int kl_spi1cmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd)
+{
+ return 0;
+}
+#endif
+#endif
+
+#endif /* CONFIG_KL_SPI */