-
Notifications
You must be signed in to change notification settings - Fork 0
/
algProcessingTask.c
322 lines (274 loc) · 13.1 KB
/
algProcessingTask.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
/**************************************************************************************************
* *
* SSSSS PPPPPP SSSSS *
* SS SS PP PP SS SS *
* SS PP PP SS *
* SSSSS PPPPPP SSSSS *
* SS PP SS *
* SS SS PP SS SS *
* SSSSS PP SSSSS *
* *
* SIGNAL PROCESSING SOLUTIONS *
* *
**************************************************************************************************
* *
* Project: *
* *
* Author: Michael E. Spencer, Ph.D. *
* *
* Copyright(c) Signal Processing Solutions, 2007 *
* *
**************************************************************************************************
*
* File: algProcessingTask.c
*
* This is the dMAX McASP driver (DMD) algProcessingTask source file.
* This file is a modified version form the processing task from "echo" demo.
*
* This Task sets up the A/D and D/A pipes and drops into the processing loop.
*
*
*/
#include <algProcessingTask.h>
//#include <algorithms.h>
#include<main.h>
/* trace LOG buffer is used to print runtime information */
extern far LOG_Obj trace;
/*
Memory segments defined in the asacs.tcf file.
IRAM -> DSP internal RAM
SDRAM -> External RAM
*/
extern Int IRAM;
extern Int SDRAM;
Float *inBuff[ IO_MAX_CHAN ];
Float *outBuff[ IO_MAX_CHAN ];
Float *Buff[ BUFF_MAX_P1 ];
/*
The algProcessingTask demonstrates the usge of DMD driver to interface
with the McASP peripheral.
The task takes as an argument a parameter structure (IOParams).
The parameter structure is defined in the header file: algProcessingTask.h
The default parameter structure is defined in the source
file algProcessingTaskParams.c (IOParams). The default parameter structure
is provided to the algProcessingTask using the configuration in asacs.tcf
*/
Void algProcessingTask (IOParams * pParams)
{
/*
The algProcessingTask handle is used to maintain variables and
configurations. This handle is created in the task and
provided to various functions to share information
*/
pIOstreamHdl IOhdl;
/* SIO Attrs to create SIO objects for McASP RX and TX */
SIO_Attrs sioAttrs;
Int32 i, error;
/*
DMD driver accepts a parameter structure to initialize
the peripherals (McASP and dMAX). The parameter structure
is defined in the header file: c672x_dmax_mcasp.h
The code reads the specified DMD parameter structure into the
local dmd variable and provides it to the DMD driver for configuration
*/
DMD_Params dmd;
LOG_printf(&trace, "Entered algProcessingTask.c");
/**********************************************************/
/* Create and initialize the IO Stream handle */
/**********************************************************/
IOhdl = MEM_calloc (IRAM, sizeof(IOstreamHdl), 8);
/* Store the pointer to the provided task parameters */
IOhdl->pParams = pParams;
/* Initialize the variables */
IOhdl->externalMem = SDRAM; /* Pointer to external memory segment */
IOhdl->internalMem = IRAM; /* Pointer to internal memory segment */
/**********************************************************/
/* Allocate IP/OP driver buffers */
/**********************************************************/
for (i = 0; i < pParams->numDrvBuffers; i++) {
/* Allocate the I/P and O/P buffers */
IOhdl->ipDrvBuff[i] = MEM_calloc (
IOhdl->internalMem,
pParams->maxIPChannels*
sizeof(Float)*
FRAMESIZE,
8
);
IOhdl->opDrvBuff[i] = MEM_calloc (
IOhdl->internalMem,
pParams->maxOPChannels*
sizeof(Float)*
FRAMESIZE,
8
);
if (!IOhdl->ipDrvBuff[i] || !IOhdl->opDrvBuff[i]) {
LOG_printf (&trace, "Driver buffer allocation failed. Exiting program."); // fixthis
exit (SYS_EALLOC);
}
}
/**********************************************************/
/* Allocate the frame buffers */
/**********************************************************/
inBuff[0] = MEM_calloc (
IRAM,
sizeof(Float)*FRAMESIZE*pParams->maxFrameChannels,
8
);
outBuff[0] = MEM_calloc (
IRAM,
sizeof(Float)*FRAMESIZE*pParams->maxFrameChannels,
8
);
Buff[0] = MEM_calloc (
IRAM,
sizeof(Float)*FRAMESIZE*BUFF_MAX,
8
);
if ( !inBuff[0] || !outBuff[0] || !Buff[0] ) {
LOG_printf (&trace, "Frame buffer allocation failed. Exiting program.");
exit (SYS_EALLOC);
}
/* Assign pointers to various channel frame buffers */
for (i = 1; i<pParams->maxFrameChannels; i++)
{
inBuff[i] = inBuff[i - 1] + FRAMESIZE;
outBuff[i] = outBuff[i - 1] + FRAMESIZE;
}
for (i = 1; i < BUFF_MAX_P1; i++) {
Buff[i] = Buff[i - 1] + FRAMESIZE;
}
/**********************************************************/
/* Create the PADK H/W object */
/**********************************************************/
/*
The PADK_board_open function initializes the PADK H/W.
It returns with the board handle that can be used to
control the PADK H/W
*/
IOhdl->brdHdl = PADK_board_open (IOhdl->internalMem);
if (!IOhdl->brdHdl) {
LOG_printf (&trace, "Board handle creation failed. Exiting program.");
exit (SYS_EALLOC);
}
/* Call the PADK board control function to Mute the o/p */
IOhdl->brdHdl->brdCtrl (IOhdl->brdHdl, PADK_MUTE_OUTPUT);
// Added by MSpencer:
// CLKGEN_OscSel(OSC_24_576MHz);
// CLKGEN_OscSel(OSC_22_5792MHz);
/**********************************************************/
/* Initialize the sioAttrs to be used when creating the */
/* SIO objects for RX and TX */
/**********************************************************/
sioAttrs.nbufs = 3; /* Maximum buffers that can be issued to DMD */
sioAttrs.segid = IOhdl->internalMem;
sioAttrs.align = 8;
/*
Indicates the desired behavior for an output stream when it is deleted.
If flush is TRUE, a call to SIO_delete causes the stream to discard all
pending data and return without blocking.
*/
sioAttrs.flush = TRUE;
sioAttrs.model = SIO_ISSUERECLAIM; /* SIO Usage model */
/*
Specifies the length of time the device driver waits for I/O completion
before returning an error (for example, SYS_ETIMEOUT). timeout is
usually passed as a parameter to SEM_pend by the device driver.
If the timeout expires before a buffer is available to be returned,
the I/O operation returns the value of (-1 * SYS_ETIMEOUT).
Otherwise the I/O operation returns the number of valid MADUs
in the buffer, or -1 multiplied by an error code.
*/
sioAttrs.timeout = 20; /* 20 msec */
/* Initialize the error flag to 'no error' */
error = SYS_OK;
/**********************************************************/
/* The main processing loop */
/* Create the SIO objects for RX and TX */
/* Initialize the PADK H/W */
/* Issue buffers to RX and TX instances of the driver */
/* Call processingLoop () to perform the DSP */
/**********************************************************/
while (1) {
/*
If error occured delete the
SIO object and restart the process.
*/
if (error) {
/* Close both the devices */
SIO_delete (IOhdl->sioIP);
SIO_delete (IOhdl->sioOP);
}
/* Start the i/p and o/p clock circuitry on the H/W */
IOhdl->brdHdl->brdCtrl (IOhdl->brdHdl, PADK_START_INPUT);
IOhdl->brdHdl->brdCtrl (IOhdl->brdHdl, PADK_START_OUTPUT);
/* Load the DMD configuration for the RX Section */
dmd = MultiChannelAnalogIP;
/* Set the frame size */
dmd.numSamples = FRAMESIZE;
/* Create the SIO object for RX */
IOhdl->sioIP = SIO_create("/DMD", SIO_INPUT, NULL, &sioAttrs);
if (!IOhdl->sioIP) {
LOG_printf (&trace, "SIO_create for RX failed. Exiting program.");
exit (SYS_EALLOC);
}
/* Provide the DMD params to the DMD driver */
SIO_ctrl (IOhdl->sioIP, DMD_USR_PARAM, (Arg) &dmd);
/*
Start the McASP clock circuitry.
The McASP clock circuitry is intentionally handled seperately.
Some H/W may require clocks being present even before the
data I/O is started
*/
SIO_ctrl (IOhdl->sioIP, DMD_START_CLK, (Arg) NULL);
/* Load the DMD configuration for the TX Section */
dmd = MultiChannelAnalogOP;
/* Set the frame size */
dmd.numSamples = FRAMESIZE;
/* Create the SIO object for TX */
IOhdl->sioOP = SIO_create("/DMD", SIO_OUTPUT, NULL, &sioAttrs);
/* Provide the DMD params to the DMD driver */
SIO_ctrl (IOhdl->sioOP, DMD_USR_PARAM, (Arg) &dmd);
/*
Start the McASP clock circuitry.
The McASP clock circuitry is intentionally handled seperately.
Some H/W may require clocks being present even before the
data I/O is started
*/
SIO_ctrl (IOhdl->sioOP, DMD_START_CLK, (Arg) NULL);
/* Issue the buffers to both RX and TX sections */
for (i = 0; i < IOhdl->pParams->numDrvBuffers; i++) {
SIO_issue ( IOhdl->sioIP, IOhdl->ipDrvBuff[i],
pParams->maxIPChannels*sizeof(Float)*
FRAMESIZE, NULL);
}
for (i = 0; i < IOhdl->pParams->numDrvBuffers; i++) {
SIO_issue ( IOhdl->sioOP, IOhdl->opDrvBuff[i],
pParams->maxOPChannels*sizeof(Float)*
FRAMESIZE, NULL);
}
/* Call board control function to UnMute the output */
IOhdl->brdHdl->brdCtrl (IOhdl->brdHdl, PADK_UNMUTE_OUTPUT);
/*********************** Fall into the processingLoop code ************************/
error = processingLoop( IOhdl );
/**********************************************************************************/
/*
If here, error happened while performing processingLoop.
LOG the error and start again
*/
if (error != SYS_OK)
LOG_printf (&trace, "SIO_reclaim or SIO_issue Error occured in processingLoop(). Restarting CODEC I/O stream.");
/* Call board control function to Mute the output */
IOhdl->brdHdl->brdCtrl (IOhdl->brdHdl, PADK_MUTE_OUTPUT);
/* Sleep for 1msec */
TSK_sleep (1);
}
}
/*
This hook function is provided by the DMD driver to add
processing for any dMAX transfer ISRs that are not
initiated by the DMD.
*/
Void
DMD_ISR_hook () {
return;
}