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 } |