Replace CONFIG_MTD_SMART in MTD drivers with other conditions

This commit is contained in:
Gregory Nutt 2013-05-03 14:32:08 -06:00
parent 72179b7773
commit 8757465df2
4 changed files with 47 additions and 40 deletions

View File

@ -416,6 +416,7 @@ CONFIG_MTD_M25P=y
CONFIG_M25P_SPIMODE=0 CONFIG_M25P_SPIMODE=0
CONFIG_M25P_MANUFACTURER=0x1C CONFIG_M25P_MANUFACTURER=0x1C
CONFIG_M25P_MEMORY_TYPE=0x31 CONFIG_M25P_MEMORY_TYPE=0x31
CONFIG_M25P_SUBSECTOR_ERASE=y
CONFIG_MTD_SMART=y CONFIG_MTD_SMART=y
CONFIG_MTD_SMART_SECTOR_SIZE=512 CONFIG_MTD_SMART_SECTOR_SIZE=512
# CONFIG_MTD_RAMTRON is not set # CONFIG_MTD_RAMTRON is not set

View File

@ -135,6 +135,14 @@ config M25P_MEMORY_TYPE
memory type for "F" series parts from EON is 0x31. The 4K sector erase size will memory type for "F" series parts from EON is 0x31. The 4K sector erase size will
automatically be enabled when filessytems that can use it are enabled, such as SMART. automatically be enabled when filessytems that can use it are enabled, such as SMART.
config M25P_SUBSECTOR_ERASE
bool "Sub-Sector Erase"
default n
---help---
Some devices (such as the EON EN25F80) support a smaller erase block
size (4K vs 64K). This option enables support for sub-sector erase.
The SMART file system can take advantage of this option if it is enabled.
endif endif
config MTD_SMART config MTD_SMART

View File

@ -204,7 +204,7 @@ struct m25p_dev_s
uint8_t pageshift; /* 8 */ uint8_t pageshift; /* 8 */
uint16_t nsectors; /* 128 or 64 */ uint16_t nsectors; /* 128 or 64 */
uint32_t npages; /* 32,768 or 65,536 */ uint32_t npages; /* 32,768 or 65,536 */
#ifdef CONFIG_MTD_SMART #ifdef CONFIG_M25P_SUBSECTOR_ERASE
uint8_t subsectorshift; /* 0, 12 or 13 (4K or 8K) */ uint8_t subsectorshift; /* 0, 12 or 13 (4K or 8K) */
#endif #endif
}; };
@ -322,7 +322,7 @@ static inline int m25p_readid(struct m25p_dev_s *priv)
{ {
/* Okay.. is it a FLASH capacity that we understand? */ /* Okay.. is it a FLASH capacity that we understand? */
#ifdef CONFIG_MTD_SMART #ifdef CONFIG_M25P_SUBSECTOR_ERASE
priv->subsectorshift = 0; priv->subsectorshift = 0;
#endif #endif
@ -344,7 +344,7 @@ static inline int m25p_readid(struct m25p_dev_s *priv)
priv->npages = M25P_EN25F80_NPAGES; priv->npages = M25P_EN25F80_NPAGES;
priv->sectorshift = M25P_EN25F80_SECTOR_SHIFT; priv->sectorshift = M25P_EN25F80_SECTOR_SHIFT;
priv->nsectors = M25P_EN25F80_NSECTORS; priv->nsectors = M25P_EN25F80_NSECTORS;
#ifdef CONFIG_MTD_SMART #ifdef CONFIG_M25P_SUBSECTOR_ERASE
priv->subsectorshift = M25P_EN25F80_SUBSECT_SHIFT; priv->subsectorshift = M25P_EN25F80_SUBSECT_SHIFT;
#endif #endif
return OK; return OK;
@ -486,7 +486,7 @@ static void m25p_sectorerase(struct m25p_dev_s *priv, off_t sector, uint8_t type
{ {
off_t offset; off_t offset;
#ifdef CONFIG_MTD_SMART #ifdef CONFIG_M25P_SUBSECTOR_ERASE
if (priv->subsectorshift > 0) if (priv->subsectorshift > 0)
{ {
offset = sector << priv->subsectorshift; offset = sector << priv->subsectorshift;
@ -681,7 +681,7 @@ static int m25p_erase(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblock
m25p_lock(priv->dev); m25p_lock(priv->dev);
while (blocksleft > 0) while (blocksleft > 0)
{ {
#ifdef CONFIG_MTD_SMART #ifdef CONFIG_M25P_SUBSECTOR_ERASE
size_t sectorboundry; size_t sectorboundry;
size_t blkper; size_t blkper;
@ -928,7 +928,7 @@ static int m25p_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg)
*/ */
geo->blocksize = (1 << priv->pageshift); geo->blocksize = (1 << priv->pageshift);
#ifdef CONFIG_MTD_SMART #ifdef CONFIG_M25P_SUBSECTOR_ERASE
if (priv->subsectorshift > 0) if (priv->subsectorshift > 0)
{ {
geo->erasesize = (1 << priv->subsectorshift); geo->erasesize = (1 << priv->subsectorshift);

View File

@ -121,6 +121,12 @@ static ssize_t ram_bread(FAR struct mtd_dev_s *dev, off_t startblock, size_t nbl
FAR uint8_t *buf); FAR uint8_t *buf);
static ssize_t ram_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks, static ssize_t ram_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks,
FAR const uint8_t *buf); FAR const uint8_t *buf);
static ssize_t ram_byteread(FAR struct mtd_dev_s *dev, off_t offset,
size_t nbytes, FAR uint8_t *buf);
#ifdef CONFIG_MTD_BYTE_WRITE
static ssize_t ram_bytewrite(FAR struct mtd_dev_s *dev, off_t offset,
size_t nbytes, FAR const uint8_t *buf);
#endif
static int ram_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg); static int ram_ioctl(FAR struct mtd_dev_s *dev, int cmd, unsigned long arg);
/**************************************************************************** /****************************************************************************
@ -160,7 +166,7 @@ static void *ram_write(FAR void *dest, FAR const void *src, size_t len)
#endif #endif
/* Report any attempt to change the value of bits that are not in the /* Report any attempt to change the value of bits that are not in the
* erased state. * erased state.
*/ */
#ifdef CONFIG_DEBUG #ifdef CONFIG_DEBUG
@ -224,30 +230,6 @@ static int ram_erase(FAR struct mtd_dev_s *dev, off_t startblock, size_t nblocks
return OK; return OK;
} }
/****************************************************************************
* Name: ram_readbytes
****************************************************************************/
#ifdef CONFIG_MTD_SMART
static ssize_t ram_read_bytes(FAR struct mtd_dev_s *dev, off_t offset,
size_t nbytes, FAR uint8_t *buf)
{
FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
DEBUGASSERT(dev && buf);
/* Don't let read read past end of buffer */
if (offset + nbytes > priv->nblocks * CONFIG_RAMMTD_ERASESIZE)
{
return 0;
}
ram_read(buf, &priv->start[offset], nbytes);
return nbytes;
}
#endif
/**************************************************************************** /****************************************************************************
* Name: ram_bread * Name: ram_bread
****************************************************************************/ ****************************************************************************/
@ -328,13 +310,35 @@ static ssize_t ram_bwrite(FAR struct mtd_dev_s *dev, off_t startblock,
return nblocks; return nblocks;
} }
/****************************************************************************
* Name: ram_byteread
****************************************************************************/
static ssize_t ram_byteread(FAR struct mtd_dev_s *dev, off_t offset,
size_t nbytes, FAR uint8_t *buf)
{
FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
DEBUGASSERT(dev && buf);
/* Don't let read read past end of buffer */
if (offset + nbytes > priv->nblocks * CONFIG_RAMMTD_ERASESIZE)
{
return 0;
}
ram_read(buf, &priv->start[offset], nbytes);
return nbytes;
}
/**************************************************************************** /****************************************************************************
* Name: ram_bytewrite * Name: ram_bytewrite
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_MTD_BYTE_WRITE #ifdef CONFIG_MTD_BYTE_WRITE
static ssize_t ram_bytewrite(FAR struct mtd_dev_s *dev, off_t offset, static ssize_t ram_bytewrite(FAR struct mtd_dev_s *dev, off_t offset,
size_t nbytes, FAR const uint8_t *buf) size_t nbytes, FAR const uint8_t *buf)
{ {
FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev; FAR struct ram_dev_s *priv = (FAR struct ram_dev_s *)dev;
off_t maxaddr; off_t maxaddr;
@ -462,17 +466,11 @@ FAR struct mtd_dev_s *rammtd_initialize(FAR uint8_t *start, size_t size)
priv->mtd.erase = ram_erase; priv->mtd.erase = ram_erase;
priv->mtd.bread = ram_bread; priv->mtd.bread = ram_bread;
priv->mtd.bwrite = ram_bwrite; priv->mtd.bwrite = ram_bwrite;
priv->mtd.ioctl = ram_ioctl; priv->mtd.read = ram_byteread;
priv->mtd.erase = ram_erase;
#ifdef CONFIG_MTD_BYTE_WRITE #ifdef CONFIG_MTD_BYTE_WRITE
priv->mtd.write = ram_bytewrite; priv->mtd.write = ram_bytewrite;
#endif #endif
priv->mtd.ioctl = ram_ioctl;
#ifdef CONFIG_MTD_SMART
priv->mtd.read = ram_read_bytes;
#else
priv->mtd.read = NULL;
#endif
priv->start = start; priv->start = start;
priv->nblocks = nblocks; priv->nblocks = nblocks;