summaryrefslogtreecommitdiff
path: root/ubi-utils/inc/libubi.h
blob: d39c1b93ef13af9622e7c1f5cff65857b6a372f8 (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/*
 * Copyright (c) International Business Machines Corp., 2006
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
 * the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * Author: Artem B. Bityutskiy
 *
 * UBI (Unsorted Block Images) library.
 */

#ifndef __LIBUBI_H__
#define __LIBUBI_H__

#include <stdint.h>
#include <mtd/ubi-user.h>
#include <ctype.h>
#include <mtd/ubi-header.h>

#ifdef __cplusplus
extern "C" {
#endif

/* UBI version libubi is made for */
#define LIBUBI_UBI_VERSION 1

/* UBI library descriptor */
typedef void * libubi_t;

/**
 * struct ubi_mkvol_request - volume creation request.
 * */
struct ubi_mkvol_request
{
	int vol_id;
	int alignment;
	long long bytes;
	int vol_type;
	const char *name;
};

/**
 * struct ubi_info - general UBI information.
 *
 * @dev_count        count of UBI devices in system
 * @lowest_dev_num   lowest UBI device number
 * @highest_dev_num  highest UBI device number
 * @version          UBI version
 */
struct ubi_info
{
	int dev_count;
	int lowest_dev_num;
	int highest_dev_num;
	int version;
};

/**
 * struct ubi_dev_info - UBI device information.
 *
 * @vol_count        count of volumes on this UBI device
 * @lowest_vol_num   lowest volume number
 * @highest_vol_num  highest volume number
 * @total_ebs        total number of eraseblocks on this UBI device
 * @avail_ebs        how many eraseblocks are not used and available for new
 *                   volumes
 * @total_bytes      @total_ebs * @eb_size
 * @avail_bytes      @avail_ebs * @eb_size
 * @bad_count        count of bad eraseblocks
 * @eb_size          size of UBI eraseblock
 * @max_ec           current highest erase counter value
 * @bad_rsvd         how many physical eraseblocks of the underlying flash
 *                   device are reserved for bad eraseblocks handling
 * @max_vol_count    maximum count of volumes on this UBI device
 * @min_io_size      minimum input/output size of the UBI device
 */
struct ubi_dev_info
{
	int dev_num;
	int vol_count;
	int lowest_vol_num;
	int highest_vol_num;
	int total_ebs;
	int avail_ebs;
	long long total_bytes;
	long long avail_bytes;
	int bad_count;
	int eb_size;
	long long max_ec;
	int bad_rsvd;
	int max_vol_count;
	int min_io_size;
};

/**
 * struct ubi_vol_info - UBI volume information.
 *
 * @dev_num      UBI device number the volume resides on
 * @vol_id       ID of this volume
 * @type         volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME)
 * @alignment    alignemnt of this volume
 * @data_bytes   how many data bytes are stored on this volume (equivalent to
 *               @rsvd_bytes for dynamic volumes)
 * @rsvd_bytes   how many bytes are reserved for this volume
 * @rsvd_ebs     how many eraseblocks are reserved for this volume
 * @eb_size      logical eraseblock size of this volume (may be less then
 *               device's logical eraseblock size due to alignment)
 * @corrupted    the volume is corrupted if this flag is not zero
 * @name         volume name (null-terminated)
 */
struct ubi_vol_info
{
	int dev_num;
	int vol_id;
	int type;
	int alignment;
	long long data_bytes;
	long long rsvd_bytes;
	int rsvd_ebs;
	int eb_size;
	int corrupted;
	char name[UBI_VOL_NAME_MAX + 1];
};

/**
 * libubi_open - open UBI library.
 *
 * This function initializes and opens the UBI library and returns UBI library
 * descriptor in case of success and %NULL in case of failure.
 */
libubi_t libubi_open(void);

/**
 * libubi_close - close UBI library
 *
 * @desc UBI library descriptor
 */
void libubi_close(libubi_t desc);

/**
 * ubi_get_info - get general UBI information.
 *
 * @info  pointer to the &struct ubi_info object to fill
 * @desc  UBI library descriptor
 *
 * This function fills the passed @info object with general UBI information and
 * returns %0 in case of success and %-1 in case of failure.
 */
int ubi_get_info(libubi_t desc, struct ubi_info *info);

/**
 * ubi_mkvol - create an UBI volume.
 *
 * @desc  UBI library descriptor
 * @node  name of the UBI character device to create a volume at
 * @req   UBI volume creation request (defined at <mtd/ubi-user.h>)
 *
 * This function creates a UBI volume as described at @req and returns %0 in
 * case of success and %-1 in case of failure. The assigned volume ID is
 * returned in @req->vol_id.
 */
int ubi_mkvol(libubi_t desc, const char *node, struct ubi_mkvol_request *req);

/**
 * ubi_rmvol - remove a UBI volume.
 *
 * @desc    UBI library descriptor
 * @node    name of the UBI character device to remove a volume from
 * @vol_id  ID of the volume to remove
 *
 * This function removes volume @vol_id from UBI device @node and returns %0 in
 * case of success and %-1 in case of failure.
 */
int ubi_rmvol(libubi_t desc, const char *node, int vol_id);

/**
 * ubi_rsvol - re-size UBI volume.
 *
 * @desc   UBI library descriptor
 * @node   name of the UBI character device owning the volume which should be
 *         re-sized
 * @vol_id volume ID to re-size
 * @bytes  new volume size in bytes
 *
 * This function returns %0 in case of success and %-1 in case of error.
 */
int ubi_rsvol(libubi_t desc, const char *node, int vol_id, long long bytes);

/**
 * ubi_get_dev_info - get UBI device information.
 *
 * @desc  UBI library descriptor
 * @node  name of the UBI character device to fetch information about
 * @info  pointer to the &struct ubi_dev_info object to fill
 *
 * This function fills the passed @info object with UBI device information and
 * returns %0 in case of success and %-1 in case of failure.
 */
int ubi_get_dev_info(libubi_t desc, const char *node,
		     struct ubi_dev_info *info);

/**
 * ubi_get_dev_info1 - get UBI device information.
 *
 * @desc     UBI library descriptor
 * @dev_num  UBI device number to fetch information about
 * @info     pointer to the &struct ubi_dev_info object to fill
 *
 * This function is identical to 'ubi_get_dev_info()' except that it accepts UBI
 * device number, not UBI character device.
 */
int ubi_get_dev_info1(libubi_t desc, int dev_num, struct ubi_dev_info *info);

/**
 * ubi_get_vol_info - get UBI volume information.
 *
 * @desc     UBI library descriptor
 * @node     name of the UBI volume character device to fetch information about
 * @info     pointer to the &struct ubi_vol_info object to fill
 *
 * This function fills the passed @info object with UBI volume information and
 * returns %0 in case of success and %-1 in case of failure.
 */
int ubi_get_vol_info(libubi_t desc, const char *node,
		     struct ubi_vol_info *info);

/**
 * ubi_get_vol_info1 - get UBI volume information.
 *
 * @desc     UBI library descriptor
 * @dev_num  UBI device number
 * @vol_id   ID of the UBI volume to fetch information about
 * @info     pointer to the &struct ubi_vol_info object to fill
 *
 * This function is identical to 'ubi_get_vol_info()' except that it accepts UBI
 * volume number, not UBI volume character device.
 */
int ubi_get_vol_info1(libubi_t desc, int dev_num, int vol_id,
		      struct ubi_vol_info *info);

/**
 * ubi_update_start - start UBI volume update.
 *
 * @desc   UBI library descriptor
 * @fd     volume character devie file descriptor
 * @bytes  how many bytes will be written to the volume
 *
 * This function initiates UBI volume update and returns %0 in case of success
 * and %-1 in case of error.
 */
int ubi_update_start(libubi_t desc, int fd, long long bytes);

#ifdef __cplusplus
}
#endif

#endif /* !__LIBUBI_H__ */