summaryrefslogtreecommitdiff
path: root/nuttx
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-07-18 21:04:15 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-07-18 21:04:15 +0000
commit08acfbbbbfc832365e3f28a73b7f059d885082f4 (patch)
tree8a3575703c070ff21b32c5ffcf95611e96bdb63f /nuttx
parentd5c888e4eb96f7e781d2ab5079d462d19a63a882 (diff)
downloadpx4-nuttx-08acfbbbbfc832365e3f28a73b7f059d885082f4.tar.gz
px4-nuttx-08acfbbbbfc832365e3f28a73b7f059d885082f4.tar.bz2
px4-nuttx-08acfbbbbfc832365e3f28a73b7f059d885082f4.zip
Update driver to work with and external SPIFI library (vs. ROM)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4952 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx')
-rw-r--r--nuttx/arch/arm/src/lpc43xx/chip/lpc43_spifi.h11
-rw-r--r--nuttx/arch/arm/src/lpc43xx/lpc43_spifi.c110
-rw-r--r--nuttx/arch/arm/src/lpc43xx/lpc43_spifi.h2
-rw-r--r--nuttx/configs/lpc4330-xplorer/README.txt2
-rw-r--r--nuttx/configs/lpc4330-xplorer/nsh/defconfig3
5 files changed, 111 insertions, 17 deletions
diff --git a/nuttx/arch/arm/src/lpc43xx/chip/lpc43_spifi.h b/nuttx/arch/arm/src/lpc43xx/chip/lpc43_spifi.h
index 053b1947e..3b9913061 100644
--- a/nuttx/arch/arm/src/lpc43xx/chip/lpc43_spifi.h
+++ b/nuttx/arch/arm/src/lpc43xx/chip/lpc43_spifi.h
@@ -187,6 +187,7 @@ struct spifi_operands_s
/* Interface to SPIFI ROM driver */
+#ifndef CONFIG_SPIFI_LIBRARY
struct spifi_driver_s
{
int32_t (*spifi_init)(struct spifi_dev_s *dev, uint32_t cshigh,
@@ -233,6 +234,7 @@ struct spifi_driver_s
uint16_t value);
int32_t (*wait_busy)(struct spifi_dev_s *dev, uint8_t prog_or_erase);
};
+#endif
/****************************************************************************
* Private Data
@@ -246,5 +248,14 @@ struct spifi_driver_s
* Public Functions
****************************************************************************/
+#ifdef CONFIG_SPIFI_LIBRARY
+EXTERN int32_t spifi_init(struct spifi_dev_s *dev, uint32_t cshigh,
+ uint32_t options, uint32_t mhz);
+EXTERN int32_t spifi_program(struct spifi_dev_s *dev, const uint8_t *source,
+ struct spifi_operands_s *opers);
+EXTERN int32_t spifi_erase(struct spifi_dev_s *dev,
+ struct spifi_operands_s *opers);
+#endif
+
#endif /* __ARCH_ARM_SRC_LPC43XX_CHIP_LPC43_SPIFI_H */
diff --git a/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.c b/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.c
index 937840b80..d52b26cec 100644
--- a/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.c
+++ b/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.c
@@ -86,7 +86,7 @@
/* This is where the LPC43xx address where random-access reads begin */
#define SPIFI_BASE \
- (FAR uint8_t *)(LPC43_LOCSRAM_SPIFI_BASE + CONFIG_SPIFI_OFFSET)
+ (FAR uint8_t *)(LPC43_SPIFI_DATA_BASE + CONFIG_SPIFI_OFFSET)
/* Check if we are using a hard-coded block size */
@@ -114,7 +114,7 @@
# elif CONFIG_SPIFI_BLKSIZE == (256*1024)
# define SPIFI_BLKSHIFT 18
# else
-# error "Unsupported value of CONFIG_SPIFI_BLKSIZE
+# error "Unsupported value of CONFIG_SPIFI_BLKSIZE"
# endif
# define SPIFI_BLKSIZE CONFIG_SPIFI_BLKSIZE
#else
@@ -122,6 +122,24 @@
# define SPIFI_BLKSHIFT priv->blkshift
#endif
+/* Can use ROM driver or an external driver library */
+
+#ifndef CONFIG_SPIFI_LIBRARY
+# define SPIFI_INIT(priv, rom, cshigh, options, mhz) \
+ priv->spifi->spifi_init(rom, cshigh, options, mhz)
+# define SPIFI_PROGRAM(priv, rom, src, operands) \
+ priv->spifi->spifi_program(rom, src, operands)
+# define SPIFI_ERASE(priv, rom, operands) \
+ priv->spifi->spifi_erase(rom, operands)
+#else
+# define SPIFI_INIT(priv, rom, cshigh, options, mhz) \
+ spifi_init(rom, cshigh, options, mhz)
+# define SPIFI_PROGRAM(priv, rom, src, operands) \
+ spifi_program(rom, src, operands)
+# define SPIFI_ERASE(priv, rom, operands) \
+ spifi_erase(rom, operands)
+#endif
+
/* 512 byte sector simulation */
#ifdef CONFIG_SPIFI_SECTOR512 /* Emulate a 512 byte sector */
@@ -240,7 +258,9 @@
struct lpc43_dev_s
{
struct mtd_dev_s mtd; /* MTD interface */
+#ifndef CONFIG_SPIFI_LIBRARY
FAR struct spifi_driver_s *spifi; /* Pointer to ROM driver table */
+#endif
FAR struct spifi_dev_s rom; /* Needed for communication with ROM driver */
struct spifi_operands_s operands; /* Needed for program and erase ROM calls */
uint16_t nblocks; /* Number of blocks of size blksize */
@@ -331,10 +351,10 @@ static void lpc43_blockerase(struct lpc43_dev_s *priv, off_t sector)
priv->operands.dest = SPIFI_BASE + (sector << SPIFI_BLKSHIFT);
priv->operands.length = SPIFI_BLKSIZE;
- result = priv->spifi->spifi_erase(&priv->rom, &priv->operands);
+ result = SPIFI_ERASE(priv, &priv->rom, &priv->operands);
if (result != 0)
{
- fdbg("ERROR: spifi_erase failed: %05x\n", result);
+ fdbg("ERROR: SPIFI_ERASE failed: %05x\n", result);
}
}
@@ -357,10 +377,10 @@ static inline int lpc43_chiperase(struct lpc43_dev_s *priv)
priv->operands.dest = SPIFI_BASE;
priv->operands.length = SPIFI_BLKSIZE * priv->nblocks;
- result = priv->spifi->spifi_erase(&priv->rom, &priv->operands);
+ result = SPIFI_ERASE(priv, &priv->rom, &priv->operands);
if (result != 0)
{
- fdbg("ERROR: spifi_erase failed: %05x\n", result);
+ fdbg("ERROR: SPIFI_ERASE failed: %05x\n", result);
return -EIO;
}
@@ -388,10 +408,10 @@ static int lpc43_pagewrite(FAR struct lpc43_dev_s *priv, FAR uint8_t *dest,
priv->operands.dest = dest;
priv->operands.length = nbytes;
- result = priv->spifi->spifi_program(&priv->rom, src, &priv->operands);
+ result = SPIFI_PROGRAM(priv, &priv->rom, src, &priv->operands);
if (result != 0)
{
- fdbg("ERROR: spifi_program failed: %05x\n", result);
+ fdbg("ERROR: SPIFI_PROGRAM failed: %05x\n", result);
return -EIO;
}
@@ -891,7 +911,6 @@ static inline void lpc43_spifi_pinconfig(void)
static inline int lpc43_rominit(FAR struct lpc43_dev_s *priv)
{
- FAR struct spifi_driver_s *spifi;
#ifndef CONFIG_SPIFI_BLKSIZE
FAR struct spfi_desc_s *desc;
uint16_t sectors;
@@ -901,8 +920,9 @@ static inline int lpc43_rominit(FAR struct lpc43_dev_s *priv)
/* Get the pointer to the SPIFI ROM driver table. */
- spifi = *((struct spifi_driver_s **)SPIFI_ROM_PTR);
- priv->spifi = spifi;
+#ifndef CONFIG_SPIFI_LIBRARY
+ priv->spifi = *((struct spifi_driver_s **)SPIFI_ROM_PTR);
+#endif
/* The final parameter of the spifi_init() ROM driver call should be the
* serial clock rate divided by 1000000, rounded to an integer. The SPIFI
@@ -923,19 +943,19 @@ static inline int lpc43_rominit(FAR struct lpc43_dev_s *priv)
* 0x20004 Operand error: S_MODE3+S_FULLCLK+S_RCVCLK in options
*/
- result = spifi->spifi_init(&priv->rom, SPIFI_CSHIGH,
- S_RCVCLK | S_FULLCLK, SCLK_MHZ);
+ result = SPIFI_INIT(priv, &priv->rom, SPIFI_CSHIGH,
+ S_RCVCLK | S_FULLCLK, SCLK_MHZ);
if (result != 0)
{
- fdbg("ERROR: spifi_init failed: %05x\n", result);
+ fdbg("ERROR: SPIFI_INIT failed: %05x\n", result);
/* Try again */
- result = spifi->spifi_init(&priv->rom, SPIFI_CSHIGH,
- S_RCVCLK | S_FULLCLK, SCLK_MHZ);
+ result = SPIFI_INIT(priv, &priv->rom, SPIFI_CSHIGH,
+ S_RCVCLK | S_FULLCLK, SCLK_MHZ);
if (result != 0)
{
- fdbg("ERROR: spifi_init failed: %05x\n", result);
+ fdbg("ERROR: SPIFI_INIT failed: %05x\n", result);
return -ENODEV;
}
}
@@ -1114,4 +1134,60 @@ FAR struct mtd_dev_s *lpc43_spifi_initialize(void)
return (FAR struct mtd_dev_s *)priv;
}
+/****************************************************************************
+ * Name: pullMISO
+ *
+ * Description:
+ * hardware-control routine used by spifi_rom_api.c
+ *
+ * Input Parameters:
+ * high
+ *
+ * Returned value:
+ * None.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_SPIFI_LIBRARY
+void pullMISO(int high)
+{
+ uint32_t pinconfig;
+
+ /* Control MISO pull-up/down state Assume pull down by clearing:
+ *
+ * EPD = Enable pull-down connect (bit
+ */
+
+ pinconfig = PINCONF_SPIFI_MISO & ~(PINCONF_PULLUP | PINCONF_PULLDOWN);
+ switch (high)
+ {
+ case 0:
+ {
+ /* Pull down */
+
+ pinconfig |= PINCONF_PULLDOWN;
+ }
+ break;
+
+ case 1:
+ {
+ /* Pull up */
+
+ pinconfig |= PINCONF_PULLUP;
+ }
+ break;
+
+ default:
+ {
+ /* Neither */
+ }
+ break;
+ }
+
+ /* Reconfigure MISO */
+
+ lpc43_pin_config(pinconfig);
+}
+#endif
+
#endif /* CONFIG_LPC43_SPIFI */
diff --git a/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.h b/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.h
index 8c2023f14..ef2ad842e 100644
--- a/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.h
+++ b/nuttx/arch/arm/src/lpc43xx/lpc43_spifi.h
@@ -69,6 +69,8 @@
*
* Other SPIFI options
*
+ * CONFIG_SPIFI_LIBRARY - Don't use the LPC43xx ROM routines but, instead,
+ * use an external library implementation of the SPIFI interface.
* CONFIG_SPIFI_SECTOR512 - If defined, then the driver will report a more
* FAT friendly 512 byte sector size and will manage the read-modify-write
* operations on the larger erase block.
diff --git a/nuttx/configs/lpc4330-xplorer/README.txt b/nuttx/configs/lpc4330-xplorer/README.txt
index cf60ca0ec..ce6ce5531 100644
--- a/nuttx/configs/lpc4330-xplorer/README.txt
+++ b/nuttx/configs/lpc4330-xplorer/README.txt
@@ -920,3 +920,5 @@ Where <subdir> is one of the following:
FAT friendly 512 byte sector size and will manage the read-modify-write
operations on the larger erase block.
CONFIG_SPIFI_READONLY - Define to support only read-only operations.
+ CONFIG_SPIFI_LIBRARY - Don't use the LPC43xx ROM routines but, instead,
+ use an external library implementation of the SPIFI interface.
diff --git a/nuttx/configs/lpc4330-xplorer/nsh/defconfig b/nuttx/configs/lpc4330-xplorer/nsh/defconfig
index e6db818ca..deb3ff19e 100644
--- a/nuttx/configs/lpc4330-xplorer/nsh/defconfig
+++ b/nuttx/configs/lpc4330-xplorer/nsh/defconfig
@@ -678,11 +678,14 @@ CONFIG_MMCSD_HAVECARDDETECT=n
# FAT friendly 512 byte sector size and will manage the read-modify-write
# operations on the larger erase block.
# CONFIG_SPIFI_READONLY - Define to support only read-only operations.
+# CONFIG_SPIFI_LIBRARY - Don't use the LPC43xx ROM routines but, instead,
+# use an external library implementation of the SPIFI interface.
#
CONFIG_SPIFI_OFFSET=0
CONFIG_SPIFI_BLKSIZE=4096
CONFIG_SPIFI_SECTOR512=y
CONFIG_SPIFI_RDONLY=n
+CONFIG_SPIFI_LIBRARY=n
# TCP/IP and UDP support via uIP
# CONFIG_NET - Enable or disable all network features