Support multiple SST26 devices on the same spi bus
This commit is contained in:
parent
46c36e2603
commit
437424d234
@ -203,11 +203,12 @@ struct sst26_dev_s
|
||||
{
|
||||
struct mtd_dev_s mtd; /* MTD interface */
|
||||
FAR struct spi_dev_s *dev; /* Saved SPI interface instance */
|
||||
bool lastwaswrite;
|
||||
uint32_t npages;
|
||||
uint16_t nsectors;
|
||||
uint16_t devid; /* SPI device ID to manage CS lines in board */
|
||||
uint8_t sectorshift;
|
||||
uint8_t pageshift;
|
||||
uint16_t nsectors;
|
||||
uint32_t npages;
|
||||
bool lastwaswrite;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
@ -315,7 +316,7 @@ static inline int sst26_readid(struct sst26_dev_s *priv)
|
||||
/* Lock the SPI bus, configure the bus, and select this FLASH part. */
|
||||
|
||||
sst26_lock(priv->dev);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send the "Read ID (RDID)" command and read the first three ID bytes */
|
||||
|
||||
@ -326,7 +327,7 @@ static inline int sst26_readid(struct sst26_dev_s *priv)
|
||||
|
||||
/* De-select the FLASH and unlock the bus */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
sst26_unlock(priv->dev);
|
||||
|
||||
sstinfo("manufacturer: %02x memory: %02x capacity: %02x\n",
|
||||
@ -387,7 +388,7 @@ static void sst26_waitwritecomplete(struct sst26_dev_s *priv)
|
||||
{
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Read Status Register (RDSR)" command */
|
||||
|
||||
@ -401,7 +402,7 @@ static void sst26_waitwritecomplete(struct sst26_dev_s *priv)
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
/* Given that writing could take up to few tens of milliseconds,
|
||||
* and erasing could take more. The following short delay in the
|
||||
@ -430,7 +431,7 @@ static void sst26_globalunlock(struct sst26_dev_s *priv)
|
||||
{
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Global Unlock (ULBPR)" command */
|
||||
|
||||
@ -438,7 +439,7 @@ static void sst26_globalunlock(struct sst26_dev_s *priv)
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sstinfo("Device unlocked.\n");
|
||||
}
|
||||
@ -451,7 +452,7 @@ static void sst26_writeenable(struct sst26_dev_s *priv)
|
||||
{
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Write Enable (WREN)" command */
|
||||
|
||||
@ -459,7 +460,7 @@ static void sst26_writeenable(struct sst26_dev_s *priv)
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sstinfo("Enabled\n");
|
||||
}
|
||||
@ -472,7 +473,7 @@ static void sst26_writedisable(struct sst26_dev_s *priv)
|
||||
{
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Write Disable (WRDI)" command */
|
||||
|
||||
@ -480,7 +481,7 @@ static void sst26_writedisable(struct sst26_dev_s *priv)
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sstinfo("Disabled\n");
|
||||
}
|
||||
@ -505,7 +506,7 @@ static void sst26_sectorerase(struct sst26_dev_s *priv,
|
||||
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send the "Sector Erase (SE)" or "Block Erase (BE)" instruction
|
||||
* that was passed in as the erase type.
|
||||
@ -524,7 +525,7 @@ static void sst26_sectorerase(struct sst26_dev_s *priv,
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sst26_waitwritecomplete(priv);
|
||||
|
||||
@ -545,7 +546,7 @@ static inline int sst26_chiperase(struct sst26_dev_s *priv)
|
||||
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send the "Chip Erase (CE)" instruction */
|
||||
|
||||
@ -553,7 +554,7 @@ static inline int sst26_chiperase(struct sst26_dev_s *priv)
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sst26_waitwritecomplete(priv);
|
||||
|
||||
@ -578,7 +579,7 @@ static inline void sst26_pagewrite(struct sst26_dev_s *priv,
|
||||
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Page Program (PP)" command */
|
||||
|
||||
@ -596,7 +597,7 @@ static inline void sst26_pagewrite(struct sst26_dev_s *priv,
|
||||
|
||||
/* Deselect the FLASH: Chip Select high */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sst26_waitwritecomplete(priv);
|
||||
|
||||
@ -620,7 +621,7 @@ static inline void sst26_bytewrite(struct sst26_dev_s *priv,
|
||||
|
||||
/* Select this FLASH part */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Page Program (PP)" command */
|
||||
|
||||
@ -639,7 +640,7 @@ static inline void sst26_bytewrite(struct sst26_dev_s *priv,
|
||||
|
||||
/* Deselect the FLASH: Chip Select high */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
sst26_waitwritecomplete(priv);
|
||||
|
||||
@ -751,7 +752,7 @@ static ssize_t sst26_read(FAR struct mtd_dev_s *dev,
|
||||
/* Lock the SPI bus and select this FLASH part */
|
||||
|
||||
sst26_lock(priv->dev);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), true);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), true);
|
||||
|
||||
/* Send "Read from Memory " instruction */
|
||||
|
||||
@ -773,7 +774,7 @@ static ssize_t sst26_read(FAR struct mtd_dev_s *dev,
|
||||
|
||||
/* Deselect the FLASH and unlock the SPI bus */
|
||||
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(priv->dev, SPIDEV_FLASH(priv->devid), false);
|
||||
sst26_unlock(priv->dev);
|
||||
sstinfo("return nbytes: %d\n", (int)nbytes);
|
||||
return nbytes;
|
||||
@ -947,7 +948,8 @@ static int sst26_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
FAR struct mtd_dev_s *sst26_initialize_spi(FAR struct spi_dev_s *dev)
|
||||
FAR struct mtd_dev_s *sst26_initialize_spi(FAR struct spi_dev_s *dev,
|
||||
uint16_t spi_devid)
|
||||
{
|
||||
FAR struct sst26_dev_s *priv;
|
||||
int ret;
|
||||
@ -978,10 +980,11 @@ FAR struct mtd_dev_s *sst26_initialize_spi(FAR struct spi_dev_s *dev)
|
||||
priv->mtd.ioctl = sst26_ioctl;
|
||||
priv->mtd.name = "sst26";
|
||||
priv->dev = dev;
|
||||
priv->devid = spi_devid;
|
||||
|
||||
/* Deselect the FLASH */
|
||||
|
||||
SPI_SELECT(dev, SPIDEV_FLASH(0), false);
|
||||
SPI_SELECT(dev, SPIDEV_FLASH(priv->devid), false);
|
||||
|
||||
/* Identify the FLASH chip and get its capacity */
|
||||
|
||||
|
@ -493,7 +493,8 @@ FAR struct mtd_dev_s *sst25xx_initialize(FAR struct spi_dev_s *dev);
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
FAR struct mtd_dev_s *sst26_initialize_spi(FAR struct spi_dev_s *dev);
|
||||
FAR struct mtd_dev_s *sst26_initialize_spi(FAR struct spi_dev_s *dev,
|
||||
uint16_t spi_devid);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: sst39vf_initialize
|
||||
|
Loading…
x
Reference in New Issue
Block a user