FreeCalypso > hg > fc-tourmaline
view src/cs/drivers/drv_app/ffs/ffs.h @ 303:f76436d19a7a default tip
!GPRS config: fix long-standing AT+COPS chance hanging bug
There has been a long-standing bug in FreeCalypso going back years:
sometimes in the AT command bring-up sequence of an ACI-only MS,
the AT+COPS command would produce only a power scan followed by
cessation of protocol stack activity (only L1 ADC traces), instead
of the expected network search sequence. This behaviour was seen
in different FC firmware versions going back to Citrine, and seemed
to follow some law of chance, not reliably repeatable.
This bug has been tracked down and found to be specific to !GPRS
configuration, stemming from our TCS2/TCS3 hybrid and reconstruction
of !GPRS support that was bitrotten in TCS3.2/LoCosto version.
ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3
version and had to be pulled from TCS2 - but as it turns out,
there is a new field in the MMR_REG_REQ primitive that needs to be
set correctly, and that psa_mms.c module is the place where this
initialization needed to be added.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 08 Jun 2023 08:23:37 +0000 |
parents | 4e78acac3d88 |
children |
line wrap: on
line source
/****************************************************************************** * 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 #include "ffs.cfg" #endif #ifdef _RVF #include "rvf/rvf_api.h" #include "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 ******************************************************************************/ #ifdef _ETM_ /* Used by PC EMT only*/ int FEXPORT ffs_initialize(void); int FEXPORT ffs_preformat(uint16 magic); int FEXPORT ffs_format(const char *name, uint16 magic); int FEXPORT ffs_file_write(const char *name, void *buf, int size, ffs_options_t flags); int FEXPORT ffs_file_read(const char *name, void *buf, int size); int FEXPORT ffs_readlink(const char *name, char *buf, int size); int FEXPORT ffs_mkdir(const char *name); int FEXPORT ffs_opendir(const char *name, struct dir_s *dir); int FEXPORT ffs_readdir(struct dir_s *dir, char *name, int size); int FEXPORT ffs_symlink(const char *name, const char *actualpath); int FEXPORT ffs_stat(const char *name, struct stat_s *stat); int FEXPORT ffs_xlstat(const char *name, struct xstat_s *xstat); int FEXPORT ffs_query(int8 query, void *pt); int FEXPORT ffs_fcontrol(const char *name, int8 action, int param); int FEXPORT ffs_remove(const char *name); int FEXPORT ffs_open(const char *pathname, ffs_options_t option); int FEXPORT ffs_close(fd_t fdi); int FEXPORT ffs_write(fd_t fdi, void *src, int size); int FEXPORT ffs_read(fd_t fdi, void *src, int size); int FEXPORT ffs_tffs(const char *string); #else // 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 #endif //_FFS_H_