Add enum argument to SPI select method
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1666 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
c520a9867c
commit
04f44cd858
@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
* config/mcu123-lpc214x/src/up_spi.c
|
||||
*
|
||||
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
|
||||
* Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
*
|
||||
* This logic emulates the Prolific PL2303 serial/USB converter
|
||||
@ -88,7 +88,7 @@
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static void spi_select(FAR struct spi_dev_s *dev, boolean selected);
|
||||
static void spi_select(FAR struct spi_dev_s *dev, enum spidev_e devid, boolean selected);
|
||||
static uint32 spi_setfrequency(FAR struct spi_dev_s *dev, uint32 frequency);
|
||||
static ubyte spi_status(FAR struct spi_dev_s *dev);
|
||||
static ubyte spi_sndbyte(FAR struct spi_dev_s *dev, ubyte ch);
|
||||
@ -123,17 +123,21 @@ static struct spi_dev_s g_spidev = { &g_spiops };
|
||||
* Name: spi_select
|
||||
*
|
||||
* Description:
|
||||
* Enable/disable the SPI slave select
|
||||
* Enable/disable the SPI slave select. The implementation of this method
|
||||
* must include handshaking: If a device is selected, it must hold off
|
||||
* all other attempts to select the device until the device is deselecte.
|
||||
*
|
||||
* Input Parameters:
|
||||
* selected: TRUE: slave selected, FALSE: slave de-selected
|
||||
* dev - Device-specific state data
|
||||
* devid - Identifies the device to select
|
||||
* selected - TRUE: slave selected, FALSE: slave de-selected
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void spi_select(FAR struct spi_dev_s *dev, boolean selected)
|
||||
static void spi_select(FAR struct spi_dev_s *dev, enum spidev_e devid, boolean selected)
|
||||
{
|
||||
uint32 bit = 1 << 20;
|
||||
|
||||
|
@ -265,7 +265,7 @@ static inline void spi_putreg(FAR struct str71x_spidev_s *priv, ubyte offset,
|
||||
|
||||
/* SPI methods */
|
||||
|
||||
static void spi_select(FAR struct spi_dev_s *dev, boolean selected);
|
||||
static void spi_select(FAR struct spi_dev_s *dev, enum spidev_e devid, boolean selected);
|
||||
static uint32 spi_setfrequency(FAR struct spi_dev_s *dev, uint32 frequency);
|
||||
static ubyte spi_status(FAR struct spi_dev_s *dev);
|
||||
static ubyte spi_sndbyte(FAR struct spi_dev_s *dev, ubyte ch);
|
||||
@ -357,17 +357,21 @@ static inline void spi_putreg(FAR struct str71x_spidev_s *priv, ubyte offset, ui
|
||||
* Name: spi_select
|
||||
*
|
||||
* Description:
|
||||
* Enable/disable the SPI slave select
|
||||
* Enable/disable the SPI slave select. The implementation of this method
|
||||
* must include handshaking: If a device is selected, it must hold off
|
||||
* all other attempts to select the device until the device is deselected.
|
||||
*
|
||||
* Input Parameters:
|
||||
* selected: TRUE: slave selected, FALSE: slave de-selected
|
||||
* dev - Device-specific state data
|
||||
* devid - Identifies the device to select
|
||||
* selected - TRUE: slave selected, FALSE: slave de-selected
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void spi_select(FAR struct spi_dev_s *dev, boolean selected)
|
||||
static void spi_select(FAR struct spi_dev_s *dev, enum spidev_e devid, boolean selected)
|
||||
{
|
||||
FAR struct str71x_spidev_s *priv = (FAR struct str71x_spidev_s *)dev;
|
||||
uint16 reg16;
|
||||
|
@ -362,7 +362,7 @@ static uint32 mmcsd_sendcmd(FAR struct mmcsd_slot_s *slot,
|
||||
|
||||
/* Select SPI */
|
||||
|
||||
SPI_SELECT(spi, TRUE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, TRUE);
|
||||
|
||||
/* Send command code */
|
||||
|
||||
@ -409,7 +409,7 @@ static uint32 mmcsd_sendcmd(FAR struct mmcsd_slot_s *slot,
|
||||
if (i == 0)
|
||||
{
|
||||
fdbg("Failed: i=%d response=%02x\n", i, response);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
return (uint32)-1;
|
||||
}
|
||||
|
||||
@ -469,7 +469,7 @@ static void mmcsd_setblklen(FAR struct mmcsd_slot_s *slot, uint32 length)
|
||||
uint32 result;
|
||||
|
||||
result = mmcsd_sendcmd(slot, &g_cmd16, length);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -604,7 +604,7 @@ static int mmcsd_getcardinfo(FAR struct mmcsd_slot_s *slot, ubyte *buffer,
|
||||
ubyte response;
|
||||
int i;
|
||||
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
SPI_SNDBYTE(spi, 0xff);
|
||||
|
||||
/* Send the CMD9 or CMD10 */
|
||||
@ -644,13 +644,13 @@ static int mmcsd_getcardinfo(FAR struct mmcsd_slot_s *slot, ubyte *buffer,
|
||||
|
||||
(void)SPI_SNDBYTE(spi, 0xff);
|
||||
(void)SPI_SNDBYTE(spi, 0xff);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
|
||||
errout_with_eio:
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -697,12 +697,12 @@ static int mmcsd_open(FAR struct inode *inode)
|
||||
/* Select the slave */
|
||||
|
||||
mmcsd_semtake(&slot->sem);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
|
||||
/* Verify that the MMC/SD card is alive and ready for business */
|
||||
|
||||
ret = mmcsd_waitready(slot);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
mmcsd_semgive(&slot->sem);
|
||||
return ret;
|
||||
}
|
||||
@ -790,7 +790,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
|
||||
/* Select the slave and synchronize */
|
||||
|
||||
mmcsd_semtake(&slot->sem);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
(void)SPI_SNDBYTE(spi, 0xff);
|
||||
|
||||
/* Send CMD17: Reads a block of the size selected by the SET_BLOCKLEN
|
||||
@ -836,7 +836,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
|
||||
|
||||
/* On success, return the number of sectors transfer */
|
||||
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
mmcsd_semgive(&slot->sem);
|
||||
|
||||
fvdbg("(%d) Read %d bytes:\n", i, nbytes);
|
||||
@ -846,7 +846,7 @@ static ssize_t mmcsd_read(FAR struct inode *inode, unsigned char *buffer,
|
||||
}
|
||||
|
||||
errout_with_eio:
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
mmcsd_semgive(&slot->sem);
|
||||
return -EIO;
|
||||
}
|
||||
@ -932,7 +932,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode, const unsigned char *buffer,
|
||||
/* Select the slave and synchronize */
|
||||
|
||||
mmcsd_semtake(&slot->sem);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
(void)SPI_SNDBYTE(spi, 0xff);
|
||||
|
||||
/* Send CMD24 (WRITE_BLOCK) and verify that good R1 status is returned */
|
||||
@ -941,7 +941,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode, const unsigned char *buffer,
|
||||
if (response != MMCSD_SPIR1_OK)
|
||||
{
|
||||
fdbg("CMD24 failed: R1=%02x\n", response);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
ret = -EIO;
|
||||
goto errout_with_sem;
|
||||
}
|
||||
@ -976,7 +976,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode, const unsigned char *buffer,
|
||||
/* Wait until the card is no longer busy */
|
||||
|
||||
ret = mmcsd_waitready(slot);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
mmcsd_semgive(&slot->sem);
|
||||
|
||||
/* Verify that the card successfully became non-busy */
|
||||
@ -1141,7 +1141,7 @@ static int mmcsd_mediainitialize(FAR struct mmcsd_slot_s *slot)
|
||||
fvdbg("Send CMD0\n");
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
|
||||
for (j = 10; j; j--)
|
||||
{
|
||||
@ -1151,7 +1151,7 @@ static int mmcsd_mediainitialize(FAR struct mmcsd_slot_s *slot)
|
||||
/* Send CMD0 (GO_TO_IDLE) to put MMC/SD in IDLE/SPI mode */
|
||||
|
||||
result = mmcsd_sendcmd(slot, &g_cmd0, 0);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
|
||||
/* Return from CMD0 is R1 which should now show IDLE STATE */
|
||||
|
||||
@ -1177,16 +1177,16 @@ static int mmcsd_mediainitialize(FAR struct mmcsd_slot_s *slot)
|
||||
for (i = 100; i; --i)
|
||||
{
|
||||
fvdbg("%d. Send CMD55\n", i);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
SPI_SNDBYTE(spi, 0xff);
|
||||
result = mmcsd_sendcmd(slot, &g_cmd55, 0);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
|
||||
fvdbg("%d. Send ACMD41\n", i);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
SPI_SNDBYTE(spi, 0xff);
|
||||
result = mmcsd_sendcmd(slot, &g_acmd41, 0);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
|
||||
/* If this is an MMC card, it will response with ILLEGAL COMMAND */
|
||||
|
||||
@ -1198,10 +1198,10 @@ static int mmcsd_mediainitialize(FAR struct mmcsd_slot_s *slot)
|
||||
for (i = 100; i; --i)
|
||||
{
|
||||
fvdbg("%d. Send CMD1\n", i);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
SPI_SNDBYTE(spi, 0xff);
|
||||
result = mmcsd_sendcmd(slot, &g_cmd1, 0);
|
||||
SPI_SELECT(spi, FALSE);
|
||||
SPI_SELECT(spi, SPIDEV_MMCSD, FALSE);
|
||||
|
||||
if (result == MMCSD_SPIR1_OK)
|
||||
{
|
||||
|
@ -53,17 +53,22 @@
|
||||
* Name: SPI_SELECT
|
||||
*
|
||||
* Description:
|
||||
* Enable/disable the SPI chip select. Required.
|
||||
* Enable/disable the SPI chip select. The implementation of this method
|
||||
* must include handshaking: If a device is selected, it must hold off
|
||||
* all other attempts to select the device until the device is deselected.
|
||||
* Required.
|
||||
*
|
||||
* Input Parameters:
|
||||
* select: TRUE: chip selected, FALSE: chip de-selected
|
||||
* dev - Device-specific state data
|
||||
* devid - Identifies the device to select
|
||||
* selected - TRUE: slave selected, FALSE: slave de-selected
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#define SPI_SELECT(d,b) ((d)->ops->select(d,b))
|
||||
#define SPI_SELECT(d,id,s) ((d)->ops->select(d,id,s))
|
||||
|
||||
/****************************************************************************
|
||||
* Name: SPI_SETFREQUENCY
|
||||
@ -183,12 +188,23 @@
|
||||
|
||||
typedef void (*mediachange_t)(void *arg);
|
||||
|
||||
/* If the board supports multiple SPI devices, this enumeration identifies
|
||||
* which is selected or de-seleted.
|
||||
*/
|
||||
|
||||
enum spidev_e
|
||||
{
|
||||
SPIDEV_NONE = 0, /* Not a valid value */
|
||||
SPIDEV_MMCSD, /* Select SPI MMC/SD device */
|
||||
SPIDEV_ETHERNET /* Select SPI ethernet device */
|
||||
};
|
||||
|
||||
/* The SPI vtable */
|
||||
|
||||
struct spi_dev_s;
|
||||
struct spi_ops_s
|
||||
{
|
||||
void (*select)(FAR struct spi_dev_s *dev, boolean selected);
|
||||
void (*select)(FAR struct spi_dev_s *dev, enum spidev_e devid, boolean selected);
|
||||
uint32 (*setfrequency)(FAR struct spi_dev_s *dev, uint32 frequency);
|
||||
ubyte (*status)(FAR struct spi_dev_s *dev);
|
||||
ubyte (*sndbyte)(FAR struct spi_dev_s *dev, ubyte ch);
|
||||
@ -223,7 +239,7 @@ extern "C" {
|
||||
* Name: up_spiinitialize
|
||||
*
|
||||
* Description:
|
||||
* Initialize the selected SPI port
|
||||
* Initialize the selected SPI port.
|
||||
*
|
||||
* Input Parameter:
|
||||
* Port number (for hardware that has mutiple SPI interfaces)
|
||||
|
Loading…
x
Reference in New Issue
Block a user