view src/cs/drivers/drv_app/ffs/board/tffs.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 test scaffold/framework
 *
 * $Id: tffs.h 1.7.1.15 Fri, 19 Dec 2003 12:00:13 +0100 tsj $
 *
 ******************************************************************************/

#include "ffs/ffs.h"


/******************************************************************************
 * Compile Defines
 ******************************************************************************/

// Maximum number of parameters for a test case
#define FFS_TESTCASE_PARAMS_MAX 2

// Maximum length of a test case name
#define FFS_TESTCASE_NAME_MAX 11


/******************************************************************************
 * Types used in test framework
 ******************************************************************************/

struct ffs_state_s {
    int inodes_used;   // taken from bstat entry for inodes block
    int inodes_lost;   // taken from bstat entry for inodes block
    int objects_free;  // taken from bstat entry for inodes block
    int objects_total; // accumulated number of valid objects

    int bytes_used;    // accumulated over all blocks
    int bytes_lost;    // accumulated over all blocks
    int bytes_free;    // accumulated over all blocks

    int blocks_free;   // accumulated over all blocks
};

struct ffs_params_s {
    // Actual parameters
    int filename_max;
    int pathdepth_max;
    int inodes_max;     
    int bytes_max;
    int numblocks;
    int atomsize;
    int blocks_free_min;

    // Pseudo parameters
    int block_size;  // size of each block
    int bytes_avail; // size of available data space
    int data_blocks; // number of blocks available for data storage
};

struct this_test_s {
    char name[FFS_TESTCASE_NAME_MAX];  // name of currently executing test case
    int  numcalls;  // total number of ffs function calls so far
};


/******************************************************************************
 * Types used in test cases
 ******************************************************************************/

typedef int (*pf_t)(int, int);

enum TEST_CASE_FLAGS {
    IT  = 0x01, // test case is runnable in target
    PC  = 0x02, // test case is runnable on PC
    RND = 0x04  // test case is randomly runnable
};

struct testcase_s {
    char *name;
    int flags;
    pf_t function;
    char *comment;
};

struct test_file_s {
    const char *name;
    char *data;
    int   size;
};

extern char *ffs_strerror(effs_t error);


/******************************************************************************
 * Globals
 ******************************************************************************/

extern struct ffs_params_s param;

extern struct dir_s dir;
extern struct stat_s stat;
extern struct xstat_s xstat;

extern int error;

extern int smallbuf_size;
extern char *smallbuf;
extern int bigbuf_size;
extern char *bigbuf;


/******************************************************************************
 * Functions
 ******************************************************************************/

void test_listall(void);
int  test_run(char *testname);
void test_init(int keepgoing);
void test_exit(void);
void test_begin(char *name, int *params);
void test_end(struct this_test_s *test, int n);
void test_error(struct this_test_s *test, int n);

int test_expect(int error, int xerror);
int test_expect_ok(int n);
int test_expect_equal(int n, int xn);
int test_expect_not_equal(int n, int xn);
int test_expect_greater_than(int n, int xn);
int test_expect_data(const void *data1, const void *data2, int size);
int test_expect_file(const char *name, const void *data, int size);
int test_expect_state(struct ffs_state_s *old, struct ffs_state_s *new);
int test_expect_objects(struct ffs_state_s *old, struct ffs_state_s *new);

int test_ffs_params_get(void);
int test_ffs_state_get(struct ffs_state_s *s);
void test_state_print(struct ffs_state_s *state);
void test_state_objects_print(struct ffs_state_s *old, struct ffs_state_s *new);
void test_state_bytes_print(struct ffs_state_s *old, struct ffs_state_s *new);
void test_ffs_state_copy(struct ffs_state_s *dst, struct ffs_state_s *src);
void test_statistics_print(void);

#define expect(error, xerror) if (test_expect(error, xerror)) return 1;
#define expect_ok(error) if (test_expect_ok(error)) return 1;
#define expect_eq(n, xnum) if (test_expect_equal(n, xnum)) return 1;
#define expect_ne(n, xnum) if (test_expect_not_equal(n, xnum)) return 1;
#define expect_gt(n, xnum) if (test_expect_greater_than(n, xnum)) return 1;

#if 0
// This does NOT work when <addr, size> is macro-expanded!
#define expect_file(name, addr, size) \
    if (test_expect_file(name, addr, size)) return 1;
#endif


/******************************************************************************
 * Test (blocking) versions of FFS API functions
 ******************************************************************************/

effs_t tffs_fcreate(const char *name, void *addr, int size);
effs_t tffs_fupdate(const char *name, void *addr, int size);
effs_t tffs_fwrite(const char *name, void *addr, int size);
effs_t tffs_file_write(const char *name, void *addr, int size, uint16 option);
int    tffs_fread(const char *name, void *addr, int size);
int    tffs_file_read(const char *name, void *addr, int size);
effs_t tffs_mkdir(const char *name);
int    tffs_opendir(const char *name, struct dir_s *dir);
int    tffs_readdir (struct dir_s *dir, char *name, int8 size);
effs_t tffs_symlink(const char *name, const char *actualpath);
int    tffs_readlink(const char *name, char *addr, int size);
int tffs_rename(const char *oldname, const char *newname);
effs_t tffs_stat(const char *name, struct stat_s *stat);
effs_t tffs_xstat(const char *name, struct xstat_s *stat);
effs_t tffs_fstat(fd_t fdi, struct stat_s *stat);
effs_t tffs_xfstat(fd_t fdi, struct xstat_s *stat);
effs_t tffs_linkstat(const char *name, struct stat_s *stat);
effs_t tffs_lstat(const char *name, struct stat_s *stat);
effs_t tffs_xlstat(const char *name, struct xstat_s *stat);
effs_t tffs_remove(const char *name);
effs_t tffs_fcontrol(const char *pathname, int8 action, uint16 param);
effs_t tffs_query(int8 query, void *p);
effs_t tffs_preformat(uint16 magic);
effs_t tffs_format(const char *name, uint16 magic);
effs_t tffs_initialize(void);
effs_t tffs_exit(void);
fd_t tffs_open(const char *pathname, ffs_options_t options);
effs_t tffs_close(fd_t fdi);
int tffs_write(fd_t fdi, void *addr, int size);
int tffs_read(fd_t fdi, void *addr, int size);
int tffs_seek(fd_t fdi, int offset, int whence);
effs_t tffs_truncate(const char *path, offset_t length); 
effs_t tffs_ftruncate(fd_t fdi, offset_t length); 
effs_t tffs_fdatasync(fd_t fdi); 

/******************************************************************************
 * Platform/OS dependent functions
 ******************************************************************************/

// Defined in task.c
#if (WITH_TFFS == 1)
extern void tffs_delay(int delay);
extern int tffs_wait(const char *name);
extern struct ffs_cnfpath_s *tffs_cnfpath_get(void);
extern UINT32 tffs_timer_begin(void);
extern UINT32 tffs_timer_end(UINT32 time_begin);
#else
#define tffs_delay(delay)
#endif