diff gsm-fw/services/ffs/ffs.h @ 209:6f4a12b4582f

gsm-fw FFS: starting to integrate C code
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Thu, 26 Dec 2013 03:59:59 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/services/ffs/ffs.h	Thu Dec 26 03:59:59 2013 +0000
@@ -0,0 +1,406 @@
+/******************************************************************************
+ * Flash File System (ffs)
+ * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com
+ *
+ * FFS Types and globals
+ *
+ * $Id: ffs.h 1.19.1.45.1.26 Mon, 28 Apr 2003 11:27:14 +0200 cm $
+ *
+ ******************************************************************************/
+
+#ifndef _FFS_H_
+#define _FFS_H_
+
+#ifndef TARGET
+#define	TARGET	1
+#define	_RVF	1
+#endif
+
+#ifdef _RVF
+#include "../../riviera/rvf/rvf_api.h"
+#include "../../riviera/rvm/rvm_use_id_list.h"
+#endif
+
+/******************************************************************************
+ * Types
+ ******************************************************************************/
+
+#ifndef BASIC_TYPES
+#define BASIC_TYPES
+typedef signed   char  int8;
+typedef unsigned char  uint8;
+typedef signed   short int16;
+typedef unsigned short uint16;
+typedef signed   int   int32;
+typedef unsigned int   uint32;
+#endif
+
+#if (TARGET == 1)
+// Unique message offset returned in the header of each mail (msg_id).
+#define FFS_MESSAGE_OFFSET	 BUILD_MESSAGE_OFFSET(FFS_USE_ID)
+#endif
+
+typedef int8   effs_t;      // error type
+//typedef int    effs_t;
+typedef int32  req_id_t;    // request id
+typedef int32  offset_t;    // offset from first address of ffs.
+typedef uint32 location_t;  // object location offset
+typedef int32  blocksize_t; // can hold size of a block
+typedef uint8  objflags_t;  // object flags
+typedef uint8  objtype_t;   // object type
+
+typedef int16  iref_t;      // inode reference
+typedef int8   bref_t;      // block reference
+
+typedef int32  fd_t;        // file descriptor
+typedef uint16 ffs_options_t;  // option flags to open() and file_write()
+
+// For directory operations
+struct dir_s {
+    iref_t this;   // iref of dir that was opened
+    iref_t index;  // last inode returned by ffs_readdir()
+};
+
+// File stat structure
+struct stat_s {
+    objtype_t  type;
+    objflags_t flags;
+    iref_t     inode;
+    int        size;     // size of data space occupied by object
+};
+
+// File xstat structure
+struct xstat_s {
+    objtype_t  type;
+    objflags_t flags;
+    iref_t     inode;
+    int        size;     // size of data space occupied by object
+    int        space;    // size of physical data space occupied by object
+    location_t location;
+    uint8      reserved; // only for debug
+    bref_t     block;    // only for debug
+    uint16     sequence; // only for debug
+    uint16     updates;  // only for debug
+};
+
+#if (TARGET == 0)
+// Only use to run on PC and not in target. Must be syncron with the typedef
+// from rv_general.h
+typedef void (*CALLBACK_FUNC)(void *);
+
+typedef uint16 T_RVF_ADDR_ID;
+
+/* define return_path */              
+typedef struct
+{
+	T_RVF_ADDR_ID	addr_id;
+	void			(*callback_func)(void *);
+} T_RV_RETURN;
+
+/* Define the header of each message used in Riviera. */
+typedef struct {
+    uint32			msg_id;
+	void			(*callback_func)(void *);
+    T_RVF_ADDR_ID	src_addr_id;
+	T_RVF_ADDR_ID	dest_addr_id;
+} T_RV_HDR;
+
+// Used riviera types
+typedef uint16          UINT16;
+typedef int8            INT8;
+
+#endif 
+
+// Confirm mail sent from FFS task to caller (application)
+struct ffs_file_cnf_s {
+    T_RV_HDR header;
+    int       error;      // error code of FFS operation
+    req_id_t  request_id; // Unique id number
+    char      *path;      // path name of object operation was performed on
+};
+
+struct ffs_stream_cnf_s {
+    T_RV_HDR header;
+    int       error;      // error code of FFS operation
+    req_id_t  request_id; // Unique id number
+    fd_t      fdi;        // file descriptor
+};
+
+/******************************************************************************
+ * RVF Types
+ ******************************************************************************/
+
+typedef ffs_options_t   T_FFS_OPEN_FLAGS;
+typedef int             T_FFS_SIZE;
+typedef offset_t        T_FFS_OFFSET;
+typedef effs_t          T_FFS_RET;
+typedef req_id_t        T_FFS_REQ_ID;
+typedef int             T_FFS_WHENCE;
+typedef fd_t            T_FFS_FD;
+typedef objtype_t       T_FFS_OBJECT_TYPE;
+typedef objflags_t      T_FFS_FLAGS;
+typedef struct stat_s   T_FFS_STAT;
+typedef struct xstat_s  T_FFS_XSTAT;
+typedef struct dir_s    T_FFS_DIR;
+typedef struct ffs_file_cnf_s     T_FFS_FILE_CNF;
+typedef struct ffs_stream_cnf_s   T_FFS_STREAM_CNF;
+
+/******************************************************************************
+ * Errors
+ ******************************************************************************/
+
+enum FFS_ERRORS {
+    EFFS_OK          =  0,  /* ok */
+    EFFS_NODEVICE    = -1,  /* flash device unknown */
+    EFFS_CORRUPTED   = -2,  /* filesystem corrupted!? */
+    EFFS_NOPREFORMAT = -3,  /* ffs not preformatted */
+    EFFS_NOFORMAT    = -4,  /* ffs not formatted */
+    EFFS_BADFORMAT   = -5,  /* incompatible ffs version, re-format needed */
+    EFFS_MAGIC       = -6,  /* bad magic */
+    EFFS_AGAIN       = -7,  /* not ready, try again later */
+    EFFS_NOSYS       = -8,  /* function not implemented */
+    EFFS_DRIVER      = -9,  /* ffs device driver error */
+
+    EFFS_NOSPACE     = -10, /* out of data space */
+    EFFS_FSFULL      = -11, /* file system full, no free inodes */
+    EFFS_BADNAME     = -12, /* bad filename */
+    EFFS_NOTFOUND    = -13, /* object not found */
+    EFFS_EXISTS      = -14, /* object exists */
+    EFFS_ACCESS      = -15, /* access permission violation */
+    EFFS_NAMETOOLONG = -16, /* filename too long */
+    EFFS_INVALID     = -17, /* invalid argument */
+    EFFS_DIRNOTEMPTY = -18, /* directory not empty */
+    EFFS_NOTADIR     = -19, /* object is not a directory */
+    EFFS_SPARE       = -20, /* SPARE */
+    EFFS_FILETOOBIG  = -21, /* file too big */
+    EFFS_NOTAFILE    = -22, /* object is not a file */
+    EFFS_PATHTOODEEP = -23, /* path too deep */
+
+    EFFS_NUMFD       = -24, /* Max number of open files reached */
+    EFFS_BADFD       = -25, /* Bad file descriptor */
+    EFFS_BADOP       = -26, /* Bad operation */
+    EFFS_LOCKED      = -27, /* The file is locked */
+
+    EFFS_TOOBIG      = -30, /* too big (tmffs buffer overflow) */
+    EFFS_MEMORY      = -31, /* out of memory */
+    EFFS_MSGSEND     = -32, /* message send failed */
+
+    /* debug errors */
+
+    EFFS_SIBLINGLOOP = -40, /* directory sibling loop */
+    EFFS_NOBLOCKS    = -41, /* No more blocks!? */
+    EFFS_DBR         = -42, /* Data reclaim did not finish!? */
+    EFFS_RECLAIMLOOP = -43  /* Data reclaim loop */
+};
+
+
+/******************************************************************************
+ * Enumerations
+ ******************************************************************************/
+
+enum FFS_OBJECT_CONTROL_ACTION {
+    OC_FLAGS = 1
+};
+
+enum FFS_OBJECT_TYPE {
+    OT_FILE    = 1,
+    OT_DIR     = 2,
+    OT_LINK    = 3,
+    OT_SEGMENT = 4
+};
+
+enum FFS_OBJECT_FLAGS {
+    OF_READONLY = 1<<4  // object cannot be modified
+};
+
+enum FFS_OPEN {
+    FFS_O_EMPTY  = 0x00,  // Okay?
+    FFS_O_CREATE = 0x01,
+    FFS_O_APPEND = 0x02,
+    FFS_O_EXCL   = 0x04,
+    FFS_O_TRUNC  = 0x08,
+    FFS_O_RDONLY = 0x10,
+    FFS_O_WRONLY = 0x20,
+    FFS_O_RDWR   = FFS_O_RDONLY | FFS_O_WRONLY
+};
+
+enum FFS_SEEK {
+    FFS_SEEK_SET = 0,
+    FFS_SEEK_CUR = 1,
+    FFS_SEEK_END = 2
+};
+
+// FIXME: debug indices to go into core.h
+enum FFS_QUERY {              // data size, description
+    Q_BYTES_FREE        =  1, // 4, number of free bytes in FFS
+    Q_BYTES_USED        =  2, // 4, number of used bytes in FFS
+    Q_BYTES_LOST        =  3, // 4, number of lost bytes in FFS
+    Q_BYTES_MAX         =  4, // 4, number of max available bytes in FFS
+    Q_BYTES_FREE_RAW    =  5, // 4, number of free raw bytes in FFS (used internal)
+
+    Q_FD_BUF_SIZE       = 10, // 4, size of buffer used by stream functions
+
+    Q_TM_BUFADDR        = 11, // 4, testmode buffer addr
+    Q_TM_BUFSIZE        = 12, // 4, testmode ffs buffer size
+    Q_DEV_BASE          = 13, // 4, FFS device base address
+    Q_CHUNK_SIZE_MAX    = 14, // 4, max size of chunks made by non stream fkt.
+
+    // FFS versions
+    Q_FFS_API_VERSION   = 16, // 2, FFS API Version
+    Q_FFS_DRV_VERSION   = 17, // 2, FFS Driver Version
+    Q_FFS_REVISION      = 18, // 2, FFS Revision (from PRCS)
+    Q_FFS_FORMAT_READ   = 19, // 2, FFS version as read from ffs
+    Q_FFS_LASTERROR     = 20, // 2, FFS last error (from init)
+    Q_FFS_FORMAT_WRITE  = 21, // 2, FFS version as written to ffs on format
+	Q_FFS_TM_VERSION    = 22, // 2, FFS Testmode version
+
+    // File system queries
+    Q_FILENAME_MAX      = 24, // 2, max filename length
+    Q_PATH_DEPTH_MAX    = 25, // 2, max path/directory nesting depth
+    Q_FD_MAX            = 26, // 2, max numbers of simultaneous open files
+
+    Q_OBJECTS_FREE      = 32, // 2, number of objects that can be created
+    Q_INODES_USED       = 33, // 2, number of inodes used
+    Q_INODES_LOST       = 34, // 2, number of inodes lost
+    Q_OBJECTS_USED      = 33, // 2, DEPRECATED: old name for Q_INODES_USED
+    Q_OBJECTS_LOST      = 34, // 2, DEPRECATED: old name for Q_INODES_LOST
+    Q_OBJECTS_MAX       = 35, // 2, max number of valid objects allowed
+    Q_INODES_MAX        = 36, // 2, physical total max number of inodes
+    Q_INODES_HIGH       = 37, // 2, watermark for when inodes will be reclaimed
+    Q_LOST_HIGH         = 38, // 2, watermark for when data block will be reclaimed
+
+    // Device queries
+    Q_DEV_MANUFACTURER  = 48, // 2, flash manufacturer ID
+    Q_DEV_DEVICE        = 49, // 2, flash device ID
+    Q_DEV_BLOCKS        = 50, // 2, number of FFS blocks in device
+    Q_DEV_ATOMSIZE      = 51, // 2, atomsize used by FFS for this device
+    Q_DEV_DRIVER        = 52, // 2, flash device driver
+
+    // All queries below here are for debug purpose only, are unsupported
+    // and can change at any time without notice!
+
+    // Miscellaneous/Internal
+    Q_BLOCKS_FREE_MIN   = 64, // 2, Number of spare blocks (0 or 1)
+
+    Q_BLOCKS_FREE       = 70, // 2, number of free blocks
+
+    // Debug queries
+    Q_FS_FLAGS          = 80,
+    Q_FS_INODES         = 81,
+    Q_FS_ROOT           = 82,
+
+    Q_OBJECTS_TOTAL     = 90, // 2, Accumulated number of valid objects
+    Q_TOTAL_OBJECTS     = 90, // 2, DEPRECATED: old name for Q_OBJECTS_TOTAL
+
+    Q_STATS_FIRST             = 100,
+    Q_STATS_DRECLAIMS         = 100,
+    Q_STATS_IRECLAIMS         = 101,
+    Q_STATS_BRECLAIMS         = 102,
+    Q_STATS_DATA_RECLAIMED    = 103,
+    Q_STATS_INODES_RECLAIMED  = 104,
+    Q_STATS_DATA_ALLOCATED    = 105,
+
+    Q_REQUEST_ID_LAST         = 110,
+
+    Q_DEBUG_FIRST             = 120,
+    Q_DEBUG_0                 = 120,
+    Q_DEBUG_1                 = 121,
+    Q_DEBUG_2                 = 122,
+    Q_DEBUG_3                 = 123,
+    Q_DEBUG_LAST              = 127,
+
+    // individual lines of the bstat array can be returned by the following
+    // id plus the bstat index of the line wanted.
+    Q_BSTAT                   = -128
+};
+
+
+/******************************************************************************
+ * Function prototypes
+ ******************************************************************************/
+
+// Call-back function prototypes
+T_FFS_REQ_ID ffs_fcreate_nb(const char *name, void *addr, T_FFS_SIZE size,
+                         T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_fupdate_nb(const char *name, void *addr, T_FFS_SIZE size,
+                         T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_fwrite_nb(const char *name, void *addr, T_FFS_SIZE size,
+                        T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_file_write_nb(const char *name, void *addr, T_FFS_SIZE size,
+                            T_FFS_OPEN_FLAGS flags, T_RV_RETURN *cp);
+
+T_FFS_REQ_ID ffs_mkdir_nb(const char *name, T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_symlink_nb(const char *name, const char *actualpath, 
+                            T_RV_RETURN *cp);
+
+T_FFS_REQ_ID ffs_remove_nb(const char *namestruct, T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_fcontrol_nb(const char *pathname, INT8 action, int param, 
+                             T_RV_RETURN *cp);
+
+T_FFS_REQ_ID ffs_rename_nb(const char *oldname, const char *newname,
+                           T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_preformat_nb(UINT16 magic, T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_format_nb(const char *name, UINT16 magic, T_RV_RETURN *cp);
+
+T_FFS_REQ_ID  ffs_open_nb(const char *name, T_FFS_OPEN_FLAGS option, 
+                          T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_close_nb(T_FFS_FD fdi, T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_write_nb(T_FFS_FD fdi, void *src, T_FFS_SIZE size, 
+                          T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_seek_nb(T_FFS_FD fdi, T_FFS_SIZE offset, T_FFS_WHENCE whence
+                         , T_RV_RETURN *cp); 
+T_FFS_REQ_ID ffs_truncate_nb(const char *path, T_FFS_OFFSET length, 
+                             T_RV_RETURN *cp); 
+T_FFS_REQ_ID ffs_ftruncate_nb(T_FFS_FD fdi, T_FFS_OFFSET length, 
+                              T_RV_RETURN *cp);
+T_FFS_REQ_ID ffs_fdatasync_nb(T_FFS_FD fdi, T_RV_RETURN *cp); 
+
+// No-call-back function prototypes
+T_FFS_RET ffs_fcreate(const char *name, void *addr, T_FFS_SIZE size);
+T_FFS_RET ffs_fupdate(const char *name, void *addr, T_FFS_SIZE size);
+T_FFS_RET ffs_fwrite(const char *name, void *addr, T_FFS_SIZE size);
+T_FFS_RET ffs_file_write(const char *name, void *addr, T_FFS_SIZE size, 
+                         T_FFS_OPEN_FLAGS flags);
+T_FFS_SIZE ffs_fread(const char *name, void *addr, T_FFS_SIZE size);
+T_FFS_SIZE ffs_file_read(const char *name, void *addr, T_FFS_SIZE size);
+
+T_FFS_RET ffs_mkdir(const char *name);
+T_FFS_SIZE ffs_opendir(const char *name, T_FFS_DIR *dir);
+T_FFS_SIZE ffs_readdir (T_FFS_DIR *dir, char *name, T_FFS_SIZE size);
+
+T_FFS_RET ffs_symlink(const char *name, const char *actualpath);
+T_FFS_SIZE ffs_readlink(const char *name, char *addr, T_FFS_SIZE size);
+
+T_FFS_RET ffs_stat(const char *name, T_FFS_STAT *stat);
+T_FFS_RET ffs_linkstat(const char *name, T_FFS_STAT *stat);
+T_FFS_RET ffs_lstat(const char *name, T_FFS_STAT *stat);
+T_FFS_RET ffs_xlstat(const char *name, T_FFS_XSTAT *stat);
+T_FFS_RET ffs_fstat(T_FFS_FD fdi, T_FFS_STAT *stat);
+
+T_FFS_RET ffs_remove(const char *name);
+T_FFS_RET ffs_fcontrol(const char *pathname, INT8 action, int param);
+
+
+T_FFS_RET ffs_rename(const char *oldname, const char *newname);
+
+T_FFS_RET ffs_query(INT8 query, void *p);
+
+T_FFS_RET ffs_preformat(UINT16 magic);
+T_FFS_RET ffs_format(const char *name, UINT16 magic);
+
+T_FFS_FD  ffs_open(const char *name, T_FFS_OPEN_FLAGS option);
+T_FFS_RET ffs_close(T_FFS_FD fdi);
+T_FFS_SIZE ffs_write(T_FFS_FD fdi, void *src, T_FFS_SIZE amount);
+T_FFS_SIZE ffs_seek(T_FFS_FD fdi, T_FFS_SIZE offset, T_FFS_WHENCE whence);
+T_FFS_SIZE ffs_read(T_FFS_FD fdi, void *src, T_FFS_SIZE size);
+
+T_FFS_RET ffs_truncate(const char *path, T_FFS_OFFSET length); 
+
+T_FFS_RET ffs_ftruncate(T_FFS_FD fdi, T_FFS_OFFSET length); 
+
+T_FFS_RET ffs_fdatasync(T_FFS_FD fdi); 
+
+// This function is to be implemented by user. It is defined in cfgffs.c.
+extern T_FFS_RET ffs_is_modifiable(const char *name);
+
+#endif //_FFS_H_