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