FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/services/pcm/pcmcode.c @ 638:0b5f226bfdf4
gsm-fw/services/pcm: import from Leonardo source (FFS)
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
|---|---|
| date | Wed, 03 Sep 2014 16:26:27 +0000 |
| parents | |
| children | aed920085e59 |
comparison
equal
deleted
inserted
replaced
| 637:0677a6fbb8b6 | 638:0b5f226bfdf4 |
|---|---|
| 1 /****************************************************************************** | |
| 2 * Flash File System (ffs) | |
| 3 * Idea, design and coding by Mads Meisner-Jensen, mmj@ti.com | |
| 4 * | |
| 5 * Condat PCM Compatibility Support | |
| 6 * | |
| 7 * $Id: pcmcode.c 1.46 Tue, 06 Nov 2001 11:55:21 +0100 tsj $ | |
| 8 * | |
| 9 ******************************************************************************/ | |
| 10 | |
| 11 #ifndef TARGET | |
| 12 #include "board.cfg" | |
| 13 #include "ffs.cfg" | |
| 14 #endif | |
| 15 | |
| 16 #include <string.h> | |
| 17 #include "ffs/pcm.h" | |
| 18 #include "ffs/ffs.h" | |
| 19 #include "ffs/board/ffstrace.h" | |
| 20 | |
| 21 #if (TARGET == 1) | |
| 22 #include "sys.cfg" | |
| 23 #if (BOARD == 34) | |
| 24 #include "ffs/board/ffspcm.h" | |
| 25 #endif | |
| 26 #else | |
| 27 #define STD 6 | |
| 28 #define NULL 0 | |
| 29 #endif | |
| 30 | |
| 31 | |
| 32 extern const T_PCM_DESCRIPTION pcm_table[]; | |
| 33 extern const UBYTE pcm_default_values[]; | |
| 34 extern UBYTE pcm_mem []; | |
| 35 extern UBYTE std; | |
| 36 | |
| 37 | |
| 38 /****************************************************************************** | |
| 39 * | |
| 40 ******************************************************************************/ | |
| 41 | |
| 42 // pcm_Init() has been renamed to pcm_init() so that it is not called | |
| 43 // anywhere else than it should. The old pcm_Init() is now empty. This new | |
| 44 // pcm_init() scans through the pcm file table and attempts to read each | |
| 45 // file from ffs into the pcm RAM image. | |
| 46 | |
| 47 drv_Return_Type pcm_Init(void) | |
| 48 { | |
| 49 return PCM_INITIALIZED; | |
| 50 } | |
| 51 | |
| 52 | |
| 53 // Note that PCM file data chunks start with one byte for the file data | |
| 54 // checksum, followed by another byte for the version. The third byte | |
| 55 // (offset 2) is the start of the actual filedata. We ignore these first two | |
| 56 // bytes e.g. we only read/write the actual file data! | |
| 57 | |
| 58 | |
| 59 // look up a PCM file | |
| 60 int pcm_lookup(char *pcm_name) | |
| 61 { | |
| 62 int i = 0; | |
| 63 | |
| 64 while (pcm_table[i].identifier != NULL) | |
| 65 { | |
| 66 if (!strcmp((char *) pcm_name, pcm_table[i].identifier + 5)) | |
| 67 return i; | |
| 68 i++; | |
| 69 } | |
| 70 return -1; // not found. | |
| 71 } | |
| 72 | |
| 73 drv_Return_Type pcm_init(void) | |
| 74 { | |
| 75 int i = 0; | |
| 76 effs_t error; | |
| 77 | |
| 78 ttw(ttr(TTrInit, "pcm_init" NL)); | |
| 79 | |
| 80 // Avenger 2 tri band radio | |
| 81 #if (BOARD==34) | |
| 82 std = ffs_GetBand(); | |
| 83 #else | |
| 84 std = STD; | |
| 85 #endif | |
| 86 | |
| 87 while (pcm_table[i].identifier != NULL) | |
| 88 { | |
| 89 error = ffs_fread(pcm_table[i].identifier, | |
| 90 &pcm_mem[pcm_table[i].start + 2], | |
| 91 (pcm_table[i].length - 2) * pcm_table[i].records); | |
| 92 | |
| 93 if (error < EFFS_OK) { | |
| 94 // copy defaults to pcm_mem | |
| 95 memcpy (&pcm_mem[pcm_table[i].start] + 2, | |
| 96 &pcm_default_values[pcm_table[i].start - 2*i], | |
| 97 pcm_table[i].records * (pcm_table[i].length - 2)); | |
| 98 } | |
| 99 pcm_mem[pcm_table[i].start + 1] = 1; // file version | |
| 100 i++; | |
| 101 } | |
| 102 | |
| 103 return PCM_INITIALIZED; | |
| 104 } | |
| 105 | |
| 106 drv_Return_Type pcm_GetFileInfo(UBYTE * in_FileName, | |
| 107 pcm_FileInfo_Type * out_FileInfoPtr) | |
| 108 { | |
| 109 int i = pcm_lookup((char*)in_FileName); | |
| 110 | |
| 111 ttw(ttr(TTrPcmRead, "pcm_gfi(%s)" NL, in_FileName)); | |
| 112 | |
| 113 if (i == -1) | |
| 114 return PCM_INVALID_FILE; | |
| 115 | |
| 116 out_FileInfoPtr->FileLocation = &pcm_mem [pcm_table[i].start+2]; | |
| 117 out_FileInfoPtr->FileSize = pcm_table[i].length -2; | |
| 118 // As Condat has determined that all files is version 1, we just | |
| 119 // hardwire exactly that! | |
| 120 // out_FileInfoPtr->Version = pcm_mem [pcm_table[i].start + 1]; | |
| 121 out_FileInfoPtr->Version = 1; | |
| 122 | |
| 123 return PCM_OK; | |
| 124 } | |
| 125 | |
| 126 | |
| 127 /****************************************************************************** | |
| 128 * Normal read/write functions | |
| 129 ******************************************************************************/ | |
| 130 | |
| 131 drv_Return_Type pcm_ReadFile(UBYTE * in_FileName, | |
| 132 USHORT in_BufferSize, | |
| 133 UBYTE * out_BufferPtr, | |
| 134 UBYTE * out_VersionPtr) | |
| 135 { | |
| 136 int i = pcm_lookup((char*)in_FileName); | |
| 137 | |
| 138 ttw(ttr(TTrPcmRead, "pcm_rf(%s)" NL, in_FileName)); | |
| 139 | |
| 140 if (i == -1) | |
| 141 return PCM_INVALID_FILE; | |
| 142 | |
| 143 if (in_BufferSize + 2 != pcm_table[i].length) | |
| 144 return PCM_INVALID_SIZE; | |
| 145 | |
| 146 // checksum check removed --- it is redundant! | |
| 147 | |
| 148 memcpy (out_BufferPtr, &pcm_mem[pcm_table[i].start+2], in_BufferSize); | |
| 149 *out_VersionPtr = pcm_mem[pcm_table[i].start+1]; | |
| 150 | |
| 151 return PCM_OK; | |
| 152 } | |
| 153 | |
| 154 drv_Return_Type pcm_WriteFile(UBYTE * in_FileName, | |
| 155 USHORT in_FileSize, | |
| 156 UBYTE * in_BufferPtr) | |
| 157 { | |
| 158 int i = pcm_lookup((char*)in_FileName); | |
| 159 | |
| 160 ttw(ttr(TTrPcmWrite, "pcm_wf(%s)" NL, in_FileName)); | |
| 161 | |
| 162 if (i == -1) | |
| 163 return PCM_INVALID_FILE; | |
| 164 | |
| 165 if (in_FileSize + 2 != pcm_table[i].length) | |
| 166 return PCM_INVALID_SIZE; | |
| 167 | |
| 168 memcpy (&pcm_mem[pcm_table[i].start+2], in_BufferPtr, in_FileSize); | |
| 169 | |
| 170 // write the whole file to ffs! (ignoring errors) | |
| 171 ffs_fwrite(pcm_table[i].identifier, | |
| 172 &pcm_mem[pcm_table[i].start + 2], | |
| 173 in_FileSize); | |
| 174 | |
| 175 return PCM_OK; | |
| 176 } | |
| 177 | |
| 178 | |
| 179 /****************************************************************************** | |
| 180 * Record read/write functions | |
| 181 ******************************************************************************/ | |
| 182 | |
| 183 /* Record files are implemented by having the first two bytes of a | |
| 184 * file be equal to the record size. */ | |
| 185 | |
| 186 drv_Return_Type pcm_ReadRecord(UBYTE * in_FileName, | |
| 187 USHORT in_Record, | |
| 188 USHORT in_BufferSize, | |
| 189 UBYTE * out_BufferPtr, | |
| 190 UBYTE * out_VersionPtr, | |
| 191 USHORT * out_MaxRecordsPtr) | |
| 192 { | |
| 193 int i = pcm_lookup((char*)in_FileName); | |
| 194 | |
| 195 ttw(ttr(TTrPcmRead, "pcm_rr(%s)" NL, in_FileName)); | |
| 196 | |
| 197 if (i == -1) | |
| 198 return PCM_INVALID_FILE; | |
| 199 | |
| 200 if (in_BufferSize + 2 != pcm_table[i].length) | |
| 201 return PCM_INVALID_SIZE; | |
| 202 | |
| 203 if (in_Record == 0 || in_Record > pcm_table[i].records) | |
| 204 return PCM_INVALID_RECORD; | |
| 205 | |
| 206 memcpy (out_BufferPtr, | |
| 207 &pcm_mem[pcm_table[i].start + 2 + (in_Record-1) * in_BufferSize], | |
| 208 in_BufferSize); | |
| 209 *out_MaxRecordsPtr = pcm_table[i].records; | |
| 210 *out_VersionPtr = pcm_mem [pcm_table[i].start + 1]; | |
| 211 | |
| 212 return PCM_OK; | |
| 213 } | |
| 214 | |
| 215 drv_Return_Type pcm_WriteRecord(UBYTE * in_FileName, | |
| 216 USHORT in_Record, | |
| 217 USHORT in_BufferSize, | |
| 218 UBYTE * in_BufferPtr) | |
| 219 { | |
| 220 int i = pcm_lookup((char*)in_FileName); | |
| 221 | |
| 222 ttw(ttr(TTrPcmWrite, "pcm_wr(%s)" NL, in_FileName)); | |
| 223 | |
| 224 if (i == -1) | |
| 225 return PCM_INVALID_FILE; | |
| 226 | |
| 227 if (in_BufferSize + 2 != pcm_table[i].length) | |
| 228 return PCM_INVALID_SIZE; | |
| 229 | |
| 230 if (in_Record == 0 || in_Record > pcm_table[i].records) | |
| 231 return PCM_INVALID_RECORD; | |
| 232 | |
| 233 memcpy (&pcm_mem [pcm_table[i].start + 2 + (in_Record-1) * in_BufferSize], | |
| 234 in_BufferPtr, | |
| 235 in_BufferSize); | |
| 236 | |
| 237 // write the whole file to ffs! (ignoring errors) | |
| 238 ffs_fwrite(pcm_table[i].identifier, | |
| 239 &pcm_mem [pcm_table[i].start + 2], | |
| 240 pcm_table[i].records * (pcm_table[i].length - 2)); | |
| 241 | |
| 242 return PCM_OK; | |
| 243 } |
