comparison gsm-fw/services/etm/etm_audio.c @ 164:d78219c43fbf

gsm-fw/services/etm: initial import from the Leonardo semi-src
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 18 Nov 2013 06:39:44 +0000
parents
children
comparison
equal deleted inserted replaced
163:5e0e41cd7c9f 164:d78219c43fbf
1 /********************************************************************************
2 * Enhanced TestMode (ETM)
3 * @file etm_audio.c (Support for AUDIO commands)
4 *
5 * @author Kim T. Peteren (ktp@ti.com)
6 * @version 0.8
7 *
8
9 *
10 * History:
11 *
12 * Date Modification
13 * ------------------------------------
14 * 16/06/2003 Creation
15 * 30/06/2003 Small cleanup in func. etm_audio_write, etm_audio_saveload and
16 * etm_aud_wait_for_aud_event is updated and renamed
17 * 12/08/2003 The func. etm_audio_write has been updated regarding the AEC struct.
18 * 14/08/2003 The func. etm_audio_read has been updated regarding the AEC struct.
19 * 17/03/2004 Modified the event handling, events revceived from the Audio SWE.
20 * Integrated event callback function, etm_audio_callback().
21 *
22 * (C) Copyright 2003 by Texas Instruments Incorporated, All Rights Reserved
23 *********************************************************************************/
24
25
26 #include "etm/etm.h"
27 #include "etm/etm_api.h"
28 #include "etm/etm_trace.h"
29 #include "etm/etm_env.h" // Need because use of T_ETM_ENV_CTRL_BLK
30 #include "etm/etm_audio_err.h" // Privat Audio error codes for PC and Target
31
32 #include "etm/etm_trace.h"
33 #include "audio/audio_api.h"
34
35 #include "rv/rv_general.h"
36 #include "spi/spi_drv.h" // used for codec read/write
37
38 #include "memif/mem.h"
39 #include <string.h>
40
41
42 /******************************************************************************
43 * Globals
44 *****************************************************************************/
45
46 // Version of the ETM AUDIO module
47 //const uint16 etm_audio_revision = (1<<12) | (0x1);
48
49 extern T_ETM_ENV_CTRL_BLK *etm_env_ctrl_blk;
50
51 static int etm_audio_event_status = 0;
52
53
54 /******************************************************************************
55 * Internal prototypes
56 *****************************************************************************/
57
58 int etm_audio(uint8 *indata, int insize);
59 T_RV_HDR *etm_audio_wait_for_event(UINT16 msg_id_expected);
60 T_ETM_PKT *etm_audio_setup(uint8 fid, uint8 cfg_data);
61 void etm_audio_callback(void *event_from_audio);
62
63
64 /******************************************************************************
65 * Register the Audio Module to the ETM database
66 *****************************************************************************/
67
68 int etm_audio_init(void)
69 {
70 int result;
71
72 result = etm_register("AUDIO", ETM_AUDIO, 0, 0, etm_audio);
73 return result;
74 }
75
76
77 /******************************************************************************
78 * Audio Full Access Read Function
79 *****************************************************************************/
80
81 int etm_audio_read(T_ETM_PKT *pkt, uint8 *buf)
82 {
83 int result, size = 0, size_tmp, i;
84 uint8 param;
85 T_AUDIO_FULL_ACCESS_READ audio;
86 T_AUDIO_AEC_CFG *aec_parameter = NULL;
87 void *parameter = NULL;
88
89 param = *buf;
90 if ((result = etm_pkt_put8(pkt, param)) < 0)
91 return result;
92
93 tr_etm(TgTrAudio, "ETM AUDIO: _audio_read: param(%d)", param);
94
95 audio.variable_indentifier = param;
96 audio.data = (T_AUDIO_FULL_ACCESS_READ *) &pkt->data[2]; //data[0] = fid
97 //data[1] = parameter/identifier
98
99 if ((result = audio_full_access_read(&audio)) != AUDIO_OK){
100 tr_etm(TgTrAudio, "ETM AUDIO: _audio_read: ERROR(%d)", result);
101 if (result == AUDIO_ERROR)
102 return ETM_INVAL; // Invalid audio parameter
103 else
104 return ETM_AUDIO_FATAL;
105 }
106
107 switch (param) {
108 case AUDIO_PATH_USED:
109 size = sizeof(T_AUDIO_VOICE_PATH_SETTING);
110 break;
111 case AUDIO_MICROPHONE_MODE:
112 case AUDIO_MICROPHONE_GAIN:
113 case AUDIO_MICROPHONE_EXTRA_GAIN:
114 case AUDIO_MICROPHONE_OUTPUT_BIAS:
115 case AUDIO_MICROPHONE_SPEAKER_LOOP_SIDETONE:
116 size = sizeof(INT8);
117 break;
118 case AUDIO_MICROPHONE_SPEAKER_LOOP_AEC:
119 size = sizeof(T_AUDIO_AEC_CFG);
120
121 aec_parameter = (T_AUDIO_AEC_CFG *) &pkt->data[2];
122
123 etm_pkt_put16(pkt, aec_parameter->aec_enable); // 1
124 #if (L1_NEW_AEC)
125 etm_pkt_put16(pkt, aec_parameter->continuous_filtering); // 2
126 etm_pkt_put16(pkt, aec_parameter->granularity_attenuation); // 3
127 etm_pkt_put16(pkt, aec_parameter->smoothing_coefficient); // 4
128 etm_pkt_put16(pkt, aec_parameter->max_echo_suppression_level); // 5
129 etm_pkt_put16(pkt, aec_parameter->vad_factor); // 6
130 etm_pkt_put16(pkt, aec_parameter->absolute_threshold); // 7
131 etm_pkt_put16(pkt, aec_parameter->factor_asd_filtering); // 8
132 etm_pkt_put16(pkt, aec_parameter->factor_asd_muting); // 9
133 etm_pkt_put16(pkt, aec_parameter->aec_visibility); //10
134 #else
135 etm_pkt_put16(pkt, aec_parameter->aec_mode); // 2
136 etm_pkt_put16(pkt, aec_parameter->echo_suppression_level); // 3
137 #endif // end of (L1_NEW_AEC)
138 etm_pkt_put16(pkt, aec_parameter->noise_suppression_enable); // 4 or 11
139 etm_pkt_put16(pkt, aec_parameter->noise_suppression_level); // 5 or 12
140 break;
141 case AUDIO_MICROPHONE_FIR:
142 case AUDIO_SPEAKER_FIR:
143 size = sizeof(T_AUDIO_FIR_COEF);
144 break;
145 case AUDIO_SPEAKER_MODE:
146 case AUDIO_SPEAKER_GAIN:
147 case AUDIO_SPEAKER_FILTER:
148 case AUDIO_SPEAKER_BUZZER_STATE:
149 size = sizeof(INT8);
150 break;
151 case AUDIO_SPEAKER_VOLUME_LEVEL:
152 size = sizeof(T_AUDIO_SPEAKER_LEVEL);
153 break;
154 default:
155 size = ETM_INVAL;
156 }
157
158 pkt->size += size;
159 return ETM_OK;
160 }
161
162
163 /******************************************************************************
164 * Audio Full Access Write Function
165 *****************************************************************************/
166
167 int etm_audio_write(T_ETM_PKT *pkt, uint8 *buf)
168 {
169 T_RV_HDR *msg = NULL;
170 T_RV_RETURN return_path;
171 T_AUDIO_FULL_ACCESS_WRITE audio;
172 T_AUDIO_AEC_CFG *aec_parameter = NULL;
173 void *parameter = NULL;
174 int result = ETM_OK, i;
175 uint8 param;
176
177 param = *buf++;
178 if ((result = etm_pkt_put8(pkt, param)) < ETM_OK) {
179 return result;
180 }
181
182 tr_etm(TgTrAudio, "ETM AUDIO: _audio_write: param(%d)", param);
183
184 return_path.addr_id = NULL; //etm_env_ctrl_blk->addr_id;
185 return_path.callback_func = etm_audio_callback;
186
187 audio.variable_indentifier = param;
188 audio.data = buf;
189
190 switch (param) {
191 case AUDIO_MICROPHONE_SPEAKER_LOOP_AEC:
192 tr_etm(TgTrAudio, "ETM AUDIO: _audio_write: AUDIO_MICROPHONE_SPEAKER_LOOP_AEC"); // RemoveMe
193 aec_parameter = etm_malloc (sizeof(T_AUDIO_AEC_CFG));
194
195 aec_parameter->aec_enable = etm_get16(buf); buf += 2;// 1
196 #if (L1_NEW_AEC)
197 if (etm_get16(buf)) // 2
198 aec_parameter->continuous_filtering = TRUE;
199 else
200 aec_parameter->continuous_filtering = FALSE;
201 buf += 2;
202 aec_parameter->granularity_attenuation = etm_get16(buf); buf += 2;// 3
203 aec_parameter->smoothing_coefficient = etm_get16(buf); buf += 2;// 4
204 aec_parameter->max_echo_suppression_level = etm_get16(buf); buf += 2;// 5
205 aec_parameter->vad_factor = etm_get16(buf); buf += 2;// 6
206 aec_parameter->absolute_threshold = etm_get16(buf); buf += 2;// 7
207 aec_parameter->factor_asd_filtering = etm_get16(buf); buf += 2;// 8
208 aec_parameter->factor_asd_muting = etm_get16(buf); buf += 2;// 9
209 aec_parameter->aec_visibility = etm_get16(buf); buf += 2;// 10
210 #else
211 aec_parameter->aec_mode = etm_get16(buf); buf += 2;// 2
212 aec_parameter->echo_suppression_level = etm_get16(buf); buf += 2;// 3
213 #endif // end of (L1_NEW_AEC)
214 #if (L1_ANR == 0)
215 aec_parameter->noise_suppression_enable = etm_get16(buf); buf += 2;// 4 or 11
216 aec_parameter->noise_suppression_level = etm_get16(buf); // 5 or 12
217 #endif // end of (L1_ANR)
218 audio.data = aec_parameter;
219 break;
220 case AUDIO_MICROPHONE_FIR:
221 case AUDIO_SPEAKER_FIR:
222 tr_etm(TgTrAudio, "ETM AUDIO: _audio_write: AUDIO_MICROPHONE/SPEAKER_FIR [%d]",
223 sizeof(T_AUDIO_FIR_COEF)/2); // RemoveMe
224
225 parameter = etm_malloc (sizeof(T_AUDIO_FIR_COEF));
226 // Write coeffient values
227 for (i=0; i <= (sizeof(T_AUDIO_FIR_COEF)/2); i++) {
228 ((T_AUDIO_FIR_COEF *) parameter)->coefficient[i] = etm_get16(buf); buf += 2;
229 }
230 audio.data = parameter;
231 break;
232 }
233
234 if ((result = audio_full_access_write(&audio, return_path)) != AUDIO_OK) {
235 tr_etm(TgTrAudio, "ETM AUDIO: _audio_write: ERROR(%d)", result);
236 if (result == AUDIO_ERROR)
237 result = ETM_INVAL; // Invalid audio parameter
238 else
239 result = ETM_AUDIO_FATAL;
240 }
241
242 // Wait for recv. of event: AUDIO_FULL_ACCESS_WRITE_DONE
243 rvf_wait(0xffff, 100); // Timeout 100 ticks
244 tr_etm(TgTrAudio, "ETM AUDIO: _audio_write: STATUS(%d)", etm_audio_event_status);
245
246 if (parameter != NULL) {
247 etm_free(parameter);
248 parameter = NULL;
249 }
250
251 if (aec_parameter != NULL) {
252 etm_free(aec_parameter);
253 aec_parameter = NULL;
254 }
255
256 if (etm_audio_event_status != 0) {
257 etm_audio_event_status = 0;
258 result = ETM_AUDIO_FATAL;
259 }
260
261 return result;
262 }
263
264 /******************************************************************************
265 * Audio Save and Load cfg file Function
266 *****************************************************************************/
267
268 int etm_audio_saveload(T_ETM_PKT *pkt, uint8 saveload, void *buf, int size)
269 {
270 T_RV_HDR *msg;
271 T_AUDIO_MODE_SAVE audio_s;
272 T_AUDIO_MODE_LOAD audio_l;
273 T_RV_RETURN return_path;
274 int result = ETM_OK;
275 int error, event;
276
277 return_path.addr_id = etm_env_ctrl_blk->addr_id;
278 return_path.callback_func = NULL;
279
280 switch(saveload) {
281 case 'S':
282 memcpy(audio_s.audio_mode_filename, buf, size);
283 result = audio_mode_save(&audio_s, return_path);
284 break;
285 case 'L':
286 memcpy(audio_l.audio_mode_filename, buf, size);
287 result = audio_mode_load(&audio_l, return_path);
288 break;
289 default:
290 tr_etm(TgTrAudio, "ETM AUDIO: _audio_saveload: FAILED");
291 break;
292 }
293
294 rvf_wait(0xffff, 100); // Timeout 100 ticks
295 tr_etm(TgTrAudio, "ETM AUDIO: _audio_saveload: STATUS(%d)", etm_audio_event_status);
296
297 if (etm_audio_event_status != 0) {
298 etm_audio_event_status = 0;
299 return ETM_AUDIO_FATAL;
300 }
301
302 if (result != AUDIO_OK)
303 return ETM_AUDIO_FATAL;
304
305 return result;
306 }
307
308
309 /******************************************************************************
310 * ETM AUDIO callback functio
311 *****************************************************************************/
312
313 void etm_audio_callback(void *event_from_audio)
314 {
315 tr_etm(TgTrEtmLow,"ETM: AUDIO: _audio_callback: recv. event (0x%x)",
316 ((T_RV_HDR *) event_from_audio)->msg_id);
317
318 switch (((T_RV_HDR *) event_from_audio)->msg_id)
319 {
320 case AUDIO_FULL_ACCESS_WRITE_DONE:
321 tr_etm(TgTrAudio, "ETM AUDIO: _audio_callback: recv. event AUDIO_FULL_ACCESS_WRITE_DONE");
322 etm_audio_event_status = ((T_AUDIO_FULL_ACCESS_WRITE_DONE *) event_from_audio)->status;
323 break;
324 case AUDIO_MODE_SAVE_DONE:
325 tr_etm(TgTrAudio, "ETM AUDIO: _audio_callback: recv. event AUDIO_MODE_SAVE_DONE");
326 etm_audio_event_status = ((T_AUDIO_SAVE_DONE *) event_from_audio)->status;
327 break;
328 case AUDIO_MODE_LOAD_DONE:
329 tr_etm(TgTrAudio, "ETM AUDIO: _audio_callback: recv. event AUDIO_MODE_LOAD_DONE");
330 etm_audio_event_status = ((T_AUDIO_LOAD_DONE *) event_from_audio)->status;
331 break;
332 }
333
334 if (event_from_audio != NULL) {
335 // etm_free(event_from_audio);
336 event_from_audio = NULL;
337 }
338 }
339
340
341 /******************************************************************************
342 * ETM AUDIO Moudle - Main Task
343 *****************************************************************************/
344
345 // AUDIO packet structure for audio read/write and codec read/write:
346 // |fid(8)|param(8)|--data(W)--| and for audio save/load |fid|--data(W)--|
347
348 int etm_audio(uint8 *indata, int insize)
349 {
350 int error = ETM_OK;
351 uint8 fid;
352 T_ETM_PKT *pkt = NULL;
353
354 fid = *indata++;
355
356 tr_etm(TgTrAudio, "ETM AUDIO: _audio: fid(%c) param(%d) recv. size(%d)",
357 fid, *indata, insize);
358
359 /* Create TestMode return Packet */
360 if ((pkt = (T_ETM_PKT *) etm_malloc(sizeof(T_ETM_PKT))) == NULL) {
361 return ETM_NOMEM;
362 }
363
364 // Init. of return packet
365 pkt->mid = ETM_AUDIO;
366 pkt->status = ETM_OK;
367 pkt->size = 0;
368 pkt->index = 0;
369 etm_pkt_put8(pkt, fid);
370
371 if (error == ETM_OK) {
372 switch (fid) {
373 case 'R':
374 error = etm_audio_read(pkt, indata);
375 break;
376 case 'W':
377 error = etm_audio_write(pkt, indata);
378 break;
379 case 'S':
380 case 'L':
381 error = etm_audio_saveload(pkt, fid, indata, insize);
382 break;
383 default:
384 tr_etm(TgTrAudio, "ETM AUDIO: _audio: fid(%c) - ERROR ", fid);
385 error = ETM_NOSYS;
386 break;
387 }
388 }
389
390 if (error < 0) {
391 tr_etm(TgTrAudio,"ETM AUDIO: _audio: ERROR(%d)", error);
392 pkt->status = -error;
393
394 }
395
396 etm_pkt_send(pkt);
397 etm_free(pkt);
398
399 return ETM_OK;
400 }
401