This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new ecc2d473e3 mmcsd: add multi partitions prototype implementation
ecc2d473e3 is described below

commit ecc2d473e3c9c0fdceca8918c09eca2fd5fead19
Author: wanggang26 <[email protected]>
AuthorDate: Tue Oct 17 18:47:29 2023 +0800

    mmcsd: add multi partitions prototype implementation
    
    Signed-off-by: wanggang26 <[email protected]>
---
 drivers/mmcsd/mmcsd.h        |  8 ++++++-
 drivers/mmcsd/mmcsd_procfs.c |  4 +++-
 drivers/mmcsd/mmcsd_sdio.c   | 53 +++++++++++++++++++++++++++++---------------
 3 files changed, 45 insertions(+), 20 deletions(-)

diff --git a/drivers/mmcsd/mmcsd.h b/drivers/mmcsd/mmcsd.h
index a2c17af0c1..1f374af86e 100644
--- a/drivers/mmcsd/mmcsd.h
+++ b/drivers/mmcsd/mmcsd.h
@@ -60,6 +60,12 @@
  * Public Types
  ****************************************************************************/
 
+struct mmcsd_part_s
+{
+  FAR struct mmcsd_state_s *priv;
+  uint32_t nblocks; /* Number of blocks */
+};
+
 /* This structure is contains the unique state of the MMC/SD block driver */
 
 struct mmcsd_state_s
@@ -68,6 +74,7 @@ struct mmcsd_state_s
   uint8_t  crefs;                  /* Open references on the driver */
   mutex_t  lock;                   /* Assures mutually exclusive access to the 
slot */
   int      minor;                  /* Device number */
+  struct mmcsd_part_s part;        /* Partition data */
 
   /* Status flags */
 
@@ -96,7 +103,6 @@ struct mmcsd_state_s
 
   uint8_t  blockshift;             /* Log2 of blocksize */
   uint16_t blocksize;              /* Read block length (== block size) */
-  uint32_t nblocks;                /* Number of blocks */
 };
 
 /****************************************************************************
diff --git a/drivers/mmcsd/mmcsd_procfs.c b/drivers/mmcsd/mmcsd_procfs.c
index 82256a727d..6cb811b34e 100644
--- a/drivers/mmcsd/mmcsd_procfs.c
+++ b/drivers/mmcsd/mmcsd_procfs.c
@@ -334,6 +334,7 @@ static ssize_t mmcsd_read(FAR struct file *filep, FAR char 
*buffer,
 {
   FAR struct mmcsd_file_s *mmcsdfile = filep->f_priv;
   FAR struct inode *inode;
+  FAR struct mmcsd_part_s *part;
   char path[32];
   ssize_t ret;
 
@@ -345,7 +346,8 @@ static ssize_t mmcsd_read(FAR struct file *filep, FAR char 
*buffer,
     }
 
   DEBUGASSERT(filep->f_priv);
-  ret = mmcsdfile->read(filep, buffer, buflen, inode->i_private);
+  part = inode->i_private;
+  ret = mmcsdfile->read(filep, buffer, buflen, part->priv);
   close_blockdriver(inode);
 
   return ret;
diff --git a/drivers/mmcsd/mmcsd_sdio.c b/drivers/mmcsd/mmcsd_sdio.c
index f66e7f2584..56ae717bae 100644
--- a/drivers/mmcsd/mmcsd_sdio.c
+++ b/drivers/mmcsd/mmcsd_sdio.c
@@ -689,7 +689,7 @@ static void mmcsd_decode_csd(FAR struct mmcsd_state_s 
*priv, uint32_t csd[4])
 
           priv->blockshift      = 9;
           priv->blocksize       = 1 << 9;
-          priv->nblocks         = (csize + 1) << (19 - priv->blockshift);
+          priv->part.nblocks    = (csize + 1) << (19 - priv->blockshift);
 
 #ifdef CONFIG_DEBUG_FS_INFO
           decoded.u.sdblock.csize        = csize;
@@ -710,7 +710,7 @@ static void mmcsd_decode_csd(FAR struct mmcsd_state_s 
*priv, uint32_t csd[4])
                                   ((csd[2] >> 30) & 3);
       uint8_t  csizemult        = (csd[2] >> 15) & 7;
 
-      priv->nblocks             = ((uint32_t)csize + 1) *
+      priv->part.nblocks        = ((uint32_t)csize + 1) *
                                   (1 << (csizemult + 2));
       priv->blockshift          = readbllen;
       priv->blocksize           = (1 << readbllen);
@@ -725,7 +725,7 @@ static void mmcsd_decode_csd(FAR struct mmcsd_state_s 
*priv, uint32_t csd[4])
 
       if (priv->blocksize > 512)
         {
-          priv->nblocks       <<= (priv->blockshift - 9);
+          priv->part.nblocks  <<= (priv->blockshift - 9);
           priv->blocksize       = 512;
           priv->blockshift      = 9;
         }
@@ -882,8 +882,8 @@ static void mmcsd_decode_csd(FAR struct mmcsd_state_s 
*priv, uint32_t csd[4])
         decoded.fileformat, decoded.mmcecc, decoded.crc);
 
   finfo("Capacity: %luKb, Block size: %db, nblocks: %d wrprotect: %d\n",
-        (unsigned long)MMCSD_CAPACITY(priv->nblocks, priv->blockshift),
-        priv->blocksize, priv->nblocks, priv->wrprotect);
+        (unsigned long)MMCSD_CAPACITY(priv->part.nblocks, priv->blockshift),
+        priv->blocksize, priv->part.nblocks, priv->wrprotect);
 #endif
 }
 
@@ -2161,11 +2161,13 @@ static ssize_t mmcsd_writemultiple(FAR struct 
mmcsd_state_s *priv,
 static int mmcsd_open(FAR struct inode *inode)
 {
   FAR struct mmcsd_state_s *priv;
+  FAR struct mmcsd_part_s *part;
   int ret;
 
   finfo("Entry\n");
   DEBUGASSERT(inode->i_private);
-  priv = inode->i_private;
+  part = inode->i_private;
+  priv = part->priv;
 
   /* Just increment the reference count on the driver */
 
@@ -2192,11 +2194,13 @@ static int mmcsd_open(FAR struct inode *inode)
 static int mmcsd_close(FAR struct inode *inode)
 {
   FAR struct mmcsd_state_s *priv;
+  FAR struct mmcsd_part_s *part;
   int ret;
 
   finfo("Entry\n");
   DEBUGASSERT(inode->i_private);
-  priv = inode->i_private;
+  part = inode->i_private;
+  priv = part->priv;
 
   /* Decrement the reference count on the block driver */
 
@@ -2225,13 +2229,16 @@ static ssize_t mmcsd_read(FAR struct inode *inode, 
unsigned char *buffer,
                           blkcnt_t startsector, unsigned int nsectors)
 {
   FAR struct mmcsd_state_s *priv;
+  FAR struct mmcsd_part_s *part;
   size_t sector;
   size_t endsector;
   ssize_t nread;
   ssize_t ret = nsectors;
 
   DEBUGASSERT(inode->i_private);
-  priv = inode->i_private;
+  part = inode->i_private;
+  priv = part->priv;
+
   finfo("startsector: %" PRIuOFF " nsectors: %u sectorsize: %d\n",
         startsector, nsectors, priv->blocksize);
 
@@ -2303,13 +2310,16 @@ static ssize_t mmcsd_write(FAR struct inode *inode,
                            blkcnt_t startsector, unsigned int nsectors)
 {
   FAR struct mmcsd_state_s *priv;
+  FAR struct mmcsd_part_s *part;
   size_t sector;
   size_t endsector;
   ssize_t nwrite;
   ssize_t ret = nsectors;
 
   DEBUGASSERT(inode->i_private);
-  priv = inode->i_private;
+  part = inode->i_private;
+  priv = part->priv;
+
   finfo("startsector: %" PRIuOFF " nsectors: %u sectorsize: %d\n",
         startsector, nsectors, priv->blocksize);
 
@@ -2377,6 +2387,7 @@ static ssize_t mmcsd_write(FAR struct inode *inode,
 static int mmcsd_geometry(FAR struct inode *inode, struct geometry *geometry)
 {
   FAR struct mmcsd_state_s *priv;
+  FAR struct mmcsd_part_s *part;
   int ret = -EINVAL;
 
   finfo("Entry\n");
@@ -2388,7 +2399,9 @@ static int mmcsd_geometry(FAR struct inode *inode, struct 
geometry *geometry)
 
       /* Is there a (supported) card inserted in the slot? */
 
-      priv = inode->i_private;
+      part = inode->i_private;
+      priv = part->priv;
+
       ret = mmcsd_lock(priv);
       if (ret < 0)
         {
@@ -2409,7 +2422,7 @@ static int mmcsd_geometry(FAR struct inode *inode, struct 
geometry *geometry)
           geometry->geo_available     = true;
           geometry->geo_mediachanged  = priv->mediachanged;
           geometry->geo_writeenabled  = !mmcsd_wrprotected(priv);
-          geometry->geo_nsectors      = priv->nblocks;
+          geometry->geo_nsectors      = part->nblocks;
           geometry->geo_sectorsize    = priv->blocksize;
 
           finfo("available: true mediachanged: %s writeenabled: %s\n",
@@ -2439,11 +2452,13 @@ static int mmcsd_geometry(FAR struct inode *inode, 
struct geometry *geometry)
 static int mmcsd_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
 {
   FAR struct mmcsd_state_s *priv;
+  FAR struct mmcsd_part_s *part;
   int ret;
 
   finfo("Entry\n");
   DEBUGASSERT(inode->i_private);
-  priv = inode->i_private;
+  part = inode->i_private;
+  priv = part->priv;
 
   /* Process the IOCTL by command */
 
@@ -3042,11 +3057,11 @@ static int mmcsd_read_extcsd(FAR struct mmcsd_state_s 
*priv,
       return ret;
     }
 
-  priv->nblocks = (extcsd[215] << 24) | (extcsd[214] << 16) |
-                  (extcsd[213] << 8) | extcsd[212];
+  priv->part.nblocks = (extcsd[215] << 24) | (extcsd[214] << 16) |
+                       (extcsd[213] << 8) | extcsd[212];
 
   finfo("MMC ext CSD read succsesfully, number of block %" PRId32 "\n",
-        priv->nblocks);
+        priv->part.nblocks);
 
   SDIO_GOTEXTCSD(priv->dev, extcsd);
 
@@ -4071,7 +4086,8 @@ static int mmcsd_probe(FAR struct mmcsd_state_s *priv)
               /* Yes...  */
 
               finfo("Capacity: %" PRIu32 " Kbytes\n",
-                    MMCSD_CAPACITY(priv->nblocks, priv->blockshift));
+                    MMCSD_CAPACITY(priv->part.nblocks,
+                                   priv->blockshift));
               priv->mediachanged = true;
             }
 
@@ -4081,11 +4097,12 @@ static int mmcsd_probe(FAR struct mmcsd_state_s *priv)
 
           /* Create a MMCSD device name */
 
+          priv->part.priv = priv;
           snprintf(devname, sizeof(devname), "/dev/mmcsd%d", priv->minor);
 
           /* Inode private data is a reference to the MMCSD state structure */
 
-          register_blockdriver(devname, &g_bops, 0666, priv);
+          register_blockdriver(devname, &g_bops, 0666, &priv->part);
         }
 
       /* Regardless of whether or not a card was successfully initialized,
@@ -4366,7 +4383,7 @@ int mmcsd_slotinitialize(int minor, FAR struct sdio_dev_s 
*dev)
   snprintf(devname, sizeof(devname), "/dev/mmcsd%d", minor);
 
   finfo("MMC: %s %" PRIu64 "KB %s %s mode\n", devname,
-         ((uint64_t)priv->nblocks << priv->blockshift) >> 10,
+         ((uint64_t)priv->part.nblocks << priv->blockshift) >> 10,
          priv->widebus ? "4-bits" : "1-bit",
          mmc_get_mode_name(priv->mode));
 

Reply via email to