From 08acfbbbbfc832365e3f28a73b7f059d885082f4 Mon Sep 17 00:00:00 2001 From: patacongo Date: Wed, 18 Jul 2012 21:04:15 +0000 Subject: 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 --- nuttx/arch/arm/src/lpc43xx/chip/lpc43_spifi.h | 11 +++ nuttx/arch/arm/src/lpc43xx/lpc43_spifi.c | 110 ++++++++++++++++++++++---- nuttx/arch/arm/src/lpc43xx/lpc43_spifi.h | 2 + nuttx/configs/lpc4330-xplorer/README.txt | 2 + nuttx/configs/lpc4330-xplorer/nsh/defconfig | 3 + 5 files changed, 111 insertions(+), 17 deletions(-) (limited to 'nuttx') 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 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 -- cgit v1.2.3