diff options
| author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2016-09-01 15:52:33 +0200 | 
|---|---|---|
| committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2016-11-17 11:36:56 +0100 | 
| commit | db4146e84f3310a1e1de6f6d45f2ac35a0b0a604 (patch) | |
| tree | 4046be3c7f438e5ae2ed4ea9a28bb6f435e2f619 /include | |
| parent | f4ec4511d0729802e783b1757d6bcd556737510e (diff) | |
Move ubi-utils libraries to common library location
Historically, the mtd-utils and ubi-utils were seperate packages. The
ubi-utils were at some point merged into the mtd-utils. They first
appeared in the release tar-ball in version 1.1.0 in their own
sub-hirarchy with their own buildsystem, readme, documentation, etc.
A lot of the duplicated stuff got centralized/removed over time.
This patch further cleans up the directory hirarchy duplication by
moving common libraries from the ubi-utils/ into the central lib/
and include/ directories in the top directory of the mtd-utils package.
This includes:
 - libuib.a & libubigen.a used by the ubi utilities
 - libscan.a currently only used by ubiformat
 - libiniparser.a used by ubinize
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'include')
| -rw-r--r-- | include/dictionary.h | 174 | ||||
| -rw-r--r-- | include/libiniparser.h | 280 | ||||
| -rw-r--r-- | include/libscan.h | 113 | ||||
| -rw-r--r-- | include/libubi.h | 485 | ||||
| -rw-r--r-- | include/libubigen.h | 195 | 
5 files changed, 1247 insertions, 0 deletions
| diff --git a/include/dictionary.h b/include/dictionary.h new file mode 100644 index 0000000..c7d1790 --- /dev/null +++ b/include/dictionary.h @@ -0,0 +1,174 @@ + +/*-------------------------------------------------------------------------*/ +/** +   @file    dictionary.h +   @author  N. Devillard +   @date    Sep 2007 +   @version $Revision: 1.12 $ +   @brief   Implements a dictionary for string variables. + +   This module implements a simple dictionary object, i.e. a list +   of string/string associations. This object is useful to store e.g. +   informations retrieved from a configuration file (ini files). +*/ +/*--------------------------------------------------------------------------*/ + +/* +	$Id: dictionary.h,v 1.12 2007-11-23 21:37:00 ndevilla Exp $ +	$Author: ndevilla $ +	$Date: 2007-11-23 21:37:00 $ +	$Revision: 1.12 $ +*/ + +#ifndef _DICTIONARY_H_ +#define _DICTIONARY_H_ + +/*--------------------------------------------------------------------------- +   								Includes + ---------------------------------------------------------------------------*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +/*--------------------------------------------------------------------------- +   								New types + ---------------------------------------------------------------------------*/ + + +/*-------------------------------------------------------------------------*/ +/** +  @brief	Dictionary object + +  This object contains a list of string/string associations. Each +  association is identified by a unique string key. Looking up values +  in the dictionary is speeded up by the use of a (hopefully collision-free) +  hash function. + */ +/*-------------------------------------------------------------------------*/ +typedef struct _dictionary_ { +	int				n ;		/** Number of entries in dictionary */ +	int				size ;	/** Storage size */ +	char 		**	val ;	/** List of string values */ +	char 		**  key ;	/** List of string keys */ +	unsigned	 *	hash ;	/** List of hash values for keys */ +} dictionary ; + + +/*--------------------------------------------------------------------------- +  							Function prototypes + ---------------------------------------------------------------------------*/ + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Compute the hash key for a string. +  @param    key     Character string to use for key. +  @return   1 unsigned int on at least 32 bits. + +  This hash function has been taken from an Article in Dr Dobbs Journal. +  This is normally a collision-free function, distributing keys evenly. +  The key is stored anyway in the struct so that collision can be avoided +  by comparing the key itself in last resort. + */ +/*--------------------------------------------------------------------------*/ +unsigned dictionary_hash(char * key); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Create a new dictionary object. +  @param    size    Optional initial size of the dictionary. +  @return   1 newly allocated dictionary objet. + +  This function allocates a new dictionary object of given size and returns +  it. If you do not know in advance (roughly) the number of entries in the +  dictionary, give size=0. + */ +/*--------------------------------------------------------------------------*/ +dictionary * dictionary_new(int size); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Delete a dictionary object +  @param    d   dictionary object to deallocate. +  @return   void + +  Deallocate a dictionary object and all memory associated to it. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_del(dictionary * vd); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get a value from a dictionary. +  @param    d       dictionary object to search. +  @param    key     Key to look for in the dictionary. +  @param    def     Default value to return if key not found. +  @return   1 pointer to internally allocated character string. + +  This function locates a key in a dictionary and returns a pointer to its +  value, or the passed 'def' pointer if no such key can be found in +  dictionary. The returned character pointer points to data internal to the +  dictionary object, you should not try to free it or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * dictionary_get(dictionary * d, char * key, char * def); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Set a value in a dictionary. +  @param    d       dictionary object to modify. +  @param    key     Key to modify or add. +  @param    val     Value to add. +  @return   int     0 if Ok, anything else otherwise + +  If the given key is found in the dictionary, the associated value is +  replaced by the provided one. If the key cannot be found in the +  dictionary, it is added to it. + +  It is Ok to provide a NULL value for val, but NULL values for the dictionary +  or the key are considered as errors: the function will return immediately +  in such a case. + +  Notice that if you dictionary_set a variable to NULL, a call to +  dictionary_get will return a NULL value: the variable will be found, and +  its value (NULL) is returned. In other words, setting the variable +  content to NULL is equivalent to deleting the variable from the +  dictionary. It is not possible (in this implementation) to have a key in +  the dictionary without value. + +  This function returns non-zero in case of failure. + */ +/*--------------------------------------------------------------------------*/ +int dictionary_set(dictionary * vd, char * key, char * val); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Delete a key in a dictionary +  @param    d       dictionary object to modify. +  @param    key     Key to remove. +  @return   void + +  This function deletes a key in a dictionary. Nothing is done if the +  key cannot be found. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_unset(dictionary * d, char * key); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Dump a dictionary to an opened file pointer. +  @param    d   Dictionary to dump +  @param    f   Opened file pointer. +  @return   void + +  Dumps a dictionary onto an opened file pointer. Key pairs are printed out +  as @c [Key]=[Value], one per line. It is Ok to provide stdout or stderr as +  output file pointers. + */ +/*--------------------------------------------------------------------------*/ +void dictionary_dump(dictionary * d, FILE * out); + +#endif diff --git a/include/libiniparser.h b/include/libiniparser.h new file mode 100644 index 0000000..be3c667 --- /dev/null +++ b/include/libiniparser.h @@ -0,0 +1,280 @@ + +/*-------------------------------------------------------------------------*/ +/** +   @file    iniparser.h +   @author  N. Devillard +   @date    Sep 2007 +   @version 3.0 +   @brief   Parser for ini files. +*/ +/*--------------------------------------------------------------------------*/ + +/* +	$Id: iniparser.h,v 1.24 2007-11-23 21:38:19 ndevilla Exp $ +	$Revision: 1.24 $ +*/ + +#ifndef _INIPARSER_H_ +#define _INIPARSER_H_ + +/*--------------------------------------------------------------------------- +   								Includes + ---------------------------------------------------------------------------*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* + * The following #include is necessary on many Unixes but not Linux. + * It is not needed for Windows platforms. + * Uncomment it if needed. + */ +/* #include <unistd.h> */ + +#include "dictionary.h" + +/*--------------------------------------------------------------------------- +   								Macros + ---------------------------------------------------------------------------*/ +/** For backwards compatibility only */ +#define iniparser_getstr(d, k)  iniparser_getstring(d, k, NULL) +#define iniparser_setstr        iniparser_setstring + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get number of sections in a dictionary +  @param    d   Dictionary to examine +  @return   int Number of sections found in dictionary + +  This function returns the number of sections found in a dictionary. +  The test to recognize sections is done on the string stored in the +  dictionary: a section name is given as "section" whereas a key is +  stored as "section:key", thus the test looks for entries that do not +  contain a colon. + +  This clearly fails in the case a section name contains a colon, but +  this should simply be avoided. + +  This function returns -1 in case of error. + */ +/*--------------------------------------------------------------------------*/ + +int iniparser_getnsec(dictionary * d); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get name for section n in a dictionary. +  @param    d   Dictionary to examine +  @param    n   Section number (from 0 to nsec-1). +  @return   Pointer to char string + +  This function locates the n-th section in a dictionary and returns +  its name as a pointer to a string statically allocated inside the +  dictionary. Do not free or modify the returned string! + +  This function returns NULL in case of error. + */ +/*--------------------------------------------------------------------------*/ + +char * iniparser_getsecname(dictionary * d, int n); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Save a dictionary to a loadable ini file +  @param    d   Dictionary to dump +  @param    f   Opened file pointer to dump to +  @return   void + +  This function dumps a given dictionary into a loadable ini file. +  It is Ok to specify @c stderr or @c stdout as output files. + */ +/*--------------------------------------------------------------------------*/ + +void iniparser_dump_ini(dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Dump a dictionary to an opened file pointer. +  @param    d   Dictionary to dump. +  @param    f   Opened file pointer to dump to. +  @return   void + +  This function prints out the contents of a dictionary, one element by +  line, onto the provided file pointer. It is OK to specify @c stderr +  or @c stdout as output files. This function is meant for debugging +  purposes mostly. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_dump(dictionary * d, FILE * f); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key +  @param    d       Dictionary to search +  @param    key     Key string to look for +  @param    def     Default value to return if key not found. +  @return   pointer to statically allocated character string + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the pointer passed as 'def' is returned. +  The returned char pointer is pointing to a string allocated in +  the dictionary, do not free or modify it. + */ +/*--------------------------------------------------------------------------*/ +char * iniparser_getstring(dictionary * d, const char * key, char * def); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to an int +  @param    d Dictionary to search +  @param    key Key string to look for +  @param    notfound Value to return in case of error +  @return   integer + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the notfound value is returned. + +  Supported values for integers include the usual C notation +  so decimal, octal (starting with 0) and hexadecimal (starting with 0x) +  are supported. Examples: + +  - "42"      ->  42 +  - "042"     ->  34 (octal -> decimal) +  - "0x42"    ->  66 (hexa  -> decimal) + +  Warning: the conversion may overflow in various ways. Conversion is +  totally outsourced to strtol(), see the associated man page for overflow +  handling. + +  Credits: Thanks to A. Becker for suggesting strtol() + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getint(dictionary * d, const char * key, int notfound); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to a double +  @param    d Dictionary to search +  @param    key Key string to look for +  @param    notfound Value to return in case of error +  @return   double + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the notfound value is returned. + */ +/*--------------------------------------------------------------------------*/ +double iniparser_getdouble(dictionary * d, char * key, double notfound); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to a boolean +  @param    d Dictionary to search +  @param    key Key string to look for +  @param    notfound Value to return in case of error +  @return   integer + +  This function queries a dictionary for a key. A key as read from an +  ini file is given as "section:key". If the key cannot be found, +  the notfound value is returned. + +  A true boolean is found if one of the following is matched: + +  - A string starting with 'y' +  - A string starting with 'Y' +  - A string starting with 't' +  - A string starting with 'T' +  - A string starting with '1' + +  A false boolean is found if one of the following is matched: + +  - A string starting with 'n' +  - A string starting with 'N' +  - A string starting with 'f' +  - A string starting with 'F' +  - A string starting with '0' + +  The notfound value returned if no boolean is identified, does not +  necessarily have to be 0 or 1. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_getboolean(dictionary * d, const char * key, int notfound); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Set an entry in a dictionary. +  @param    ini     Dictionary to modify. +  @param    entry   Entry to modify (entry name) +  @param    val     New value to associate to the entry. +  @return   int 0 if Ok, -1 otherwise. + +  If the given entry can be found in the dictionary, it is modified to +  contain the provided value. If it cannot be found, -1 is returned. +  It is Ok to set val to NULL. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_setstring(dictionary * ini, char * entry, char * val); + + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Delete an entry in a dictionary +  @param    ini     Dictionary to modify +  @param    entry   Entry to delete (entry name) +  @return   void + +  If the given entry can be found, it is deleted from the dictionary. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_unset(dictionary * ini, char * entry); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Finds out if a given entry exists in a dictionary +  @param    ini     Dictionary to search +  @param    entry   Name of the entry to look for +  @return   integer 1 if entry exists, 0 otherwise + +  Finds out if a given entry exists in the dictionary. Since sections +  are stored as keys with NULL associated values, this is the only way +  of querying for the presence of sections in a dictionary. + */ +/*--------------------------------------------------------------------------*/ +int iniparser_find_entry(dictionary * ini, char * entry) ; + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Parse an ini file and return an allocated dictionary object +  @param    ininame Name of the ini file to read. +  @return   Pointer to newly allocated dictionary + +  This is the parser for ini files. This function is called, providing +  the name of the file to be read. It returns a dictionary object that +  should not be accessed directly, but through accessor functions +  instead. + +  The returned dictionary must be freed using iniparser_freedict(). + */ +/*--------------------------------------------------------------------------*/ +dictionary * iniparser_load(const char * ininame); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Free all memory associated to an ini dictionary +  @param    d Dictionary to free +  @return   void + +  Free all memory associated to an ini dictionary. +  It is mandatory to call this function before the dictionary object +  gets out of the current context. + */ +/*--------------------------------------------------------------------------*/ +void iniparser_freedict(dictionary * d); + +#endif diff --git a/include/libscan.h b/include/libscan.h new file mode 100644 index 0000000..a2b8657 --- /dev/null +++ b/include/libscan.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2008 Nokia Corporation + * + * 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 Bityutskiy + * + * UBI scanning library. + */ + +#ifndef __LIBSCAN_H__ +#define __LIBSCAN_H__ + +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * If an eraseblock does not contain an erase counter, this value is used + * instead of the erase counter. + */ +#define NO_EC 0xFFFFFFFF + +/* + * If an eraseblock contains a corrupted erase counter, this value is used + * instead of the erase counter. + */ +#define CORRUPT_EC 0xFFFFFFFE + +/* + * If an eraseblock does not contain an erase counter, one of these values is + * used. + * + * @EB_EMPTY: the eraseblock appeared to be empty + * @EB_CORRUPTED: the eraseblock contains corrupted erase counter header + * @EB_ALIEN: the eraseblock contains some non-UBI data + * @EC_MAX: maximum allowed erase counter value + */ +enum +{ +	EB_EMPTY     = 0xFFFFFFFF, +	EB_CORRUPTED = 0xFFFFFFFE, +	EB_ALIEN     = 0xFFFFFFFD, +	EB_BAD       = 0xFFFFFFFC, +	EC_MAX       = UBI_MAX_ERASECOUNTER, +}; + +/** + * struct ubi_scan_info - UBI scanning information. + * @ec: erase counters or eraseblock status for all eraseblocks + * @mean_ec: mean erase counter + * @ok_cnt: count of eraseblock with correct erase counter header + * @empty_cnt: count of supposedly eraseblocks + * @corrupted_cnt: count of eraseblocks with corrupted erase counter header + * @alien_cnt: count of eraseblock containing non-ubi data + * @bad_cnt: count of bad eraseblocks + * @bad_cnt: count of non-bad eraseblocks + * @vid_hdr_offs: volume ID header offset from the found EC headers (%-1 means + *                undefined) + * @data_offs: data offset from the found EC headers (%-1 means undefined) + */ +struct ubi_scan_info +{ +	uint32_t *ec; +	long long mean_ec; +	int ok_cnt; +	int empty_cnt; +	int corrupted_cnt; +	int alien_cnt; +	int bad_cnt; +	int good_cnt; +	int vid_hdr_offs; +	int data_offs; +}; + +struct mtd_dev_info; + +/** + * ubi_scan - scan an MTD device. + * @mtd: information about the MTD device to scan + * @fd: MTD device node file descriptor + * @info: the result of the scanning is returned here + * @verbose: verbose mode: %0 - be silent, %1 - output progress information, + *           2 - debugging output mode + */ +int ubi_scan(struct mtd_dev_info *mtd, int fd, struct ubi_scan_info **info, +	     int verbose); + +/** + * ubi_scan_free - free scanning information. + * @si: scanning information to free + */ +void ubi_scan_free(struct ubi_scan_info *si); + +#ifdef __cplusplus +} +#endif + +#endif /* __LIBSCAN_H__ */ diff --git a/include/libubi.h b/include/libubi.h new file mode 100644 index 0000000..4d6a7ee --- /dev/null +++ b/include/libubi.h @@ -0,0 +1,485 @@ +/* + * 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 Bityutskiy + * + * UBI (Unsorted Block Images) library. + */ + +#ifndef __LIBUBI_H__ +#define __LIBUBI_H__ + +#include <ctype.h> +#include <stdint.h> +#include <mtd/ubi-user.h> +#include <mtd/ubi-media.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* UBI version libubi is made for */ +#define LIBUBI_UBI_VERSION 1 + +/* Maximum physical eraseblock size in bytes */ +#define UBI_MAX_PEB_SZ (2*1024*1024) + +/* UBI library descriptor */ +typedef void * libubi_t; + +/** + * struct ubi_attach_request - MTD device attachment request. + * @dev_num: number to assign to the newly created UBI device + *           (%UBI_DEV_NUM_AUTO should be used to automatically assign the + *           number) + * @mtd_num: MTD device number to attach (used if @mtd_dev_node is %NULL) + * @mtd_dev_node: path to MTD device node to attach + * @vid_hdr_offset: VID header offset (%0 means default offset and this is what + *                  most of the users want) + * @max_beb_per1024: Maximum expected bad eraseblocks per 1024 eraseblocks + */ +struct ubi_attach_request +{ +	int dev_num; +	int mtd_num; +	const char *mtd_dev_node; +	int vid_hdr_offset; +	int max_beb_per1024; +}; + +/** + * struct ubi_mkvol_request - volume creation request. + * @vol_id: ID to assign to the new volume (%UBI_VOL_NUM_AUTO should be used to + *          automatically assign ID) + * @alignment: volume alignment + * @bytes: volume size in bytes + * @vol_type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) + * @name: volume name + */ +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 + * @ctrl_major: major number of the UBI control device + * @ctrl_minor: minor number of the UBI control device + */ +struct ubi_info +{ +	int dev_count; +	int lowest_dev_num; +	int highest_dev_num; +	int version; +	int ctrl_major; +	int ctrl_minor; +}; + +/** + * struct ubi_dev_info - UBI device information. + * @dev_num: UBI device number + * @mtd_num: MTD device number on top of which this UBI device is working + * @vol_count: count of volumes on this UBI device + * @lowest_vol_id: lowest volume ID + * @highest_vol_id: highest volume ID + * @major: major number of corresponding character device + * @minor: minor number of corresponding character device + * @total_lebs: total number of logical eraseblocks on this UBI device + * @avail_lebs: how many logical eraseblocks are not used and available for new + *             volumes + * @total_bytes: @total_lebs * @leb_size + * @avail_bytes: @avail_lebs * @leb_size + * @bad_count: count of bad physical eraseblocks + * @leb_size: logical eraseblock size + * @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 possible number of volumes on this UBI device + * @min_io_size: minimum input/output unit size of the UBI device + */ +struct ubi_dev_info +{ +	int dev_num; +	int mtd_num; +	int vol_count; +	int lowest_vol_id; +	int highest_vol_id; +	int major; +	int minor; +	int total_lebs; +	int avail_lebs; +	long long total_bytes; +	long long avail_bytes; +	int bad_count; +	int leb_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 + * @major: major number of corresponding volume character device + * @minor: minor number of corresponding volume character device + * @type: volume type (%UBI_DYNAMIC_VOLUME or %UBI_STATIC_VOLUME) + * @alignment: alignment 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_lebs: how many logical eraseblocks are reserved for this volume + * @leb_size: logical eraseblock size of this volume (may be less then + *            device's logical eraseblock size due to alignment) + * @corrupted: non-zero if the volume is corrupted + * @name: volume name (null-terminated) + */ +struct ubi_vol_info +{ +	int dev_num; +	int vol_id; +	int major; +	int minor; +	int type; +	int alignment; +	long long data_bytes; +	long long rsvd_bytes; +	int rsvd_lebs; +	int leb_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. In case of + * failure, errno contains the error code or zero if UBI is not present in the + * system. + */ +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. + * @desc: UBI library descriptor + * @info: pointer to the &struct ubi_info object to fill + * + * 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); + +/** + * mtd_num2ubi_dev - find UBI device by attached MTD device. + * @@desc: UBI library descriptor + * @mtd_num: MTD device number + * @dev_num: UBI device number is returned here + * + * This function finds UBI device to which MTD device @mtd_num is attached. + * Returns %0 if the UBI device was found and %-1 if not. + */ +int mtd_num2ubi_dev(libubi_t desc, int mtd_num, int *dev_num); + +/** + * ubi_attach - attach an MTD device by its node path or bt MTD device number + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @req: MTD attach request + * + * This function creates new UBI device by attaching an MTD device described by + * @req. If @req->mtd_dev_node is given it should contain path to the MTD + * device node. Otherwise @req->mtd_num will be used. + * + * Returns %0 in case of success, %-1 in case of failure (errno is set) and %1 + * if parameter @req->max_beb_per1024 was ignored by kernel (because the kernel + * is old and does not support this feature, which was added in 3.7). The newly + * created UBI device number is returned in @req->dev_num. In the MTD device + * was specified by its device node path, the MTD device number is returned in + * @req->mtd_num. + */ +int ubi_attach(libubi_t desc, const char *node, struct ubi_attach_request *req); + +/** + * ubi_detach_mtd - detach an MTD device. + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @mtd_num: MTD device number to detach + * + * This function detaches MTD device number @mtd_num from UBI, which means the + * corresponding UBI device is removed. Returns zero in case of success and %-1 + * in case of failure. + */ +int ubi_detach_mtd(libubi_t desc, const char *node, int mtd_num); + +/** + * ubi_detach - detach an MTD device by its node path. + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @mtd_dev_node: path to an MTD device node + * + * This function detaches an MTD device @mtd_dev_node from UBI. Returns zero in + * case of success and %-1 in case of failure. + */ +int ubi_detach(libubi_t desc, const char *node, const char *mtd_dev_node); + +/** + * ubi_remove_dev - remove an UBI device. + * @desc: UBI library descriptor + * @node: name of the UBI control character device node + * @ubi_dev: UBI device number to remove + * + * This function removes UBI device number @ubi_dev and returns zero in case of + * success and %-1 in case of failure. + */ +int ubi_remove_dev(libubi_t desc, const char *node, int ubi_dev); + +/** + * 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 + * + * 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_rnvols - rename UBI volumes. + * @desc: UBI library descriptor + * @node: name of the UBI character device to remove a volume from + * @rnvol: description of volumes to rename + * + * 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_rnvols(libubi_t desc, const char *node, struct ubi_rnvol_req *rnvol); + +/** + * 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_probe_node - test UBI node. + * @desc: UBI library descriptor + * @node: the node to test + * + * This function tests whether @node is a UBI device or volume node and returns + * %1 if this is an UBI device node, %2 if this is a volume node, and %-1 if + * this is not an UBI device or volume node (errno is ENODEV in this case) or + * if an error occurred. + */ +int ubi_probe_node(libubi_t desc, const char *node); + +/** + * 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. If the UBI device + * corresponding to @node does not exist, errno is set to @ENODEV. + */ +int ubi_get_dev_info(libubi_t desc, const char *node, +		     struct ubi_dev_info *info); + +/** + * ubi_dev_present - check whether an UBI device is present. + * @desc: UBI library descriptor + * @dev_num: UBI device number to check + * + * This function returns %1 if UBI device is present and %0 if not. + */ +int ubi_dev_present(libubi_t desc, int dev_num); + +/** + * 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. If the UBI device @dev_num does not + * exist, errno is set to @ENODEV. + */ +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. If the UBI volume + * corresponding to @node does not exist, errno is set to @ENODEV. + */ +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 ID, not UBI volume character device. If the UBI device @dev_num does + * not exist, or if the UBI volume @vol_id does not exist, errno is set to + * @ENODEV. + */ +int ubi_get_vol_info1(libubi_t desc, int dev_num, int vol_id, +		      struct ubi_vol_info *info); + +/** + * ubi_get_vol_info1_nm - get UBI volume information by volume name. + * @desc: UBI library descriptor + * @dev_num: UBI device number + * @name: name 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 name, not UBI volume ID. If the UBI device @dev_num does not exist, + * or if the UBI volume @name does not exist, errno is set to @ENODEV. + */ +int ubi_get_vol_info1_nm(libubi_t desc, int dev_num, const char *name, +			 struct ubi_vol_info *info); + +/** + * ubi_vol_block_create - create a block device on top of an UBI volume. + * @fd: volume character device file descriptor + * + * Returns %0 in case of success and %-1 in case of failure. + */ +int ubi_vol_block_create(int fd); + +/** + * ubi_vol_block_remove - remove a block device from an UBI volume. + * @fd: volume character device file descriptor + * + * Returns %0 in case of success and %-1 in case of failure. + */ +int ubi_vol_block_remove(int fd); + +/** + * ubi_update_start - start UBI volume update. + * @desc: UBI library descriptor + * @fd: volume character device 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. The caller is assumed to write @bytes data to the + * volume @fd afterward. + */ +int ubi_update_start(libubi_t desc, int fd, long long bytes); + +/** + * ubi_leb_change_start - start atomic LEB change. + * @desc: UBI library descriptor + * @fd: volume character device file descriptor + * @lnum: LEB number to change + * @bytes: how many bytes of new data will be written to the LEB + * + * This function initiates atomic LEB change operation and returns %0 in case + * of success and %-1 in case of error. he caller is assumed to write @bytes + * data to the volume @fd afterward. + */ +int ubi_leb_change_start(libubi_t desc, int fd, int lnum, int bytes); + +/** + * ubi_set_property - set volume propety. + * @fd: volume character device file descriptor + * @property: the property to change (%UBI_VOL_PROP_DIRECT_WRITE, etc) + * @value: new value of the changed property + * + * This function changes a property of a volume. Returns zero in case of + * success and a negative error code in case of error. + */ +int ubi_set_property(int fd, uint8_t property, uint64_t value); + +/** + * ubi_leb_unmap - unmap a logical eraseblock. + * @fd: volume character device file descriptor + * @lnum: logical eraseblock to unmap + * + * This function unmaps LEB @lnum and returns zero in case of success and a + * negative error code in case of error. + */ +int ubi_leb_unmap(int fd, int lnum); + +/** + * ubi_is_mapped - check if logical eraseblock is mapped. + * @fd: volume character device file descriptor + * @lnum: logical eraseblock number + * + * This function checks if logical eraseblock @lnum is mapped to a physical + * eraseblock. If a logical eraseblock is un-mapped, this does not necessarily + * mean it will still be un-mapped after the UBI device is re-attached. The + * logical eraseblock may become mapped to the physical eraseblock it was last + * mapped to. + * + * This function returns %1 if the LEB is mapped, %0 if not, and %-1 in case of + * failure. If the volume is damaged because of an interrupted update errno + * set with %EBADF error code. + */ +int ubi_is_mapped(int fd, int lnum); + +#ifdef __cplusplus +} +#endif + +#endif /* !__LIBUBI_H__ */ diff --git a/include/libubigen.h b/include/libubigen.h new file mode 100644 index 0000000..c25ac20 --- /dev/null +++ b/include/libubigen.h @@ -0,0 +1,195 @@ +/* + * Copyright (c) International Business Machines Corp., 2006 + * Copyright (C) 2008 Nokia Corporation + * + * 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. + */ + +/* + * Authors: Frank Haverkamp + *          Artem Bityutskiy + */ + +#ifndef __LIBUBIGEN_H__ +#define __LIBUBIGEN_H__ + +#include <stdint.h> +#include <mtd/ubi-media.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * struct ubigen_info - libubigen information. + * @leb_size: logical eraseblock size + * @peb_size: size of the physical eraseblock + * @min_io_size: minimum input/output unit size + * @vid_hdr_offs: offset of the VID header + * @data_offs: data offset + * @ubi_ver: UBI version + * @vtbl_size: volume table size + * @max_volumes: maximum amount of volumes + * @image_seq: UBI image sequence number + */ +struct ubigen_info +{ +	int leb_size; +	int peb_size; +	int min_io_size; +	int vid_hdr_offs; +	int data_offs; +	int ubi_ver; +	int vtbl_size; +	int max_volumes; +	uint32_t image_seq; +}; + +/** + * struct ubigen_vol_info - information about a volume. + * @id: volume id + * @type: volume type (%UBI_VID_DYNAMIC or %UBI_VID_STATIC) + * @alignment: volume alignment + * @data_pad: how many bytes are unused at the end of the each physical + *            eraseblock to satisfy the requested alignment + * @usable_leb_size: LEB size accessible for volume users + * @name: volume name + * @name_len: volume name length + * @compat: compatibility of this volume (%0, %UBI_COMPAT_DELETE, + *          %UBI_COMPAT_IGNORE, %UBI_COMPAT_PRESERVE, or %UBI_COMPAT_REJECT) + * @used_ebs: total number of used logical eraseblocks in this volume (relevant + *            for static volumes only) + * @bytes: size of the volume contents in bytes (relevant for static volumes + *         only) + * @flags: volume flags (%UBI_VTBL_AUTORESIZE_FLG) + */ +struct ubigen_vol_info +{ +	int id; +	int type; +	int alignment; +	int data_pad; +	int usable_leb_size; +	const char *name; +	int name_len; +	int compat; +	int used_ebs; +	long long bytes; +	uint8_t flags; +}; + +/** + * ubigen_info_init - initialize libubigen. + * @ui: libubigen information + * @peb_size: flash physical eraseblock size + * @min_io_size: flash minimum input/output unit size + * @subpage_size: flash sub-page, if present (has to be equivalent to + *                @min_io_size if does not exist) + * @vid_hdr_offs: offset of the VID header + * @ubi_ver: UBI version + * @image_seq: UBI image sequence number + */ +void ubigen_info_init(struct ubigen_info *ui, int peb_size, int min_io_size, +		      int subpage_size, int vid_hdr_offs, int ubi_ver, +		      uint32_t image_seq); + +/** + * ubigen_create_empty_vtbl - creates empty volume table. + * @ui: libubigen information + * + * This function creates an empty volume table and returns a pointer to it in + * case of success and %NULL in case of failure. The returned object has to be + * freed with 'free()' call. + */ +struct ubi_vtbl_record *ubigen_create_empty_vtbl(const struct ubigen_info *ui); + +/** + * ubigen_init_ec_hdr - initialize EC header. + * @ui: libubigen information + * @hdr: the EC header to initialize + * @ec: erase counter value + */ +void ubigen_init_ec_hdr(const struct ubigen_info *ui, +		        struct ubi_ec_hdr *hdr, long long ec); + +/** + * ubigen_init_vid_hdr - initialize VID header. + * @ui: libubigen information + * @vi: volume information + * @hdr: the VID header to initialize + * @lnum: logical eraseblock number + * @data: the contents of the LEB (static volumes only) + * @data_size: amount of data in this LEB (static volumes only) + * + * Note, @used_ebs, @data and @data_size are ignored in case of dynamic + * volumes. + */ +void ubigen_init_vid_hdr(const struct ubigen_info *ui, +			 const struct ubigen_vol_info *vi, +			 struct ubi_vid_hdr *hdr, int lnum, +			 const void *data, int data_size); + +/** + * ubigen_add_volume - add a volume to the volume table. + * @ui: libubigen information + * @vi: volume information + * @vtbl: volume table to add to + * + * This function adds volume described by input parameters to the volume table + * @vtbl. + */ +int ubigen_add_volume(const struct ubigen_info *ui, +		      const struct ubigen_vol_info *vi, +		      struct ubi_vtbl_record *vtbl); + +/** + * ubigen_write_volume - write UBI volume. + * @ui: libubigen information + * @vi: volume information + * @ec: erase counter value to put to EC headers + * @bytes: volume size in bytes + * @in: input file descriptor (has to be properly seeked) + * @out: output file descriptor + * + * This function reads the contents of the volume from the input file @in and + * writes the UBI volume to the output file @out. Returns zero on success and + * %-1 on failure. + */ +int ubigen_write_volume(const struct ubigen_info *ui, +			const struct ubigen_vol_info *vi, long long ec, +			long long bytes, int in, int out); + +/** + * ubigen_write_layout_vol - write UBI layout volume + * @ui: libubigen information + * @peb1: physical eraseblock number to write the first volume table copy + * @peb2: physical eraseblock number to write the second volume table copy + * @ec1: erase counter value for @peb1 + * @ec2: erase counter value for @peb1 + * @vtbl: volume table + * @fd: output file descriptor seeked to the proper position + * + * This function creates the UBI layout volume which contains 2 copies of the + * volume table. Returns zero in case of success and %-1 in case of failure. + */ +int ubigen_write_layout_vol(const struct ubigen_info *ui, int peb1, int peb2, +			    long long ec1, long long ec2, +			    struct ubi_vtbl_record *vtbl, int fd); + +#ifdef __cplusplus +} +#endif + +#endif /* !__LIBUBIGEN_H__ */ | 
