1 #ifndef __BLKPART_H__ 2 #define __BLKPART_H__ 3 4 #include <sys/types.h> 5 #include <stdint.h> 6 #include <rtthread.h> 7 8 #include <log.h> 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 #ifdef SECTOR_SIZE 15 #undef SECTOR_SIZE 16 #endif 17 #define SECTOR_SHIFT 9 18 #define SECTOR_SIZE (1 << SECTOR_SHIFT) 19 20 typedef enum 21 { 22 STORAGE_NAND =0, 23 STORAGE_SDC0, 24 STORAGE_SDC1, 25 STORAGE_NOR, 26 STORAGE_SDC2, 27 STORAGE_SPI_NAND, 28 }SUNXI_BOOT_STORAGE; 29 30 31 struct part 32 { 33 /* public */ 34 #define BLKPART_OFF_APPEND UINT32_MAX 35 uint64_t off; 36 #define BLKPART_SIZ_FULL UINT32_MAX 37 uint64_t bytes; 38 #define MAX_BLKNAME_LEN 16 39 char name[MAX_BLKNAME_LEN]; /* name: UDISK */ 40 41 /* private */ 42 char devname[MAX_BLKNAME_LEN]; /* name: nor0p1 */ 43 struct blkpart *blk; 44 uint32_t n_part; 45 uint32_t erase_flag; 46 }; 47 48 struct blkpart 49 { 50 /* public */ 51 const char *name; 52 uint64_t total_bytes; 53 uint32_t blk_bytes; 54 uint32_t page_bytes; 55 int (*erase)(unsigned int, unsigned int); 56 int (*program)(unsigned int, char *, unsigned int); 57 int (*read)(unsigned int, char *, unsigned int); 58 59 /* if no any partition, the follow can be NULL */ 60 struct part *parts; 61 uint32_t n_parts; 62 63 /* private */ 64 int blk_cnt; 65 struct part root; 66 struct blkpart *next; 67 uint32_t n_blk; 68 rt_device_t dev; 69 }; 70 71 typedef enum BLOCK_DEVICE_CMD_T 72 { 73 BLOCK_DEVICE_CMD_ERASE_ALL = 0x00, 74 BLOCK_DEVICE_CMD_ERASE_SECTOR, 75 BLOCK_DEVICE_CMD_GET_TOTAL_SIZE, 76 BLOCK_DEVICE_CMD_GET_PAGE_SIZE, 77 BLOCK_DEVICE_CMD_GET_BLOCK_SIZE, 78 BLOCK_DEVICE_CMD_NUM, 79 } BLOCK_DEVICE_CMD; 80 81 typedef enum DEVICE_PART_CMD_T 82 { 83 DEVICE_PART_CMD_ERASE_ALL = 0x00, 84 DEVICE_PART_CMD_ERASE_SECTOR, 85 DEVICE_PART_CMD_GET_TOTAL_SIZE, 86 DEVICE_PART_CMD_GET_BLOCK_SIZE, 87 DEVICE_PART_CMD_NUM, 88 } DEVICE_PART_CMD; 89 90 typedef struct _blk_dev_erase_t 91 { 92 uint32_t addr; 93 uint32_t len; 94 } blk_dev_erase_t; 95 96 void del_blkpart(struct blkpart *blk); 97 void blkpart_add_list(struct blkpart *blk); 98 void blkpart_del_list(struct blkpart *blk); 99 100 #define PARTINDEX_THE_LAST UINT32_MAX 101 struct blkpart *get_blkpart_by_name(const char *name); 102 struct part *get_part_by_index(const char *blk_name, uint32_t index); 103 struct part *get_part_by_name(const char *name); 104 105 106 #define PARTINDEX_THE_LAST UINT32_MAX 107 struct part *get_part_by_name(const char *name); 108 109 int remove_part_from_list(struct part *target_part); 110 int add_part_to_list(struct part *target_part); 111 112 int create_register_part(rt_device_t dev, 113 const char *part_name, 114 unsigned int part_offset, 115 unsigned int part_bytes); 116 117 int part_system_init(void); 118 119 rt_size_t part_erase_before_write(rt_device_t dev, rt_off_t offset, const void *data, rt_size_t size); 120 rt_size_t part_erase_without_write(rt_device_t dev, rt_off_t offset, const void *data, rt_size_t size); 121 rt_size_t part_read(rt_device_t dev, rt_off_t offset, void *data, rt_size_t size); 122 rt_err_t part_control(rt_device_t dev, int cmd, void *args); 123 124 #ifdef __cplusplus 125 } 126 #endif 127 128 #endif 129