211 lines
6.6 KiB
C
211 lines
6.6 KiB
C
/*
|
|
* 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>
|
|
#include <linux/list.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
|
|
* @max_leb_count: maximum logical erase block count
|
|
*/
|
|
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;
|
|
uint32_t max_leb_count;
|
|
};
|
|
|
|
/**
|
|
* 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)
|
|
* @pebs: array of PEBs assigned to the volume luns. Index of the array
|
|
* is the lun
|
|
* @reserved_pebs: number of PEBs required for this volume
|
|
*/
|
|
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;
|
|
int *pebs;
|
|
int reserved_pebs;
|
|
};
|
|
|
|
/**
|
|
* 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
|
|
* @max_leb_count: maximum logical erase block count
|
|
*/
|
|
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, int max_leb_count);
|
|
|
|
/**
|
|
* 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,
|
|
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
|
|
* @used: linked list of used PEBs for writing the volume.
|
|
* To be filled in by this function
|
|
* @used_cnt: number of PEBs used to write this volume
|
|
*
|
|
* 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,
|
|
struct ubigen_vol_info *vi, long long ec,
|
|
long long bytes, int in, int out, struct list_head *used,
|
|
int *used_cnt);
|
|
|
|
/**
|
|
* 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
|
|
* @vi_layout: information about the layout volume
|
|
*
|
|
* 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,
|
|
struct ubigen_vol_info *vi_layout);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* !__LIBUBIGEN_H__ */
|