FreeCalypso > hg > fc-magnetite
diff src/aci2/mfw/mfw_bt_flash.c @ 3:93999a60b835
src/aci2, src/condat2: import of g23m/condat source pieces from TCS211
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Sep 2016 00:29:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/aci2/mfw/mfw_bt_flash.c Mon Sep 26 00:29:36 2016 +0000 @@ -0,0 +1,737 @@ +/* ++-------------------------------------------------------------------+ +| PROJECT: MMI-Framework (8445) $Workfile:: mfw_bt_flash.c $| +| $Author:: Thomas Sommer $Revision:: 1 $| +| CREATED: 03.05.04 $Modtime:: 22.04.04 11:07 $| +| STATE : code | ++-------------------------------------------------------------------+ + + + MODULE : MFW_BT_DB + + PURPOSE : This module contains the functions for MFW Bluetooth Data Base facilities. It is a LOCAL + DATA BASE, thus doesn't require the BT stack to be started. Just call the mfw_bt_flash_init( ) + function to be able to use the following functions. + + +*/ + +#define ENTITY_MFW + +#include <string.h> + +#if defined (NEW_FRAME) + +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" + +#else + +#include "STDDEFS.H" +#include "custom.h" +#include "gsm.h" +#include "vsi.h" + +#endif + +#include "mfw_ffs.h" +#include "mfw_bte.h" +#include "mfw_bt_dm.h" +#include "mfw_bt_geh.h" +#include "mfw_bt_flash.h" + + +/***************************************************************************** + ** Constants. Please do not modify length of the parameters, because of alignement + constraints in flash + *****************************************************************************/ + + +/* this is the template for the conf file in case it does not exist or is corrupted */ + +static const tMFW_BT_CFG mfw_bt_default_cfg = { + MFW_BT_ENABLED, + MFW_BT_DISCOVERABLE_MODE, + NULL +}; + +/* Also keep an image of the flash file in RAM */ +static tMFW_BT_CFG mfw_bt_current_cfg; + +/* we store the devices data base in a static structure because it will be loaded each time +the phone is powered on: there is no need here to allocate/free memory dynamically . */ +static T_MFW_BT_REM_DEVICE mfw_bt_device_db[MFW_BT_NUM_REM_DEVICE]; +const UINT8 MFW_BT_FLASH_DB_SIZE = MFW_BT_NUM_REM_DEVICE*sizeof(T_MFW_BT_REM_DEVICE); + +/* newly found devices => RAM database */ +static T_MFW_BT_REM_DEVICE mfw_bt_inq_db[MFW_BT_NUM_REM_DEVICE]; + + +/* +* Local functions +*/ + +/* update the device data base in flash */ +static int mfw_bt_flash_store_db(void); +/* load the device data base in RAM */ +static int mfw_bt_flash_read_db(void); +/* store config file in flash */ +static int mfw_bt_flash_store_cfg( void ); +/* load config file in RAM */ +static int mfw_bt_flash_read_cfg( void ); + + + +/******************************************************************************* + + $Function: mfw_bt_flash_init + + $Description: update the RAM information with the files in flash + + $Returns: TRUE if OK, wrong is something failed => no stored file, and not possible to + create a new one. Typically, this mean the flash is not formatted. + + $Arguments: None + +*******************************************************************************/ +BOOL mfw_bt_flash_init( void ) +{ + int status_db, status_cfg; + /* first, read config file */ + status_cfg = mfw_bt_flash_read_cfg( ); + /* then load the saved device data base in RAM */ + status_db = mfw_bt_flash_read_db( ); + if( status_cfg < 0 || status_db < 0 ) + /* something wrong happened, notify it */ + return FALSE; + + return TRUE; +} + + + + +/******************************************************************************* + + $Function: mfw_bt_read_status + + $Description: update the flash information with the files in flash + + $Returns: TRUE if OK, wrong is something failed => no stored file, and not possible to + create a new one. Typically, this mean the flash is not formatted + + $Arguments: UINT32, value of bt_enable flag. 1 if enabled. + +*******************************************************************************/ +BOOL mfw_bt_read_status( void ) +{ + return mfw_bt_current_cfg.bt_enable; +} + + + +/******************************************************************************* + + $Function: mfw_bt_store_status + + $Description: update the BT status in flash + + $Returns: MFW_BT_SUCCESS if OK, wrong is something failed => no stored file, and not possible to + create a new one. Typically, this mean the flash is not formatted + + $Arguments: new BT status: TRUE if enabled, FALSE if disabled. + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_store_status( BOOL new_enable_status ) +{ + mfw_bt_current_cfg.bt_enable = new_enable_status; + if( mfw_bt_flash_store_cfg() != (int)EFFS_OK) + return MFW_BT_FAIL; + + return MFW_BT_SUCCESS; +} + +/******************************************************************************* + + $Function: mfw_bt_read_visibility + + $Description: read the discoverability setting + + $Returns: discoverability setting => TRUE if visible, FALSE if hidden + + $Arguments: None + +*******************************************************************************/ +BOOL mfw_bt_read_visibility( void ) +{ + return mfw_bt_current_cfg.discoverable; +} + +/******************************************************************************* + + $Function: mfw_bt_store_visibility + + $Description: store the discoverability setting + + $Returns: MFW_BT_SUCCESS if OK, MFW_BT_FAIL is something failed + => no stored file, and not possible to + create a new one. Typically, this mean the flash is not formatted + + $Arguments: new discoverability setting: TRUE if visible, FALSE if hidden + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_store_visibility( BOOL new_visibility ) +{ + mfw_bt_current_cfg.discoverable = new_visibility; + if( mfw_bt_flash_store_cfg() != (int)EFFS_OK) + return MFW_BT_FAIL; + + return MFW_BT_SUCCESS; +} + +/******************************************************************************* + + $Function: mfw_bt_read_local_name + + $Description: read local BT name + + $Returns: local BT name. Pointer to a the string in the local database => this has to + be copied if needed for other things. + + $Arguments: None + +*******************************************************************************/ +UINT8* mfw_bt_read_local_name( void ) +{ + return (UINT8*) mfw_bt_current_cfg.local_device_name; +} + +/******************************************************************************* + + $Function: mfw_bt_store_local_name + + $Description: update the local name in flash + + $Returns: MFW_BT_SUCCESS if OK, MFW_BT_FAIL is something failed + => typically, this mean the flash is not formatted + + $Arguments: new local name. This data is copied and not freed. + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_store_local_name( char* new_name ) +{ + if( new_name == NULL ) + return MFW_BT_FAIL; + mfwStrncpy(mfw_bt_current_cfg.local_device_name, new_name, MFW_BT_NAME_LENGTH); + + if( mfw_bt_flash_store_cfg() != (int)EFFS_OK) + return MFW_BT_FAIL; + + return MFW_BT_SUCCESS; +} + + + + + + +/******************************************************************************* + + $Function: mfw_bt_flash_store_device + + $Description: stores peer device to NVRAM. If device not already in data base => add it. If + there, update its information. !!! It will overwrite existing information! Use + this function wisely!=> typically, call mfw_bt_flash_get_device_info before to + get the pointer of an existing device, or allocate memory for a new one. + + $Returns: MFW_BT_DATA_BASE_FULL if data base full. MFW_BT_FAIL if not + able to write in flash. Else, success. + + $Arguments: pointer to a device descriptor. IF NOT ALREADY IN THE DATABASE, WILL BE + COPIED. IF ALREADY IN THE DATABASE, THE DATA IS NOT COPIED! + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_flash_store_device( T_MFW_BT_REM_DEVICE * p_rem_device) +{ + UINT8 i; + + /* first verify if we already have the device in our list */ + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + if( memcmp(&mfw_bt_device_db[i].bd_addr[0], &p_rem_device->bd_addr[0], BD_ADDR_LEN) == 0) + /* ok, we found our device */ + break; + } + if(i == MFW_BT_NUM_REM_DEVICE) + { + /* we are here => our device is not yet known. */ + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + if(!(mfw_bt_device_db[i].in_use)) + /* we just found an empty record, great. */ + break; + } + /* verify if the database is not full */ + if( i == MFW_BT_NUM_REM_DEVICE) + return MFW_BT_DATA_BASE_FULL; + + + /* we are here. This means either we found our device in the DB, either we have an empty + record to fill in with our new device ( typically into the inquiry data base ). So first verify + if it's a know device. */ + if( p_rem_device != &mfw_bt_device_db[i]) + { + /* it's a new record, so copy it in our local db */ + memcpy(&mfw_bt_device_db[i], p_rem_device, sizeof(T_MFW_BT_REM_DEVICE)); + } + mfw_bt_device_db[i].in_use = TRUE; + mfw_bt_device_db[i].is_new = FALSE; + + + + /* update data base in nvram */ + if( mfw_bt_flash_store_db() != EFFS_OK ) + return MFW_BT_FAIL; + return MFW_BT_SUCCESS; +} + + + +/******************************************************************************* + + $Function: mfw_bt_clean_inq_db + + $Description: clean the contents of the inquiry data base in RAM. To be called before each + new inquiry. + + $Returns: + + $Arguments: + +*******************************************************************************/ +void mfw_bt_clean_inq_db( void ) +{ + UINT8 i; + /* + ** CQ21834 : use the sizeof function to take into account any padding bytes which may have been added + */ + memset( (void*)mfw_bt_inq_db, 0, sizeof(mfw_bt_inq_db)); + for( i=0;i<MFW_BT_NUM_REM_DEVICE; i++ ) + mfw_bt_inq_db[i].is_new = TRUE; +} + + + +/******************************************************************************* + + $Function: mfw_bt_add_inq_device + + $Description: copy the information received into the RAM inquiry database. + + $Returns: T_MFW_BT_STATUS. MFW_BT_DATA_BASE_FULL or SUCCESS. + + $Arguments: pointer to an inquiry result. Data is copied. + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_add_inq_device( T_MFW_BT_DM_INQ_RES* p_rem_device) +{ + UINT8 i; + + /* first verify if we already have the device in our list */ + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + if(!(mfw_bt_inq_db[i].in_use)) + { + /* we just found an empty record, great. */ + break; + } + else if (memcmp(&mfw_bt_inq_db[i].bd_addr, &p_rem_device->bd_addr, sizeof(BD_ADDR)) == 0) + { + /* we already know about this device ... just exit indicating SUCCESS */ + return MFW_BT_SUCCESS; + } + } + + /* verify if the database is not full */ + if(i == MFW_BT_NUM_REM_DEVICE) + return MFW_BT_DATA_BASE_FULL; + + /* we found an unused device record. Update it */ + mfw_bt_inq_db[i].in_use = TRUE; + memcpy(mfw_bt_inq_db[i].bd_addr, p_rem_device->bd_addr, BD_ADDR_LEN); + memcpy(mfw_bt_inq_db[i].dev_class, p_rem_device->dev_class, BD_ADDR_LEN); + return MFW_BT_SUCCESS; + +} + + + +/******************************************************************************* + + $Function: mfw_bt_add_disc_device + + $Description: copy the information received into the RAM inquiry database. + + $Returns: T_MFW_BT_STATUS. MFW_BT_DATA_BASE_FULL or SUCCESS. + + $Arguments: pointer to a discovery result. Data is copied. + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_add_disc_device( T_MFW_BT_DM_DISC_RES* p_rem_device) +{ + UINT8 i; + + /* first verify if we already have the device in our list */ + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + if( memcmp(&mfw_bt_inq_db[i].bd_addr, &p_rem_device->bd_addr, sizeof(BD_ADDR)) == 0) + { + /* we just found an empty record, great. */ + break; + } + } + + /* verify if the database is not full */ + if(i == MFW_BT_NUM_REM_DEVICE) + return MFW_BT_DATA_BASE_FULL; + + /* now update the device with the new informations */ + mfwStrncpy((char*)mfw_bt_inq_db[i].name, (char*)p_rem_device->name, MFW_BT_NAME_LENGTH); + /* + ** CQ21834 : Update the Friendly Name also. + */ + mfwStrncpy((char*)mfw_bt_inq_db[i].friendly_name, (char*)p_rem_device->name, MFW_BT_NAME_LENGTH); + mfw_bt_inq_db[i].services = p_rem_device->services; + + return MFW_BT_SUCCESS; + +} + +/******************************************************************************* + + $Function: mfw_bt_get_device_info + + $Description: gets the device record of a stored device. + + $Returns: NULL if device not found. Pointer to a device structure if found. This data should + be copied if wanted to be used somewhere else. + If the device is not stored in Flash, the is_new flag is set => this means it is + a newly found device ( from an inquiry or discovery result ). + + $Arguments: DB_ADDR of the device wanted. + + +*******************************************************************************/ +T_MFW_BT_REM_DEVICE * mfw_bt_get_device_info(BD_ADDR bd_addr) +{ + UINT8 i; + T_MFW_BT_REM_DEVICE *p_device; + + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + if (mfw_bt_device_db[i].in_use) + { + if(memcmp(&mfw_bt_device_db[i].bd_addr[0], &bd_addr[0], BD_ADDR_LEN) == 0) + { + return &mfw_bt_device_db[i]; + } + } + } + + /* we didn't find our device, look into the inquiry db */ + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + if (mfw_bt_inq_db[i].in_use) + { + if(memcmp(&mfw_bt_inq_db[i].bd_addr[0], &bd_addr[0], BD_ADDR_LEN) == 0) + { + return &mfw_bt_inq_db[i]; + } + } + } + + return NULL; + +} + + +/******************************************************************************* + + $Function: mfw_bt_get_device_by_service + + $Description: gets a list of device records corresponding to the given service. If service = 0, + will return all the stored devices. + + $Returns: T_MFW_BT_STATUS + + $Arguments: services => mask of services to look for + + pp_device: a pointer to a T_MFW_BT_REM_DEVICE[MFW_BT_NUM_REM_DEVICE] + array. THIS MEMORY HAVE TO BE ALLOCATED!!! This function will add the + pointers one by one into this array!!! The pointers are pointing on local data => + might need to be copied. + (Note ... The pointer pp_device is a pointer to an ARRAY OF POINTERS of type T_MFW_BT_REM_DEVICE, + ie declared in the calling function as T_MFW_BT_REM_DEVICE *ptr_device[MFW_BT_NUM_REM_DEVICE]) + + number_of_devices: will be used to return the number of devices matching + the service mask. + +*******************************************************************************/ +void mfw_bt_get_device_by_service( T_MFW_BT_SERVICE_MASK services, + T_MFW_BT_REM_DEVICE ** pp_device, + UINT8* number_of_devices ) +{ + UINT8 i; + + *number_of_devices = 0; + if( services == 0 ) + services = BTA_ALL_SERVICE_MASK; + + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + /* + ** CQ21834 : The entry in the known devices database is valid only if the 'in_use' flag is TRUE AND + ** the 'is_new' flag is FALSE. + */ + if ( ( mfw_bt_device_db[i].in_use == TRUE ) && (mfw_bt_device_db[i].is_new == FALSE)) + { + if ( (mfw_bt_device_db[i].services & services) != 0 ) + { + MFW_BT_TRACE_P1("mfw_bt_get_device_by_service(), Device %d is Active and matches the criteria", i); + pp_device[(*number_of_devices)] = &mfw_bt_device_db[i]; + (*number_of_devices) ++; + } + } + } + return; +} + + + +/******************************************************************************* + + $Function: mfw_bt_flash_delete_device + + $Description: deletes the device from nvram + + $Returns: MFW_BT_FAIL, MFW_BT_SUCCESS, + MFW_BT_UNKNOWN_DEVICE + + $Arguments: BD_ADDR of the device to remove from flash. + +*******************************************************************************/ +T_MFW_BT_STATUS mfw_bt_flash_delete_device(BD_ADDR bd_addr) +{ + UINT8 i; + T_MFW_BT_STATUS status; + T_MFW_BT_REM_DEVICE *p_device; + + for(i=0; i<MFW_BT_NUM_REM_DEVICE; i++) + { + if(memcmp(&mfw_bt_device_db[i].bd_addr[0], &bd_addr[0], BD_ADDR_LEN) == 0) + { + /* + ** CQ21834 : Erase the details from the Device Database and check whether the + ** device is in the Inquiry Database. If so, set the 'is_new' flag in the Inquiry Db + ** to TRUE to indicate that the device is 'not known' + */ + memset(&mfw_bt_device_db[i], 0x00, sizeof(T_MFW_BT_REM_DEVICE)); + + status = mfw_bt_flash_store_device(&mfw_bt_device_db[i]); + + p_device = mfw_bt_get_device_info(bd_addr); + + if (p_device != NULL) + { + p_device->is_new = TRUE; + } + + return status; + + } + } + + return MFW_BT_UNKNOWN_DEVICE; +} + + + + +/******************************************************************************* + + $Function: mfw_bt_flash_store_db + + $Description: write the whole device data base in flash + + $Returns: =0 if ok, <0 if error ( see ffs code ) + + $Arguments: none + +*******************************************************************************/ +static int mfw_bt_flash_store_db(void) +{ + effs_t status; + + /* + ** CQ21834 : use the sizeof function to take into account any padding bytes which may have been added + */ + status = flash_data_write( MFW_BT_CFG_ROOT_PATH, + MFW_BT_SEC_FILE, + (void *)&mfw_bt_device_db, + sizeof(mfw_bt_device_db)); + if ( status != EFFS_OK ) + { + /* mmh thats bad, well go with stored default config. */ + MFW_BT_TRACE_P1(" mfw_bt_nv_init_device_db(): flash_data_write failed: %d", status ); + } + + return (int)status; +} + + + +/******************************************************************************* + + $Function: mfw_bt_flash_read_cfg + + $Description: load the BT config from flash to RAM + + $Returns: >0 if read ok, =0 if create default ok, <0 if error ( see ffs code ) + + $Arguments: none + +*******************************************************************************/ +static int mfw_bt_flash_read_cfg( void ) +{ + int status; + effs_t ffs_status; + + /* first, reset RAM-based config */ + memset(&mfw_bt_current_cfg,0x00,sizeof(mfw_bt_current_cfg)); + + /* then read the one in flash */ + status = flash_data_read ( MFW_BT_CFG_ROOT_PATH, + MFW_BT_CFG_FILE, + (void *)&mfw_bt_current_cfg, + sizeof(tMFW_BT_CFG) ); + if( status <= 0) + { + /* no config file? => update the RAM settings with the default ones */ + mfw_bt_current_cfg.bt_enable = MFW_BT_ENABLED; + mfw_bt_current_cfg.discoverable = MFW_BT_DISCOVERABLE_MODE; + memset(&mfw_bt_current_cfg.local_device_name, 0x00, MFW_BT_NAME_LENGTH); + + /* then try to create one */ + MFW_BT_TRACE(" mfw_bt_read_cfg_file(): flash_data_read failed. Create default one."); + ffs_status = flash_data_write(MFW_BT_CFG_ROOT_PATH, + MFW_BT_CFG_FILE, + (void *)&mfw_bt_current_cfg, + sizeof(tMFW_BT_CFG)); + if ( ffs_status != EFFS_OK ) + { + /* mmh thats really bad! */ + MFW_BT_TRACE_P1(" mfw_bt_read_cfg_file(): flash_data_write failed: %d", ffs_status ); + status = (int)ffs_status; + } + else + status = sizeof(tMFW_BT_CFG); + } + + /* else, nothing to do: mfw_bt_current_cfg has already been updated */ + return status; +} + + + + +/******************************************************************************* + + $Function: mfw_bt_flash_store_cfg + + $Description: writes the cfg file in flash + + $Returns: =0 if ok, <0 if error ( see ffs code ) + + $Arguments: none + +*******************************************************************************/ +static int mfw_bt_flash_store_cfg( void ) +{ + effs_t status; + + status = flash_data_write(MFW_BT_CFG_ROOT_PATH, + MFW_BT_CFG_FILE, + (void *)&mfw_bt_current_cfg, + sizeof(mfw_bt_current_cfg)); + if ( status != EFFS_OK ) + { + /* mmh thats really bad! */ + MFW_BT_TRACE_P1(" mfw_bt_store_cfg_file(): flash_data_write failed: %d", status ); + } + + /* else, nothing to do, just return */ + return (int)status; +} + + + +/******************************************************************************* + + $Function: mfw_bt_flash_read_db + + $Description: load the device data base from flash to RAM + + $Returns: >0 if read ok, =0 if create default ok, <0 if error ( see ffs code ) + + $Arguments: none + +*******************************************************************************/ +static int mfw_bt_flash_read_db(void) +{ + int status; + effs_t ffs_status; + + /* Phone needs to store in nvram some information about other bluetooth devices + which it regularly communicates with. The information that has to be stored typically + are bdaddr, name, link_key, trust relationship etc. */ + MFW_BT_TRACE( "mfw_bt_flash_read_db()"); + + /* first, reset RAM-based db */ + memset(&mfw_bt_device_db,0x00,sizeof(mfw_bt_device_db)); + + /* try to read existing device database stored in nv-ram */ + status = flash_data_read( MFW_BT_CFG_ROOT_PATH, + MFW_BT_SEC_FILE, + (void *)&mfw_bt_device_db, + sizeof(mfw_bt_device_db)); + + if ( status <= 0 ) + { + /* failed => the device db file doesn't exist. Create an empty one. */ + MFW_BT_TRACE(" mfw_bt_flash_read_db(): flash_data_read failed. Create one" ); + + ffs_status = flash_data_write( MFW_BT_CFG_ROOT_PATH, + MFW_BT_SEC_FILE, + (void *)&mfw_bt_device_db, + sizeof(mfw_bt_device_db)); + + if ( ffs_status != EFFS_OK ) + { + /* mmh thats really bad, well go with stored default config. */ + MFW_BT_TRACE_P1(" mfw_bt_flash_read_db(): flash_data_write failed: %d", ffs_status ); + status = (int)ffs_status; + } + else + status = sizeof(tMFW_BT_CFG); + } + return status; +} + + + + + + +