FreeCalypso > hg > tcs211-c139
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) */ |