lpm.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020.12.11 wanghaijing first version
  9. */
  10. #include <rtthread.h>
  11. #define LPM_NAME_MAX 8
  12. #define LPM_SUPER_BLK_NUM (1024 * 8) // 8K
  13. #define LPM_VER "V0.1.2"
  14. struct lpm
  15. {
  16. rt_slist_t device_list; /* 物理设备链表 */
  17. };
  18. /* 分区数据结构 */
  19. struct lpm_partition /* 分区结构 */
  20. {
  21. char name[LPM_NAME_MAX];
  22. uint32_t size; //分配了多少个block
  23. uint32_t offset; //相对于存储设备是第几个block
  24. rt_slist_t list;
  25. struct lpm_dev *dev; /* 所属存储设备 */
  26. };
  27. /* 物理存储设备数据结构*/
  28. /* 支持三种底层存储设备,RTT Block 设备、MTD Nand 设备、通用存储设备:struct lpm_dev */
  29. struct lpm_dev /* 底层存储设备结构 */
  30. {
  31. char name[LPM_NAME_MAX];
  32. rt_uint32_t sector_count; /**< count of sectors */
  33. rt_uint32_t bytes_per_sector; /**< number of bytes per sector */
  34. rt_uint32_t block_size; /**< number of bytes to erase one block */
  35. rt_uint32_t phy_start_addr; /**< physical start address */
  36. rt_slist_t dev_list;
  37. rt_slist_t part_list;
  38. void *mem_ptr;
  39. struct lpm_dev_ops *ops;
  40. };
  41. struct lpm_dev_ops /* 操作接口,待定 */
  42. {
  43. int (*init)(struct lpm_dev *dev);
  44. int (*erase)(struct lpm_dev *dev, uint32_t block_no, size_t num);
  45. int (*read)(struct lpm_dev *dev, uint32_t sector_no, uint8_t *buf, size_t size);
  46. int (*write)(struct lpm_dev *dev, uint32_t sector_no, const uint8_t *buf, size_t size);
  47. int (*control)(struct lpm_dev *dev, int cmd, void *arg);
  48. };
  49. struct rt_lpm_device
  50. {
  51. struct lpm_dev lpm_dev;
  52. rt_device_t rt_device;
  53. };
  54. /* 初始化 */
  55. int lpm_init(void);
  56. /* 创建分区,最大创建 4G 的分区大小 */
  57. struct lpm_partition *lpm_partition_create(const char *dev_name, const char *name, uint32_t size);
  58. int lpm_partition_delete(const char *dev_name, const char *name);
  59. int lpm_partition_delete_all(const char *dev_name);
  60. /* 创建匿名分区 */
  61. int lpm_anonymity_create(const char *dev_name, uint32_t size, struct lpm_partition *lpm);
  62. /* 删除匿名分区 */
  63. int lpm_anonymity_delete(struct lpm_partition *lpm_par);
  64. /* >4G 寻址空间,blk 的概念更清晰 */
  65. struct lpm_partition * lpm_partition_find(const char *dev_name, const char *name);
  66. int lpm_partition_read(const struct lpm_partition *part, uint32_t sector_no, uint8_t *buf, size_t size);
  67. int lpm_partition_write(const struct lpm_partition *part, uint32_t sector_no, const uint8_t *buf, size_t size);
  68. int lpm_partition_erase(const struct lpm_partition *part, uint32_t block_no, size_t num);
  69. int lpm_partition_erase_all(const struct lpm_partition *part);
  70. int lpm_partition_delete_self(const struct lpm_partition *part);
  71. /* 将分区注册为块设备 */
  72. struct rt_device *lpm_blk_device_create(const char *dev_name, const char *parition_name);
  73. /* info */
  74. int lpm_dump_partition(void);
  75. int lpm_dump_dev(void);
  76. char* lpm_get_version(struct lpm_dev *dev);
  77. uint32_t lpm_partition_get_addr(const struct lpm_partition *part);
  78. uint32_t lpm_free(const char *dev_name);
  79. /* >4G 寻址空间,blk 的概念更清晰 */
  80. struct lpm_dev *lpm_dev_find(const char *dev_name);
  81. int lpm_dev_read(struct lpm_dev *dev, uint32_t sector_no, uint8_t *buf, size_t size);
  82. int lpm_dev_write(struct lpm_dev *dev, uint32_t sector_no, const uint8_t *buf, size_t size);
  83. int lpm_dev_erase(const struct lpm_dev *dev, uint32_t block_no, size_t num);
  84. int lpm_dev_erase_all(const struct lpm_dev *dev);
  85. int lpm_dev_control(struct lpm_dev *dev, int cmd, void *arg);
  86. /* 底层接口 */
  87. int lpm_dev_append(struct lpm_dev *dev);
  88. int lpm_dev_blk_append(struct rt_device *dev);
  89. int lpm_dev_nand_append(struct rt_device *dev);
  90. int lpm_part_info_load(struct lpm_dev *dev, rt_bool_t recovery);
  91. int lpm_part_info_save(struct lpm_dev *dev);
  92. uint8_t lpm_part_super_page_get(void);
  93. uint32_t lpm_part_alloc(struct lpm_dev *dev, size_t size,uint8_t flag);
  94. int lpm_part_free(struct lpm_dev *dev, uint32_t addr);