Răsfoiți Sursa

【添加】获取物理起始地址功能

Tennn11 4 ani în urmă
părinte
comite
6934b0431b
4 a modificat fișierele cu 43 adăugiri și 1 ștergeri
  1. 3 0
      inc/lpm.h
  2. 9 0
      src/lpm_dev.c
  3. 30 0
      src/lpm_dev_blk.c
  4. 1 1
      src/lpm_partition.c

+ 3 - 0
inc/lpm.h

@@ -37,6 +37,7 @@ struct lpm_dev /* 底层存储设备结构 */
     rt_uint32_t sector_count; /**< count of sectors */
     rt_uint32_t bytes_per_sector; /**< number of bytes per sector */
     rt_uint32_t block_size; /**< number of bytes to erase one block */
+    rt_uint32_t phy_start_addr; /**< physical start address */
     rt_slist_t dev_list;
     rt_slist_t part_list;
     void *mem_ptr;
@@ -48,6 +49,7 @@ struct lpm_dev_ops /* 操作接口,待定 */
     int (*erase)(struct lpm_dev *dev, uint32_t block_no, size_t num);
     int (*read)(struct lpm_dev *dev, uint32_t sector_no, uint8_t *buf, size_t size);
     int (*write)(struct lpm_dev *dev, uint32_t sector_no, const uint8_t *buf, size_t size);
+    int (*control)(struct lpm_dev *dev, int cmd, void *arg);
 };
 
 struct rt_lpm_device
@@ -92,6 +94,7 @@ int lpm_dev_read(struct lpm_dev *dev, uint32_t sector_no, uint8_t *buf, size_t s
 int lpm_dev_write(struct lpm_dev *dev, uint32_t sector_no, const uint8_t *buf, size_t size);
 int lpm_dev_erase(const struct lpm_dev *dev, uint32_t block_no, size_t num);
 int lpm_dev_erase_all(const struct lpm_dev *dev);
+int lpm_dev_control(struct lpm_dev *dev, int cmd, void *arg);
 
 /* 底层接口 */
 int lpm_dev_append(struct lpm_dev *dev);

+ 9 - 0
src/lpm_dev.c

@@ -114,3 +114,12 @@ int lpm_dev_erase_all(const struct lpm_dev *dev)
 {
     return RT_EOK;
 }
+
+int lpm_dev_control(struct lpm_dev *dev, int cmd, void *arg)
+{
+    RT_ASSERT(dev);
+    RT_ASSERT(dev->ops);
+    RT_ASSERT(dev->ops->control);
+    
+    return dev->ops->control(dev, cmd, arg);
+}

+ 30 - 0
src/lpm_dev_blk.c

@@ -12,6 +12,10 @@
 #include <string.h>
 #include "lpm.h"
 
+#ifndef RT_FIOGETXIPADDR
+    #define RT_FIOGETXIPADDR 0x52540001U
+#endif
+
 int lpm_blk_dev_init(struct lpm_dev *dev)
 {
     RT_ASSERT(dev);
@@ -48,6 +52,17 @@ int lpm_blk_dev_erase(struct lpm_dev *dev, uint32_t block_no, size_t num)
     return RT_EOK;
 }
 
+int lpm_blk_dev_control(struct lpm_dev *dev, int cmd, void *arg)
+{
+    rt_device_t device;
+    
+    RT_ASSERT(dev);
+    
+    device = ((struct rt_lpm_device*) dev)->rt_device;
+
+    return rt_device_control(device, cmd, arg);
+}
+
 extern struct lpm lpm;
 
 static struct lpm_dev_ops lpm_dev_ops = {
@@ -55,6 +70,7 @@ static struct lpm_dev_ops lpm_dev_ops = {
         .erase = lpm_blk_dev_erase,
         .read  = lpm_blk_dev_read,
         .write = lpm_blk_dev_write,
+        .control = lpm_blk_dev_control
 };
 
 int lpm_dev_blk_append(struct rt_device *dev)
@@ -62,6 +78,7 @@ int lpm_dev_blk_append(struct rt_device *dev)
     rt_err_t result;
     struct rt_device_blk_geometry geometry;
     struct lpm_dev *lpm_blk_dev;
+    uint32_t phy_start_addr;
 
     lpm_blk_dev = rt_malloc(sizeof(struct rt_lpm_device));
     if (lpm_blk_dev == RT_NULL)
@@ -87,6 +104,14 @@ int lpm_dev_blk_append(struct rt_device *dev)
         rt_kprintf("sector  size : %d byte\r\n", geometry.bytes_per_sector);
         rt_kprintf("sector count : %d \r\n",     geometry.sector_count);
         rt_kprintf("block   size : %d byte\r\n", geometry.block_size);
+
+        result = rt_device_control(dev, RT_FIOGETXIPADDR, &phy_start_addr);
+        if (result != RT_EOK)
+        {
+            rt_kprintf("device : cmd RT_FIOGETXIPADDR failed.\r\n");
+            return result;
+        }
+        rt_kprintf("block   addr : 0x%X \r\n", phy_start_addr);
     }
 
     rt_memset(lpm_blk_dev->name, 0, LPM_NAME_MAX);
@@ -95,6 +120,7 @@ int lpm_dev_blk_append(struct rt_device *dev)
     lpm_blk_dev->sector_count = geometry.sector_count;
     lpm_blk_dev->bytes_per_sector = geometry.bytes_per_sector;
     lpm_blk_dev->block_size = geometry.block_size;
+    lpm_blk_dev->phy_start_addr = phy_start_addr;
     lpm_blk_dev->dev_list.next = RT_NULL;
     lpm_blk_dev->part_list.next = RT_NULL;
     lpm_blk_dev->ops = &lpm_dev_ops;
@@ -164,6 +190,10 @@ static rt_err_t lpm_blk_control(rt_device_t dev, int cmd, void *args)
     {
         //todo
     }
+    else if (cmd == RT_FIOGETXIPADDR)
+    {
+        *(uint32_t *) args = ((struct lpm_partition*)(dev->user_data))->dev->phy_start_addr;
+    }
 
     return RT_EOK;
 }

+ 1 - 1
src/lpm_partition.c

@@ -673,7 +673,7 @@ int lpm_anonymity_create(const char *dev_name, uint32_t size, struct lpm_partiti
         return -RT_ERROR;
     }
 
-    rt_kprintf("offset size 0x %x\r\n",offset);
+    rt_kprintf("offset size 0x %x, %d\r\n",offset, size);
 
     lpm_par->name[0] = 0;
     lpm_par->dev = lpm_p;