view src/g23m-aci/aci/db.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 fa8dc04885d8
children
line wrap: on
line source

/* 
+----------------------------------------------------------------------------- 
|  Project :  PHB 
|  Modul   :  DBM
+----------------------------------------------------------------------------- 
|  Copyright 2005 Texas Instruments Berlin, AG 
|                 All rights reserved. 
| 
|                 This file is confidential and a trade secret of Texas 
|                 Instruments Berlin, AG 
|                 The receipt of or possession of this file does not convey 
|                 any rights to reproduce or disclose its contents or to 
|                 manufacture, use, or sell anything it may describe, in 
|                 whole, or in part, without the specific written consent of 
|                 Texas Instruments Berlin, AG. 
+----------------------------------------------------------------------------- 
|  Purpose :  Interface betweeen ACI_SIM and DBM module
+----------------------------------------------------------------------------- 
*/ 
#ifndef DB_H
#define DB_H

#include "typedefs.h"
#define DB_MAX_AFFECTED 5           /* As per architecture document */

#define MAX_DBs                 2   /* This needs to increased if DBM is used 
                                       for storing new databases (say SMSs)   */

#define MAX_NUM_FILES           255 /* As per architecture document           */

#define MAX_NUM_OF_SORT_INDEXS  4   /* As per architecture document           */

#define MAX_NUM_RECORDS         254 /* As per architecture document           */

#define INVALID_FIELD_ID        0xFFFF  

#define INVALID_SORT_INDEX      0xFF  

/* 
    Database type 
 */
typedef enum
{

  DB_UNMANAGED, /* Not managed (1:1 slave of another file)  */
  DB_FREELIST   /* Fast free list maintained                */

} T_DB_TYPE;

/* 
    Database affected records (History log) 
 */
typedef struct
{

  USHORT entries;                     /* Number of affected entries                 */
  USHORT field_id[DB_MAX_AFFECTED];   /* Elementary file, e.g. EF_ADN               */
  USHORT record[DB_MAX_AFFECTED];     /* Corresponding record within elementary file*/

} T_DB_CHANGED;

/* 
    Database Information 
 */
typedef struct
{
  BOOL clean;   /* Database consistent                  */
  BOOL tracked; /* Tracked for external storage device  */
} T_DB_INFO;

/* 
    File Information 
 */
typedef struct
{

  BOOL        clean;            /* Database consistent    */
  T_DB_TYPE   entry_type;       /* Type of database field */
  USHORT      record_size;      /* Record size            */
  USHORT      num_records;      /* Number of records      */
  USHORT      used_records;     /* Number of used records */

} T_DB_INFO_FIELD;

/* 
    Search node
    Note: This node is internal to DBM.
 */
typedef struct
{

  UBYTE top;
  UBYTE bottom;

} T_DB_SEARCH_NODE;

/* 
    Database return codes 
 */ 
typedef enum
{

  DB_OK                 =  0, /* Execution of command completed         */
  DB_FAIL               = -1, /* Execution of command failed within db  */
  DB_FAIL_FS            = -2, /* Unexpected failure of FFS              */
  DB_FULL               = -3, /* Database is full                       */
  DB_INVALID_DB         = -4, /* Database handle not known              */
  DB_INVALID_FIELD      = -5, /* Invalid index requested                */
  DB_INVALID_RECORD     = -6, /* Invalid record requested               */
  DB_INVALID_INDEX      = -7, /* Invalid index requested                */
  DB_INVALID_SIZE       = -8, /* Invalid size given                     */
  DB_EMPTY_RECORD       = -9, /* Attempted to read a free record        */

/* Architecture document need to be updated for following constants     */

  DB_EXISTS             = -10,/* Database already exists                */
  DB_FIELD_EXISTS       = -11,/* Elementary file already exists         */
  DB_HISTORY_FULL       = -12,/* Change log full                        */
  DB_NOT_INITIALISED    = -13,/* Database not initialised               */
  DB_IN_USE             = -14,/* Database in use                        */
  DB_RECORD_NOT_FOUND   = -15 /* Record not found                       */

} T_DB_CODE;


/* 
   This function is used in db_create_index
 */

typedef int (*T_COMP_FUNC)( int db_handle, 
                            USHORT field_id, 
                            USHORT record_1, 
                            USHORT record_2,
                            ULONG  flags );

/* 
   This function is used for db_search
 */

typedef int (*T_SEARCH_FUNC)( ULONG Flags, 
                              const UBYTE* Search_tag, 
                              int db_handle, 
                              USHORT field_id,
                              USHORT record_num );

/* 
    Interface Functions 
 */

EXTERN void db_init ( void );

EXTERN int db_create ( const char* directory,
                       UBYTE       num_of_fields,
                       BOOL        tracked );

EXTERN int db_open ( const char* directory );

EXTERN T_DB_CODE db_create_field ( int        db_handle, 
                                   T_DB_TYPE  db_type, 
                                   USHORT     field_id,
                                   USHORT     record_size, 
                                   USHORT     num_of_records );

EXTERN int db_write_record ( int          db_handle, 
                             USHORT       field_id, 
                             USHORT       record_num, 
                             USHORT       offset, 
                             USHORT       length, 
                             const UBYTE* buffer );

EXTERN int db_update_ext_bitmap(int          db_handle, 
                               USHORT       field_id, 
                               USHORT       record_num,
                               BOOL           flag); 


/* 
1) If ACI would like to use incremental sort, it needs to call
   db_update_index at end of writing/deleting the record(s).
   If the index does not exist, it would be created.
 
   Note that ACI can call this function after every record or
   after 'n' records (n>1) and DB would process it properly.
 
2) If ACI would like to use quick sort, it can go for db_create_index
   at any moment. 
 
   db_create_index is compatible with db_update_index and vice versa.

*/
EXTERN T_DB_CODE db_create_index ( int          db_handle, 
                                   USHORT       field_id, 
                                   UBYTE        sort_index, 
                                   T_COMP_FUNC  compare_function, 
                                   ULONG        flags );

EXTERN T_DB_CODE db_update_index ( int          db_handle, 
                                   USHORT       field_id, 
                                   UBYTE        sort_index, 
                                   T_COMP_FUNC  compare_function, 
                                   ULONG        flags );

EXTERN T_DB_CODE db_get_phy_from_idx ( int    db_handle, 
                                       USHORT field_id, 
                                       UBYTE  sort_index, 
                                       USHORT order_num );

EXTERN T_DB_CODE db_flush (int db_handle);

EXTERN int db_read_record ( int     db_handle, 
                            USHORT  field_id, 
                            USHORT  record_num, 
                            USHORT  offset, 
                            USHORT  length, 
                            UBYTE*  buffer );

EXTERN T_DB_CODE db_read_change_log ( int           db_handle, 
                                      T_DB_CHANGED* changed);

EXTERN T_DB_CODE db_delete_record ( int    db_handle,
                                    USHORT field_id, 
                                    USHORT record_num );

EXTERN T_DB_CODE db_info ( int        db_handle, 
                           T_DB_INFO* db_info );

EXTERN T_DB_CODE db_info_field ( int              db_handle,  
                                 USHORT           field_id, 
                                 T_DB_INFO_FIELD* info_field );

EXTERN int db_find_free_record  ( int    db_handle,
                                  USHORT field_id );

EXTERN T_DB_CODE db_field_changed ( int    db_handle, 
                                    USHORT field_id,
                                    BOOL*  changed );

EXTERN T_DB_CODE db_record_empty ( int    db_handle,
                                   USHORT field_id,
                                   USHORT record_num,
                                   BOOL*  empty );

EXTERN int db_search ( int               db_handle, 
                       USHORT            field_id, 
                       UBYTE             sort_index, 
                       SHORT*            order_num,
                       T_SEARCH_FUNC     search_function, 
                       ULONG             flags, 
                       const UBYTE*      search_tag );

EXTERN int db_get_last_fs_error ( void );

EXTERN T_DB_CODE db_close ( int db_handle );

EXTERN void db_exit ( void );

EXTERN T_DB_CODE db_remove_index  ( int    db_handle,
                                    USHORT field_id,
                                    UBYTE  sort_index );

EXTERN T_DB_CODE db_remove_field ( int    db_handle, 
                                   USHORT field_id );

EXTERN T_DB_CODE db_remove ( const char* directory );

#endif