comparison chipsetsw/drivers/drv_core/dma/sys_dma.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:509db1a7b7b8
1 /* @(#) nom : sys_dma.c SID: 1.2 date : 05/23/03 */
2 /* Filename: sys_dma.c */
3 /* Version: 1.2 */
4 /******************************************************************************
5 * WIRELESS COMMUNICATION SYSTEM DEVELOPMENT
6 *
7 * (C) 2002 Texas Instruments France. All rights reserved
8 *
9 * Author : Guillaume Leterrier
10 * Francois Amand
11 *
12 *
13 * Important Note
14 * --------------
15 *
16 * This S/W is a preliminary version. It contains information on a product
17 * under development and is issued for evaluation purposes only. Features
18 * characteristics, data and other information are subject to change.
19 *
20 * The S/W is furnished under Non Disclosure Agreement and may be used or
21 * copied only in accordance with the terms of the agreement. It is an offence
22 * to copy the software in any way except as specifically set out in the
23 * agreement. No part of this document may be reproduced or transmitted in any
24 * form or by any means, electronic or mechanical, including photocopying and
25 * recording, for any purpose without the express written permission of Texas
26 * Instruments Inc.
27 *
28 ******************************************************************************
29 *
30 * FILE NAME: sys_dma.c
31 *
32 *
33 * PURPOSE: DMA drivers for CALYPSO PLUS.
34 * The drivers allows DMA module configuration and control.
35 *
36 *
37 * FILE REFERENCES:
38 *
39 * Name IO Description
40 * ------------- -- ---------------------------------------------
41 *
42 *
43 *
44 * EXTERNAL VARIABLES:
45 *
46 * Source:
47 *
48 * Name Type IO Description
49 * ------------- --------------- -- ------------------------------
50 *
51 *
52 *
53 * EXTERNAL REFERENCES:
54 *
55 * Name Description
56 * ------------------ -------------------------------------------------------
57 *
58 *
59 *
60 * ABNORMAL TERMINATION CONDITIONS, ERROR AND WARNING MESSAGES:
61 *
62 *
63 *
64 * ASSUMPTION, CONSTRAINTS, RESTRICTIONS:
65 *
66 *
67 *
68 * NOTES:
69 *
70 *
71 *
72 * REQUIREMENTS/FUNCTIONAL SPECIFICATION REFERENCES:
73 *
74 *
75 *
76 *
77 * DEVELOPMENT HISTORY:
78 *
79 * Date Name(s) Version Description
80 * ----------- -------------- ------- -------------------------------------
81 * 23-Oct-2002 G.Leterrier 0.0.1 First implementation
82 * 6-Feb-2003 G.Leterrier 0.0.2 Reset HW request to 0, before new setup in function "f_dma_channel_parameter_set"
83 * 20-Feb-2003 G.Leterrier 0.0.3 f_dma_global_parameter_set correction on API priority bit
84 * disable and clear status register channel before re-configuration
85 * ALGORITHM:
86 *
87 *
88 *****************************************************************************/
89
90 #include "chipset.cfg"
91
92 #if (CHIPSET == 12)
93
94 #include "sys_dma.h"
95
96
97 /***************************************************************************/
98 /* global variable
99 *****************************************************************************/
100
101 extern T_DMA_CALL_BACK pf_dma_call_back_address[C_DMA_NUMBER_OF_CHANNEL];
102
103 /******************************************************************************
104 *
105 * FUNCTION NAME: f_dma_get_version_driver
106 * This functionis used to get to DMA driver software version.
107 *
108 * ARGUMENT LIST:
109 *
110 * Argument Type IO Description
111 * ---------- ---------- -- -------------------------------------------
112 * none
113 *
114 *
115 * RETURN VALUE: SYS_UWORD16
116 *
117 *****************************************************************************/
118 SYS_UWORD16 f_dma_get_version_driver(void)
119 {
120 return(C_DMA_VERSION_DRIVER);
121 } /*f_dma_get_version_driver()*/
122
123 /******************************************************************************
124 *
125 * FUNCTION NAME:f_dma_global_parameter_set
126 * The function is used to setup the DMA global configuration.
127 *
128 *
129 * ARGUMENT LIST:
130 *
131 * Argument Type IO Description
132 * ---------- ---------- -- -------------------------------------------
133 * p_dma_global_parameter T_DMA_TYPE_GLOBAL_PARAMETER* I Pointer on data structure containing all global parameter of DMA configuration
134 *
135 *
136 *
137 * RETURN VALUE: None
138 *
139 *****************************************************************************/
140 void f_dma_global_parameter_set(T_DMA_TYPE_GLOBAL_PARAMETER *p_dma_global_parameter)
141 {
142 if (p_dma_global_parameter->d_dma_global_auto_gate==C_DMA_AUTO_GATE_ON)
143 {
144 C_DMA_GCR_REG |= (C_DMA_AUTO_GATE_ON << C_DMA_GCR_AUTO_GATE_POS );
145 }
146
147 else
148 {
149 C_DMA_GCR_REG &= ~( C_DMA_GCR_AUTO_GATE_MASK << C_DMA_GCR_AUTO_GATE_POS );
150 }
151
152 C_DMA_AR_REG = (
153 (p_dma_global_parameter->d_dma_global_api_prio << C_DMA_AR_API_PRIO_POS)
154 | (p_dma_global_parameter->d_dma_global_rhea_prio << C_DMA_AR_RHEA_PRIO_POS)
155 | (p_dma_global_parameter->d_dma_global_imif_prio << C_DMA_AR_IMIF_PRIO_POS)
156 );
157 } /*f_dma_global_parameter_set() */
158
159 /******************************************************************************
160 *
161 * FUNCTION NAME: f_dma_channel_allocation_set
162 * This function defines the allocation of a channel.
163 * This function is used to set which channel can be configured through the ARM and which one can be configured through the DSP.
164 *
165 *
166 *
167 * ARGUMENT LIST:
168 *
169 * Argument Type IO Description
170 * ---------- ---------- -- -------------------------------------------
171 * d_dma_channel_number T_DMA_TYPE_CHANNEL_NUMBER I Variable providing the channel number
172 * d_dma_channel_allocation T_DMA_TYPE_CHANNEL_ALLOCATION I Variable defining if the channel allocated to the ARM or the DSP.
173 *
174 *
175 *
176 * RETURN VALUE: None
177 *
178 *****************************************************************************/
179 void f_dma_channel_allocation_set(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number, T_DMA_TYPE_CHANNEL_ALLOCATION d_dma_channel_allocation)
180 {
181 if (d_dma_channel_allocation==C_DMA_CHANNEL_DSP)
182 {
183 C_DMA_CAR_REG |= (C_DMA_CHANNEL_DSP << d_dma_channel_number);
184 }
185
186 else
187 {
188 C_DMA_CAR_REG &= ~( C_DMA_CHANNEL_DSP << d_dma_channel_number );
189 }
190
191
192 } /*f_dma_channel_allocation_set */
193
194 /******************************************************************************
195 *
196 * FUNCTION NAME: f_dma_channel_parameter_set
197 * The function is used to setup a DMA channel configuration.
198 *
199 *
200 * ARGUMENT LIST:
201 *
202 * Argument Type IO Description
203 * ---------- ---------- -- -------------------------------------------
204 * p_dma_channel_parameter T_DMA_TYPE_CHANNEL_PARAMETER * I Pointer on data structure containing all the parameter to setup a channel
205 *
206 *
207 *
208 * RETURN VALUE: None
209 *
210 *****************************************************************************/
211 void f_dma_channel_parameter_set(T_DMA_TYPE_CHANNEL_PARAMETER *p_dma_channel_parameter)
212 {
213 SYS_UWORD16 d_temp_register;
214
215 F_DMA_CHANNEL_DISABLE(p_dma_channel_parameter->d_dma_channel_number);
216
217 d_temp_register=F_DMA_GET_CHANNEL_IT_STATUS(p_dma_channel_parameter->d_dma_channel_number);
218
219 pf_dma_call_back_address[p_dma_channel_parameter->d_dma_channel_number]=p_dma_channel_parameter->pf_dma_call_back_address;
220
221
222
223 if (p_dma_channel_parameter->d_dma_channel_secured==C_DMA_CHANNEL_SECURED)
224 {
225 C_DMA_SCR_REG |= (C_DMA_CHANNEL_SECURED << p_dma_channel_parameter->d_dma_channel_number);
226 }
227
228 else
229 {
230 C_DMA_SCR_REG &= ~( C_DMA_CHANNEL_SECURED << p_dma_channel_parameter->d_dma_channel_number );
231 }
232
233 C_DMA_CSDP_REG(p_dma_channel_parameter->d_dma_channel_number) = (
234
235 (p_dma_channel_parameter->d_dma_channel_data_type << C_DMA_CSDP_DATA_TYPE_POS )
236 | (p_dma_channel_parameter->d_dma_channel_src_port << C_DMA_CSDP_SRC_POS )
237 | (p_dma_channel_parameter->d_dma_src_channel_packed << C_DMA_CSDP_SRC_PACK_POS )
238 | (p_dma_channel_parameter->d_dma_src_channel_burst_en << C_DMA_CSDP_SRC_BURST_EN_POS )
239 | (p_dma_channel_parameter->d_dma_channel_dst_port << C_DMA_CSDP_DST_POS )
240 | (p_dma_channel_parameter->d_dma_dst_channel_packed << C_DMA_CSDP_DST_PACK_POS )
241 | (p_dma_channel_parameter->d_dma_dst_channel_burst_en << C_DMA_CSDP_DST_BURST_EN_POS )
242 );
243
244 C_DMA_CCR_REG(p_dma_channel_parameter->d_dma_channel_number) &= ~C_DMA_CCR_SYNC_MASK;
245
246
247
248 C_DMA_CCR_REG(p_dma_channel_parameter->d_dma_channel_number) = (
249
250 (p_dma_channel_parameter->d_dma_channel_hw_synch << C_DMA_CCR_SYNC_POS )
251 | (p_dma_channel_parameter->d_dma_channel_priority << C_DMA_CCR_PRIO_POS )
252 | (p_dma_channel_parameter->d_dma_channel_auto_init << C_DMA_CCR_AUTO_INIT_POS )
253 | (p_dma_channel_parameter->d_dma_channel_fifo_flush << C_DMA_CCR_FIFO_FLUSH_POS )
254 | (p_dma_channel_parameter->d_dma_src_channel_addr_mode << C_DMA_CCR_SRC_AMODE_POS )
255 | (p_dma_channel_parameter->d_dma_dst_channel_addr_mode << C_DMA_CCR_DST_AMODE_POS )
256 );
257
258 C_DMA_CICR_REG(p_dma_channel_parameter->d_dma_channel_number) = (
259
260 (p_dma_channel_parameter->d_dma_channel_it_time_out << C_DMA_CICR_TOUT_IE_POS )
261 | (p_dma_channel_parameter->d_dma_channel_it_drop << C_DMA_CICR_DROP_IE_POS )
262 | (p_dma_channel_parameter->d_dma_channel_it_frame <<C_DMA_CICR_FRAME_IE_POS )
263 | (p_dma_channel_parameter->d_dma_channel_it_block << C_DMA_CICR_BLOCK_IE_POS )
264 | (p_dma_channel_parameter->d_dma_channel_it_half_block << C_DMA_CICR_HALF_BLOCK_IE_POS )
265 );
266
267 C_DMA_CSSA_L_REG(p_dma_channel_parameter->d_dma_channel_number)= (p_dma_channel_parameter->d_dma_channel_src_address ); /* is a mask requested ? */
268
269
270 C_DMA_CSSA_U_REG(p_dma_channel_parameter->d_dma_channel_number)= (p_dma_channel_parameter->d_dma_channel_src_address >> 16 ); /* is a mask requested ? */
271
272
273 C_DMA_CDSA_L_REG(p_dma_channel_parameter->d_dma_channel_number)= (p_dma_channel_parameter->d_dma_channel_dst_address); /* is a mask requested ? */
274
275
276 C_DMA_CDSA_U_REG(p_dma_channel_parameter->d_dma_channel_number)= (p_dma_channel_parameter->d_dma_channel_dst_address >> 16 ); /* is a mask requested ? */
277
278 C_DMA_CEN_REG(p_dma_channel_parameter->d_dma_channel_number) = (p_dma_channel_parameter->d_dma_channel_element_number );
279
280 C_DMA_CFN_REG(p_dma_channel_parameter->d_dma_channel_number) = (p_dma_channel_parameter->d_dma_channel_frame_number );
281
282
283 } /*f_dma_channel_parameter_set() */
284
285 /******************************************************************************
286 *
287 * FUNCTION NAME: f_dma_channel_enable
288 * This function is used to enable a DMA transfer of a channel which could be depending on a hardware request.
289 * If there is no hardware request, the transfer starts immediately.
290 *
291 * ARGUMENT LIST:
292 *
293 * Argument Type IO Description
294 * ---------- ---------- -- -------------------------------------------
295 * d_dma_channel_number T_DMA_TYPE_CHANNEL_NUMBER I Variable to define which channel is enabled.
296 *
297 *
298 *
299 * RETURN VALUE: None
300 *
301 *****************************************************************************/
302 void f_dma_channel_enable (T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number)
303 {
304 F_DMA_CHANNEL_ENABLE(d_dma_channel_number);
305 }/* f_dma_channel_enable() */
306
307 /******************************************************************************
308 *
309 * FUNCTION NAME: f_dma_channel_disable
310 * This function is used to disable a DMA transfer of a channel
311 *
312 *
313 * ARGUMENT LIST:
314 *
315 * Argument Type IO Description
316 * ---------- ---------- -- -------------------------------------------
317 * d_dma_channel_number T_DMA_TYPE_CHANNEL_NUMBER I Variable to define which channel is disabled.
318 *
319 *
320 *
321 * RETURN VALUE: None
322 *
323 *****************************************************************************/
324 void f_dma_channel_disable(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number)
325 {
326 F_DMA_CHANNEL_DISABLE(d_dma_channel_number);
327 } /*f_dma_channel_disable() */
328
329 /******************************************************************************
330 *
331 * FUNCTION NAME: f_dma_channel_auto_init_disable
332 * This function is disabling the auto-initialization mode of the channel.
333 * The channel completes the current transfer and stops.
334 *
335 * ARGUMENT LIST:
336 *
337 * Argument Type IO Description
338 * ---------- ---------- -- -------------------------------------------
339 * d_dma_channel_number T_DMA_TYPE_CHANNEL_NUMBER I Variable to define which channel is disabled from auto-init mode.
340 *
341 *
342 * RETURN VALUE: None
343 *
344 *****************************************************************************/
345 void f_dma_channel_auto_init_disable(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number)
346 {
347 F_DMA_CHANNEL_AUTO_INIT_DISABLE(d_dma_channel_number);
348 } /* f_dma_channel_auto_init_disable */
349
350 /******************************************************************************
351 *
352 * FUNCTION NAME: f_dma_get_channel_counter
353 * This function can be used to monitor address
354 * where the last data of a frame has been written.
355 * This function provides only the lowest16 bits of the address.
356 *
357 *
358 * ARGUMENT LIST:
359 *
360 * Argument Type IO Description
361 * ---------- ---------- -- -------------------------------------------
362 * d_dma_channel_number T_DMA_TYPE_CHANNEL_NUMBER I Variable to define from which channel, we get the counter.
363 *
364 * RETURN VALUE: None
365 *
366 *****************************************************************************/
367 SYS_UWORD16 f_dma_get_channel_counter(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number)
368 {
369 return(F_DMA_GET_CHANNEL_COUNTER(d_dma_channel_number));
370 } /*f_dma_get_channel_counter() */
371
372 /******************************************************************************
373 *
374 * FUNCTION NAME: f_dma_channel_soft_reset
375 * perform a soft reset of the following parameter of the channel :
376 * Source address,Destination address,Element number,Frame number,Channel counter
377 *
378 *
379 *
380 * ARGUMENT LIST:
381 *
382 * Argument Type IO Description
383 * ---------- ---------- -- -------------------------------------------
384 * d_dma_channel_number T_DMA_TYPE_CHANNEL_NUMBER I Variable to define which channel is soft reset.
385 *
386 *
387 * RETURN VALUE: None
388 *
389 *****************************************************************************/
390 void f_dma_channel_soft_reset(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number)
391 {
392 C_DMA_SRR_REG |= ( 0x1 << d_dma_channel_number);
393
394 while (C_DMA_SRR_REG & ( 0x1 << d_dma_channel_number)) /* wait for the reset is completed */
395 {
396 }
397
398 } /*f_dma_channel_soft_reset() */
399 #endif /* (CHIPSET == 12) */