blob: 8c5cc07b974e8b9671b21b825988250f5a738272 [file] [log] [blame]
#ifndef __pfi_h
#define __pfi_h
/*
* 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.
*/
/**
* @file pfi.h
*
* @author Oliver Lohmann <oliloh@de.ibm.com>
* Andreas Arnez <arnez@de.ibm.com>
* Joern Engel <engeljoe@de.ibm.com>
* Frank Haverkamp <haverkam@de.ibm.com>
*
* @brief libpfi will hold all code to create and process pfi
* images. Definitions made in this file are equaly usable for the
* development host and the target system.
*
* @note This header additionally holds the official definitions for
* the pfi headers.
*/
#include <stdio.h> /* FILE */
#ifdef __cplusplus
extern "C" {
#endif
/* Definitions. */
#define PFI_HDRVERSION 1 /* current header version */
#define PFI_ENOVERSION 1 /* unknown version */
#define PFI_ENOHEADER 2 /* not a pfi header */
#define PFI_EINSUFF 3 /* insufficient information */
#define PFI_EUNDEF 4 /* key not defined */
#define PFI_ENOMEM 5 /* out of memory */
#define PFI_EBADTYPE 6 /* bad data type */
#define PFI_EFILE 7 /* file I/O error: see errno */
#define PFI_EFILEINVAL 8 /* file format not valid */
#define PFI_EINVAL 9 /* invalid parameter */
#define PFI_ERANGE 10 /* invalid range */
#define PFI_EMODE 11 /* expecting other mode in this header */
#define PFI_DATA_START 12 /* data section starts */
#define PFI_EMAX 13 /* should be always larger as the largest
error code */
#define PFI_LABEL_LEN 64 /* This is the maximum length for a
PFI header label */
#define PFI_KEYWORD_LEN 32 /* This is the maximum length for an
entry in the mode and type fields */
#define PFI_UBI_MAX_VOLUMES 128
#define PFI_UBI_VOL_NAME_LEN 127
/**
* @brief The pfi header allows to set flags which influence the flashing
* behaviour.
*/
#define PFI_FLAG_PROTECTED 0x00000001
/**
* @brief Handle to pfi header. Used in most of the functions associated
* with pfi file handling.
*/
typedef struct pfi_header *pfi_header;
/**
* @brief Initialize a pfi header object.
*
* @param head Pointer to handle. This function allocates memory
* for this data structure.
* @return 0 on success, otherwise:
* PFI_ENOMEM : no memory available for the handle.
*/
int pfi_header_init (pfi_header *head);
/**
* @brief Destroy a pfi header object.
*
* @param head handle. head is invalid after calling this function.
* @return 0 always.
*/
int pfi_header_destroy (pfi_header *head);
/**
* @brief Add a key/value pair to a pfi header object.
*
* @param head handle.
* @param key pointer to key string. Must be 0 terminated.
* @param value pointer to value string. Must be 0 terminated.
* @return 0 on success, otherwise:
* PFI_EUNDEF : key was not found.
* PFI_ENOMEM : no memory available for the handle.
* PFI_EBADTYPE : value is not an hex string. This happens
* when the key stores an integer and the
* new value is not convertable e.g. not in
* 0xXXXXXXXX format.
*/
int pfi_header_setvalue (pfi_header head,
const char *key, const char *value);
/**
* @brief Add a key/value pair to a pfi header object. Provide the
* value as a number.
*
* @param head handle.
* @param key pointer to key string. Must be 0 terminated.
* @param value value to set.
* @return 0 on success, otherwise:
* PFI_EUNDEF : key was not found.
* PFI_EBADTYPE : value is not a string. This happens
* when the key stores a string.
*/
int pfi_header_setnumber (pfi_header head,
const char *key, uint32_t value);
/**
* @brief For a given key, return the numerical value stored in a
* pfi header object.
*
* @param head handle.
* @param key pointer to key string. Must be 0 terminated.
* @param value pointer to value.
* @return 0 on success, otherwise:
* PFI_EUNDEF : key was not found.
* PFI_EBADTYPE : stored value is not an integer but a string.
*/
int pfi_header_getnumber (pfi_header head,
const char *key, uint32_t *value);
static inline uint32_t
pfi_getnumber(pfi_header head, const char *key)
{
uint32_t value;
pfi_header_getnumber(head, key, &value);
return value;
}
/**
* @brief For a given key, return the string value stored in a pfi
* header object.
*
* @param head handle.
* @param key pointer to key string. Must be 0 terminated.
* @param value pointer to value string. Memory must be allocated by the user.
* @return 0 on success, otherwise:
* PFI_EUNDEF : key was not found.
* PFI_EBADTYPE : stored value is not a string but an integer.
*/
int pfi_header_getstring (pfi_header head,
const char *key, char *value, size_t size);
/**
* @brief Write a pfi header object into a given file.
*
* @param out output stream.
* @param head handle.
* @return 0 on success, error values otherwise:
* PFI_EINSUFF : not all mandatory fields are filled.
* PFI_ENOHEADER : wrong header version or magic number.
* -E* : see <asm/errno.h>.
*/
int pfi_header_write (FILE *out, pfi_header head);
/**
* @brief Read a pfi header object from a given file.
*
* @param in input stream.
* @param head handle.
* @return 0 on success, error values otherwise:
* PFI_ENOVERSION: unknown header version.
* PFI_EFILE : cannot read enough data.
* PFI_ENOHEADER : wrong header version or magic number.
* -E* : see <asm/errno.h>.
*
* If the header verification returned success the user can assume that
* all mandatory fields for a particular version are accessible. Checking
* the return code when calling the get-function for those keys is not
* required in those cases. For optional fields the checking must still be
* done.
*/
int pfi_header_read (FILE *in, pfi_header head);
/**
* @brief Display a pfi header in human-readable form.
*
* @param out output stream.
* @param head handle.
* @return always 0.
*
* @note Prints out that it is not implemented and whom you should
* contact if you need it urgently!.
*/
int pfi_header_dump (FILE *out, pfi_header head);
/*
* @brief Iterates over a stream of pfi files. The iterator function
* must advance the file pointer in FILE *in to the next pfi
* header. Function exists on feof(in).
*
* @param in input file descriptor, must be open and valid.
* @param func iterator function called when pfi header could be
* read and was validated. The function must return 0 on
* success.
* @return See pfi_header_init and pfi_header_read.
* PFI_EINVAL : func is not valid
* 0 ok.
*/
typedef int (* pfi_read_func)(FILE *in, pfi_header hdr, void *priv_data);
int pfi_read (FILE *in, pfi_read_func func, void *priv_data);
#ifdef __cplusplus
}
#endif
#endif /* __pfi_h */