mmcsd: support dump cid and csd with mmc-utils

Signed-off-by: wanggang26 <wanggang26@xiaomi.com>
This commit is contained in:
wanggang26
2023-09-21 09:59:09 +08:00
committed by Xiang Xiao
parent 707dd12090
commit db2f204cc4
6 changed files with 608 additions and 41 deletions
+4
View File
@@ -31,5 +31,9 @@ if(CONFIG_MMCSD)
list(APPEND SRCS mmcsd_spi.c mmcsd_debug.c) list(APPEND SRCS mmcsd_spi.c mmcsd_debug.c)
endif() endif()
if(CONFIG_MMCSD_PROCFS)
list(APPEND SRCS mmcsd_procfs.c)
endif()
target_sources(drivers PRIVATE ${SRCS}) target_sources(drivers PRIVATE ${SRCS})
endif() endif()
+7
View File
@@ -40,6 +40,13 @@ config MMCSD_NSLOTS
Number of MMC/SD slots supported by the Number of MMC/SD slots supported by the
driver. Default is one. driver. Default is one.
config MMCSD_PROCFS
bool "MMCSD proc fs support"
default n
depends on FS_PROCFS_REGISTER
---help---
Enable procfs for mmcsd.
config MMCSD_READONLY config MMCSD_READONLY
bool "Disable MMC/SD write access" bool "Disable MMC/SD write access"
default n default n
+4
View File
@@ -30,6 +30,10 @@ ifeq ($(CONFIG_MMCSD_SPI),y)
CSRCS += mmcsd_spi.c mmcsd_debug.c CSRCS += mmcsd_spi.c mmcsd_debug.c
endif endif
ifeq ($(CONFIG_MMCSD_PROCFS),y)
CSRCS += mmcsd_procfs.c
endif
# Include MMC/SD driver build support # Include MMC/SD driver build support
DEPPATH += --dep-path mmcsd DEPPATH += --dep-path mmcsd
+42
View File
@@ -26,6 +26,7 @@
****************************************************************************/ ****************************************************************************/
#include <nuttx/config.h> #include <nuttx/config.h>
#include <nuttx/sdio.h>
#include <stdint.h> #include <stdint.h>
#include <debug.h> #include <debug.h>
@@ -59,6 +60,43 @@
* Public Types * Public Types
****************************************************************************/ ****************************************************************************/
/* This structure is contains the unique state of the MMC/SD block driver */
struct mmcsd_state_s
{
FAR struct sdio_dev_s *dev; /* The SDIO device bound to this instance */
uint8_t crefs; /* Open references on the driver */
mutex_t lock; /* Assures mutually exclusive access to the slot */
/* Status flags */
uint8_t probed:1; /* true: mmcsd_probe() discovered a card */
uint8_t widebus:1; /* true: Wide 4-bit bus selected */
uint8_t mediachanged:1; /* true: Media changed since last check */
uint8_t wrbusy:1; /* true: Last transfer was a write, card may be busy */
uint8_t wrprotect:1; /* true: Card is write protected (from CSD) */
uint8_t locked:1; /* true: Media is locked (from R1) */
uint8_t dsrimp:1; /* true: card supports CMD4/DSR setting (from CSD) */
#ifdef CONFIG_SDIO_DMA
uint8_t dma:1; /* true: hardware supports DMA */
#endif
uint8_t mode:2; /* (See MMCSDMODE_* definitions) */
uint8_t type:4; /* Card type (See MMCSD_CARDTYPE_* definitions) */
uint8_t buswidth:4; /* Bus widths supported (SD only) */
sdio_capset_t caps; /* SDIO driver capabilities/limitations */
uint32_t cid[4]; /* CID register */
uint32_t csd[4]; /* CSD register */
uint16_t selblocklen; /* The currently selected block length */
uint16_t rca; /* Relative Card Address (RCS) register */
/* Memory card geometry (extracted from the CSD) */
uint8_t blockshift; /* Log2 of blocksize */
uint16_t blocksize; /* Read block length (== block size) */
uint32_t nblocks; /* Number of blocks */
};
/**************************************************************************** /****************************************************************************
* Public Functions Definitions * Public Functions Definitions
****************************************************************************/ ****************************************************************************/
@@ -72,6 +110,10 @@ extern "C"
#define EXTERN extern #define EXTERN extern
#endif #endif
#ifdef CONFIG_MMCSD_PROCFS
void mmcsd_initialize_procfs(void);
#endif
#ifdef CONFIG_MMCSD_DUMPALL #ifdef CONFIG_MMCSD_DUMPALL
# define mmcsd_dumpbuffer(m,b,l) finfodumpbuffer(m,b,l) # define mmcsd_dumpbuffer(m,b,l) finfodumpbuffer(m,b,l)
#else #else
File diff suppressed because it is too large Load Diff
+8 -41
View File
@@ -102,41 +102,6 @@
* Private Types * Private Types
****************************************************************************/ ****************************************************************************/
/* This structure is contains the unique state of the MMC/SD block driver */
struct mmcsd_state_s
{
FAR struct sdio_dev_s *dev; /* The SDIO device bound to this instance */
uint8_t crefs; /* Open references on the driver */
mutex_t lock; /* Assures mutually exclusive access to the slot */
/* Status flags */
uint8_t probed:1; /* true: mmcsd_probe() discovered a card */
uint8_t widebus:1; /* true: Wide 4-bit bus selected */
uint8_t mediachanged:1; /* true: Media changed since last check */
uint8_t wrbusy:1; /* true: Last transfer was a write, card may be busy */
uint8_t wrprotect:1; /* true: Card is write protected (from CSD) */
uint8_t locked:1; /* true: Media is locked (from R1) */
uint8_t dsrimp:1; /* true: card supports CMD4/DSR setting (from CSD) */
#ifdef CONFIG_SDIO_DMA
uint8_t dma:1; /* true: hardware supports DMA */
#endif
uint8_t mode:2; /* (See MMCSDMODE_* definitions) */
uint8_t type:4; /* Card type (See MMCSD_CARDTYPE_* definitions) */
uint8_t buswidth:4; /* Bus widths supported (SD only) */
sdio_capset_t caps; /* SDIO driver capabilities/limitations */
uint16_t selblocklen; /* The currently selected block length */
uint16_t rca; /* Relative Card Address (RCS) register */
/* Memory card geometry (extracted from the CSD) */
uint8_t blockshift; /* Log2 of blocksize */
uint16_t blocksize; /* Read block length (== block size) */
uint32_t nblocks; /* Number of blocks */
};
/**************************************************************************** /****************************************************************************
* Private Function Prototypes * Private Function Prototypes
****************************************************************************/ ****************************************************************************/
@@ -2639,8 +2604,6 @@ static int mmcsd_widebus(FAR struct mmcsd_state_s *priv)
#ifdef CONFIG_MMCSD_MMCSUPPORT #ifdef CONFIG_MMCSD_MMCSUPPORT
static int mmcsd_mmcinitialize(FAR struct mmcsd_state_s *priv) static int mmcsd_mmcinitialize(FAR struct mmcsd_state_s *priv)
{ {
uint32_t cid[4];
uint32_t csd[4];
int ret; int ret;
/* At this point, slow, ID mode clocking has been supplied to the card /* At this point, slow, ID mode clocking has been supplied to the card
@@ -2659,7 +2622,7 @@ static int mmcsd_mmcinitialize(FAR struct mmcsd_state_s *priv)
finfo("Initialising MMC card.\n"); finfo("Initialising MMC card.\n");
mmcsd_sendcmdpoll(priv, MMCSD_CMD2, 0); mmcsd_sendcmdpoll(priv, MMCSD_CMD2, 0);
ret = SDIO_RECVR2(priv->dev, MMCSD_CMD2, cid); ret = SDIO_RECVR2(priv->dev, MMCSD_CMD2, priv->cid);
if (ret != OK) if (ret != OK)
{ {
ferr("ERROR: SDIO_RECVR2 for MMC CID failed: %d\n", ret); ferr("ERROR: SDIO_RECVR2 for MMC CID failed: %d\n", ret);
@@ -2711,7 +2674,7 @@ static int mmcsd_mmcinitialize(FAR struct mmcsd_state_s *priv)
*/ */
mmcsd_sendcmdpoll(priv, MMCSD_CMD9, (uint32_t)priv->rca << 16); mmcsd_sendcmdpoll(priv, MMCSD_CMD9, (uint32_t)priv->rca << 16);
ret = SDIO_RECVR2(priv->dev, MMCSD_CMD9, csd); ret = SDIO_RECVR2(priv->dev, MMCSD_CMD9, priv->csd);
if (ret != OK) if (ret != OK)
{ {
ferr("ERROR: Could not get SD CSD register: %d\n", ret); ferr("ERROR: Could not get SD CSD register: %d\n", ret);
@@ -2723,7 +2686,7 @@ static int mmcsd_mmcinitialize(FAR struct mmcsd_state_s *priv)
* ext_csd commands. * ext_csd commands.
*/ */
mmcsd_decode_csd(priv, csd); mmcsd_decode_csd(priv, priv->csd);
/* Set the Driver Stage Register (DSR) if (1) a CONFIG_MMCSD_DSR has been /* Set the Driver Stage Register (DSR) if (1) a CONFIG_MMCSD_DSR has been
* provided and (2) the card supports a DSR register. If no DSR value * provided and (2) the card supports a DSR register. If no DSR value
@@ -2781,7 +2744,7 @@ static int mmcsd_mmcinitialize(FAR struct mmcsd_state_s *priv)
} }
} }
mmcsd_decode_csd(priv, csd); mmcsd_decode_csd(priv, priv->csd);
/* It's up to the driver to act on the widebus request. mmcsd_widebus() /* It's up to the driver to act on the widebus request. mmcsd_widebus()
* enables the CLOCK_MMC_TRANSFER, so call it here always. * enables the CLOCK_MMC_TRANSFER, so call it here always.
@@ -4201,6 +4164,10 @@ int mmcsd_slotinitialize(int minor, FAR struct sdio_dev_s *dev)
goto errout_with_hwinit; goto errout_with_hwinit;
} }
#ifdef CONFIG_MMCSD_PROCFS
mmcsd_initialize_procfs();
#endif
return OK; return OK;
errout_with_hwinit: errout_with_hwinit: