summaryrefslogtreecommitdiff
path: root/bsp/allwinner/libraries/sunxi-hal/include/hal/sdmmc/blkpart.h
blob: 9cc92a693f81b164b3ce67966e1fee5485450bf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#ifndef __BLKPART_H__
#define __BLKPART_H__

#include <sys/types.h>
#include <stdint.h>
#include <rtthread.h>

#include <log.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifdef SECTOR_SIZE
#undef SECTOR_SIZE
#endif
#define SECTOR_SHIFT 9
#define SECTOR_SIZE (1 << SECTOR_SHIFT)

typedef enum
{
    STORAGE_NAND =0,
    STORAGE_SDC0,
    STORAGE_SDC1,
    STORAGE_NOR,
    STORAGE_SDC2,
    STORAGE_SPI_NAND,
}SUNXI_BOOT_STORAGE;


struct part
{
    /* public */
#define BLKPART_OFF_APPEND UINT32_MAX
    uint64_t off;
#define BLKPART_SIZ_FULL UINT32_MAX
    uint64_t bytes;
#define MAX_BLKNAME_LEN 16
    char name[MAX_BLKNAME_LEN];      /* name: UDISK */

    /* private */
    char devname[MAX_BLKNAME_LEN];   /* name: nor0p1 */
    struct blkpart *blk;
    uint32_t n_part;
    uint32_t erase_flag;
};

struct blkpart
{
    /* public */
    const char *name;
    uint64_t total_bytes;
    uint32_t blk_bytes;
    uint32_t page_bytes;
    int (*erase)(unsigned int, unsigned int);
    int (*program)(unsigned int, char *, unsigned int);
    int (*read)(unsigned int, char *, unsigned int);

    /* if no any partition, the follow can be NULL */
    struct part *parts;
    uint32_t n_parts;

    /* private */
    int blk_cnt;
    struct part root;
    struct blkpart *next;
    uint32_t n_blk;
    rt_device_t dev;
};

typedef enum BLOCK_DEVICE_CMD_T
{
    BLOCK_DEVICE_CMD_ERASE_ALL = 0x00,
    BLOCK_DEVICE_CMD_ERASE_SECTOR,
    BLOCK_DEVICE_CMD_GET_TOTAL_SIZE,
    BLOCK_DEVICE_CMD_GET_PAGE_SIZE,
    BLOCK_DEVICE_CMD_GET_BLOCK_SIZE,
    BLOCK_DEVICE_CMD_NUM,
} BLOCK_DEVICE_CMD;

typedef enum DEVICE_PART_CMD_T
{
    DEVICE_PART_CMD_ERASE_ALL = 0x00,
    DEVICE_PART_CMD_ERASE_SECTOR,
    DEVICE_PART_CMD_GET_TOTAL_SIZE,
    DEVICE_PART_CMD_GET_BLOCK_SIZE,
    DEVICE_PART_CMD_NUM,
} DEVICE_PART_CMD;

typedef struct _blk_dev_erase_t
{
    uint32_t addr;
    uint32_t len;
} blk_dev_erase_t;

void del_blkpart(struct blkpart *blk);
void blkpart_add_list(struct blkpart *blk);
void blkpart_del_list(struct blkpart *blk);

#define PARTINDEX_THE_LAST UINT32_MAX
struct blkpart *get_blkpart_by_name(const char *name);
struct part *get_part_by_index(const char *blk_name, uint32_t index);
struct part *get_part_by_name(const char *name);


#define PARTINDEX_THE_LAST UINT32_MAX
struct part *get_part_by_name(const char *name);

int remove_part_from_list(struct part *target_part);
int add_part_to_list(struct part *target_part);

int create_register_part(rt_device_t dev,
                         const char *part_name,
                         unsigned int part_offset,
                         unsigned int part_bytes);

int part_system_init(void);

rt_size_t part_erase_before_write(rt_device_t dev, rt_off_t offset, const void *data, rt_size_t size);
rt_size_t part_erase_without_write(rt_device_t dev, rt_off_t offset, const void *data, rt_size_t size);
rt_size_t part_read(rt_device_t dev, rt_off_t offset, void *data, rt_size_t size);
rt_err_t part_control(rt_device_t dev, int cmd, void *args);

#ifdef __cplusplus
}
#endif

#endif