www.pudn.com > drivers.rar > pcmcode.c
/****************************************************************************** * Flash File System (ffs) * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com * * Condat PCM Compatibility Support * * $Id: pcmcode.c 1.46 Tue, 06 Nov 2001 11:55:21 +0100 tsj $ * ******************************************************************************/ #ifndef TARGET #include "ffs.cfg" #endif #include#include "ffs/pcm.h" #include "ffs/ffs.h" #include "ffs/board/ffstrace.h" #if (TARGET == 1) #include "sys.cfg" #else #define STD 6 #define NULL 0 #endif extern const T_PCM_DESCRIPTION pcm_table[]; extern const UBYTE pcm_default_values[]; extern UBYTE pcm_mem []; extern UBYTE std; /* ************************************************************************** * 加入读取/mmi/version/imei.c 的函数 * ************************************************************************** */ static effs_t PCM_ReadIMEI( void ); static effs_t PCM_ReadIMEI( void ) { UBYTE tempIMEI[ 16 ],tempLEN_IMEI[ 8 ],tempLEN_START,tempLEN; UBYTE i,temp ; tempLEN = 16; ttw(ttr(TTrInit, "PCM_ReadIMEI " NL)); i = 0; if(ffs_fread("/pcm/IMEI", tempIMEI,tempLEN) > 0) { for( temp = 0 ; temp < (tempLEN/2);temp++) { tempLEN_IMEI[ temp ] = ( tempIMEI[ i ] & 0x0f) | (((tempIMEI[ i + 1 ] & 0x0f)<<4) & 0xf0) ; pcm_mem[pcm_table[ 1 ].start + 2 + temp] = tempLEN_IMEI [ temp ]; i = i + 2 ; } ttw(ttr(TTrInit, "PCM_ReadIMEI effs ok" NL)); return EFFS_OK; } else { ttw(ttr(TTrInit, "PCM_ReadIMEI effs fail" NL)); return -1; } } /****************************************************************************** * ******************************************************************************/ // pcm_Init() has been renamed to pcm_init() so that it is not called // anywhere else than it should. The old pcm_Init() is now empty. This new // pcm_init() scans through the pcm file table and attempts to read each // file from ffs into the pcm RAM image. drv_Return_Type pcm_Init(void) { return PCM_INITIALIZED; } // Note that PCM file data chunks start with one byte for the file data // checksum, followed by another byte for the version. The third byte // (offset 2) is the start of the actual filedata. We ignore these first two // bytes e.g. we only read/write the actual file data! // look up a PCM file int pcm_lookup(char *pcm_name) { int i = 0; while (pcm_table[i].identifier != NULL) { if (!strcmp((char *) pcm_name, pcm_table[i].identifier + 5)) return i; i++; } return -1; // not found. } drv_Return_Type pcm_init(void) { int i = 0, size; effs_t error; ttw(ttr(TTrInit, "pcm_init" NL)); std = STD; while (pcm_table[i].identifier != NULL) { size = (pcm_table[i].length - 2) * pcm_table[i].records; if (ffs_file_read(pcm_table[i].identifier, &pcm_mem[pcm_table[i].start + 2], size) != size) { // copy defaults to pcm_mem memcpy (&pcm_mem[pcm_table[i].start] + 2, &pcm_default_values[pcm_table[i].start - 2*i], pcm_table[i].records * (pcm_table[i].length - 2)); } // Bgn >>> Added by LI Xiaohan with Edwards' instruction 04/07/28 // To syncronize the IMEI if( 1 == i ) { ttw(ttr(TTrInit, "pcm_init PCM_ReadIMEI " NL)); error = PCM_ReadIMEI(); } // End <<< if (error < EFFS_OK) { // copy defaults to pcm_mem memcpy (&pcm_mem[pcm_table[i].start] + 2, &pcm_default_values[pcm_table[i].start - 2*i], pcm_table[i].records * (pcm_table[i].length - 2)); } pcm_mem[pcm_table[i].start + 1] = 1; // file version i++; } return PCM_INITIALIZED; } drv_Return_Type pcm_GetFileInfo(UBYTE * in_FileName, pcm_FileInfo_Type * out_FileInfoPtr) { int i = pcm_lookup((char*)in_FileName); ttw(ttr(TTrPcmRead, "pcm_gfi(%s)" NL, in_FileName)); if (i == -1) return PCM_INVALID_FILE; out_FileInfoPtr->FileLocation = &pcm_mem [pcm_table[i].start+2]; out_FileInfoPtr->FileSize = pcm_table[i].length -2; // As Condat has determined that all files is version 1, we just // hardwire exactly that! // out_FileInfoPtr->Version = pcm_mem [pcm_table[i].start + 1]; out_FileInfoPtr->Version = 1; return PCM_OK; } /****************************************************************************** * Normal read/write functions ******************************************************************************/ drv_Return_Type pcm_ReadFile(UBYTE * in_FileName, USHORT in_BufferSize, UBYTE * out_BufferPtr, UBYTE * out_VersionPtr) { int i = pcm_lookup((char*)in_FileName); ttw(ttr(TTrPcmRead, "pcm_rf(%s)" NL, in_FileName)); if (i == -1) return PCM_INVALID_FILE; if (in_BufferSize + 2 != pcm_table[i].length) return PCM_INVALID_SIZE; // checksum check removed --- it is redundant! memcpy (out_BufferPtr, &pcm_mem[pcm_table[i].start+2], in_BufferSize); *out_VersionPtr = pcm_mem[pcm_table[i].start+1]; return PCM_OK; } drv_Return_Type pcm_WriteFile(UBYTE * in_FileName, USHORT in_FileSize, UBYTE * in_BufferPtr) { int i = pcm_lookup((char*)in_FileName); ttw(ttr(TTrPcmWrite, "pcm_wf(%s)" NL, in_FileName)); if (i == -1) return PCM_INVALID_FILE; if (in_FileSize + 2 != pcm_table[i].length) return PCM_INVALID_SIZE; memcpy (&pcm_mem[pcm_table[i].start+2], in_BufferPtr, in_FileSize); // write the whole file to ffs! (ignoring errors) ffs_file_write(pcm_table[i].identifier, &pcm_mem[pcm_table[i].start + 2], in_FileSize, FFS_O_CREATE|FFS_O_TRUNC); return PCM_OK; } /****************************************************************************** * Record read/write functions ******************************************************************************/ /* Record files are implemented by having the first two bytes of a * file be equal to the record size. */ drv_Return_Type pcm_ReadRecord(UBYTE * in_FileName, USHORT in_Record, USHORT in_BufferSize, UBYTE * out_BufferPtr, UBYTE * out_VersionPtr, USHORT * out_MaxRecordsPtr) { int i = pcm_lookup((char*)in_FileName); ttw(ttr(TTrPcmRead, "pcm_rr(%s)" NL, in_FileName)); if (i == -1) return PCM_INVALID_FILE; if (in_BufferSize + 2 != pcm_table[i].length) return PCM_INVALID_SIZE; if (in_Record == 0 || in_Record > pcm_table[i].records) return PCM_INVALID_RECORD; memcpy (out_BufferPtr, &pcm_mem[pcm_table[i].start + 2 + (in_Record-1) * in_BufferSize], in_BufferSize); *out_MaxRecordsPtr = pcm_table[i].records; *out_VersionPtr = pcm_mem [pcm_table[i].start + 1]; return PCM_OK; } drv_Return_Type pcm_WriteRecord(UBYTE * in_FileName, USHORT in_Record, USHORT in_BufferSize, UBYTE * in_BufferPtr) { int i = pcm_lookup((char*)in_FileName); ttw(ttr(TTrPcmWrite, "pcm_wr(%s)" NL, in_FileName)); if (i == -1) return PCM_INVALID_FILE; if (in_BufferSize + 2 != pcm_table[i].length) return PCM_INVALID_SIZE; if (in_Record == 0 || in_Record > pcm_table[i].records) return PCM_INVALID_RECORD; memcpy (&pcm_mem [pcm_table[i].start + 2 + (in_Record-1) * in_BufferSize], in_BufferPtr, in_BufferSize); // write the whole file to ffs! (ignoring errors) ffs_file_write(pcm_table[i].identifier, &pcm_mem [pcm_table[i].start + 2], pcm_table[i].records * (pcm_table[i].length - 2), FFS_O_CREATE|FFS_O_TRUNC); return PCM_OK; }