Add support for SPI NOR chip select

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2938 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2010-09-11 02:53:07 +00:00
parent 130d25dfd2
commit 1b649bc966
3 changed files with 86 additions and 47 deletions
+67 -45
View File
@@ -1,7 +1,7 @@
/************************************************************************************ /************************************************************************************
* arch/arm/src/lpc313x/lpc313x_internal.h * arch/arm/src/lpc313x/lpc313x_internal.h
* *
* Copyright (C) 2009 Gregory Nutt. All rights reserved. * Copyright (C) 2009-2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr> * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -47,7 +47,9 @@
#include <stdbool.h> #include <stdbool.h>
#include "up_internal.h" #include "up_internal.h"
#include "up_arch.h"
#include "chip.h" #include "chip.h"
#include "lpc313x_ioconfig.h"
/************************************************************************************ /************************************************************************************
* Definitions * Definitions
@@ -79,6 +81,70 @@ extern "C" {
#define EXTERN extern #define EXTERN extern
#endif #endif
/************************************************************************************
* Inline Functions
************************************************************************************/
/* Configure a pin as an input */
static inline void gpio_configinput(uint32_t ioconfig, uint32_t bit)
{
uint32_t regaddr;
regaddr = ioconfig + LPC313X_IOCONFIG_MODE0RESET_OFFSET;
putreg32(bit, regaddr);
regaddr = ioconfig + LPC313X_IOCONFIG_MODE1RESET_OFFSET;
putreg32(bit, regaddr);
}
/* Return the current state of an input GPIO pin */
static inline bool lpc313x_gpioread(uint32_t ioconfig, uint32_t bit)
{
uint32_t regaddr = ioconfig + LPC313X_IOCONFIG_PINS_OFFSET;
return (getreg32(regaddr) & bit) != 0;
}
/* Configure the pin so that it is driven by the device */
static inline void gpio_configdev(uint32_t ioconfig, uint32_t bit)
{
uint32_t regaddr;
regaddr = ioconfig + LPC313X_IOCONFIG_MODE1RESET_OFFSET;
putreg32(bit, regaddr);
regaddr = ioconfig + LPC313X_IOCONFIG_MODE0SET_OFFSET;
putreg32(bit, regaddr);
}
/* Configure a pin as a low output */
static inline void gpio_outputlow(uint32_t ioconfig, uint32_t bit)
{
uint32_t regaddr;
regaddr = ioconfig + LPC313X_IOCONFIG_MODE1SET_OFFSET;
putreg32(bit, regaddr);
regaddr = ioconfig + LPC313X_IOCONFIG_MODE0RESET_OFFSET;
putreg32(bit, regaddr);
}
/* Configure a pin as a high output */
static inline void gpio_outputhigh(uint32_t ioconfig, uint32_t bit)
{
uint32_t regaddr;
regaddr = ioconfig + LPC313X_IOCONFIG_MODE1SET_OFFSET;
putreg32(bit, regaddr);
regaddr = ioconfig + LPC313X_IOCONFIG_MODE0SET_OFFSET;
putreg32(bit, regaddr);
}
/************************************************************************************ /************************************************************************************
* Public Function Prototypes * Public Function Prototypes
************************************************************************************/ ************************************************************************************/
@@ -103,50 +169,6 @@ EXTERN void lpc313x_lowsetup(void);
EXTERN void lpc313x_clockconfig(void); EXTERN void lpc313x_clockconfig(void);
/************************************************************************************
* Name: lpc313x_configgpio
*
* Description:
* Configure a GPIO pin based on bit-encoded description of the pin.
*
************************************************************************************/
EXTERN int lpc313x_configgpio(uint32_t cfgset);
/************************************************************************************
* Name: lpc313x_gpiowrite
*
* Description:
* Write one or zero to the selected GPIO pin
*
************************************************************************************/
EXTERN void lpc313x_gpiowrite(uint32_t pinset, bool value);
/************************************************************************************
* Name: lpc313x_gpioread
*
* Description:
* Read one or zero from the selected GPIO pin
*
************************************************************************************/
EXTERN bool lpc313x_gpioread(uint32_t pinset);
/************************************************************************************
* Function: lpc313x_dumpgpio
*
* Description:
* Dump all GPIO registers associated with the provided base address
*
************************************************************************************/
#ifdef CONFIG_DEBUG
EXTERN int lpc313x_dumpgpio(uint32_t pinset, const char *msg);
#else
# define lpc313x_dumpgpio(p,m)
#endif
/************************************************************************************ /************************************************************************************
* Name: lpc313x_spiselect and lpc313x_spistatus * Name: lpc313x_spiselect and lpc313x_spistatus
* *
+6 -2
View File
@@ -45,20 +45,24 @@
#include <nuttx/compiler.h> #include <nuttx/compiler.h>
#include <stdint.h> #include <stdint.h>
#include "lpc313x_ioconfig.h"
/************************************************************************************ /************************************************************************************
* Definitions * Definitions
************************************************************************************/ ************************************************************************************/
/* EA3131L GPIOs ********************************************************************/ /* EA3131L GPIOs ********************************************************************/
/* LEDs */ /* LEDs -- interface through an I2C GPIO expander */
/* BUTTONS -- NOTE that some have EXTI interrupts configured */ /* BUTTONS -- NOTE that some have EXTI interrupts configured */
/* SPI Chip Selects */ /* SPI Chip Selects */
/* SPI NOR flash is the only device on SPI. SPI_CS_OUT0 is its chip select */
/* USB Soft Connect Pullup*/ #define SPINOR_CS IOCONFIG_SPI_CSOUT0
/* USB Soft Connect Pullup -- NONE */
/************************************************************************************ /************************************************************************************
* Public Types * Public Types
+13
View File
@@ -100,6 +100,7 @@ void weak_function lpc313x_spiinitialize(void)
* architecture. * architecture.
*/ */
gpio_outputhigh(LPC313X_IOCONFIG_SPI, SPINOR_CS);
} }
/**************************************************************************** /****************************************************************************
@@ -130,6 +131,18 @@ void weak_function lpc313x_spiinitialize(void)
void lpc313x_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected) void lpc313x_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected)
{ {
spidbg("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); spidbg("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert");
if (devid == SPIDEV_FLASH)
{
if (selected)
{
gpio_outputlow(LPC313X_IOCONFIG_SPI, SPINOR_CS);
}
else
{
gpio_outputhigh(LPC313X_IOCONFIG_SPI, SPINOR_CS);
}
}
} }
uint8_t lpc313x_spistatus(FAR struct spi_dev_s *dev, enum spi_dev_e devid) uint8_t lpc313x_spistatus(FAR struct spi_dev_s *dev, enum spi_dev_e devid)