1 /******************************************************************************
2 ** File Name: dma_drv_internal.h *
3 ** Author: Guofu.Huang *
5 ** Copyright: 2010 Spreatrum, Incoporated. All Rights Reserved. *
6 ** Description: dma driver infterface specfication *
7 ** Note:In DMA7, data blcok in DMA9 was named busrt, *
8 ** Here we all used block.*
9 ** any advice, please fell free to contact me. *
10 ******************************************************************************/
11 /******************************************************************************
13 **---------------------------------------------------------------------------*
14 ** DATE NAME DESCRIPTION *
15 ** 2010-2-9 Guofu.Huang Created, Rewrite dma driver *
16 ******************************************************************************/
17 #ifndef _DMA_DRV_INTERNAL_H_
18 #define _DMA_DRV_INTERNAL_H_
19 /*----------------------------------------------------------------------------*
21 **-------------------------------------------------------------------------- */
22 /**---------------------------------------------------------------------------*
24 **---------------------------------------------------------------------------*/
29 /**----------------------------------------------------------------------------*
31 **----------------------------------------------------------------------------*/
32 #define DMA_CHANNELID_MAX (DMA_CH_NUM-1)//0 - 31
33 #define DMA_CHANNELID_INVALID (0xFFFFFFFF)
34 #define DMA_LINKLIST_HANDLE_INVALID (0xFFFFFFFF)
35 #define DMA_UID_SOFT (0)
36 #define DMA_UID_MAX (32)
38 #define DMA_LIST_SIZE_MAX (64)//max length used in both linklist and soflist mode
40 //---------------------------------------------------------------------------
43 //int status BIT: 3bits value
44 #define DMA_INT_BIT_BLOCK 0 // bit 0
45 #define DMA_INT_BIT_TRANS 1 // bit 1
46 #define DMA_INT_BIT_LIST 2 // bit 2
48 #define DMA_CHN_INT_TYPE_NONE 0
49 #define DMA_CHN_INT_TYPE_BLOCKDONE (1<<DMA_INT_BIT_BLOCK)
50 #define DMA_CHN_INT_TYPE_TRANSDONE (1<<DMA_INT_BIT_TRANS)
51 #define DMA_CHN_INT_TYPE_LISTDONE (1<<DMA_INT_BIT_LIST)
53 /**----------------------------------------------------------------------------*
55 **----------------------------------------------------------------------------*/
56 //int status type: 3bits value
57 //DMA_CHN_INT_TYPE_BLOCKDONE | DMA_CHN_INT_TYPE_TRANSDONE | DMA_CHN_INT_TYPE_LISTDONE
58 typedef void (*DMA_HAL_ISR_HANDLER) (uint32 inttype);
60 typedef uint32 DMA_LINKLIST_HANDLE;
63 typedef enum _DMA_CHN_PRIORITY
65 DMA_CHN_PRIORITY_0 = 0, // LOWEST PRI
68 DMA_CHN_PRIORITY_3, // HIGHIST
73 typedef enum _DMA_ENDIANTYPE
75 DMA_ENDIANTYPE_BIG = 0,
76 DMA_ENDIANTYPE_LITTLE,
81 typedef enum _DMA_ENDIANSWITCHMODE
83 DMA_ENDIANSWITCHMODE_UN = 0,
84 DMA_ENDIANSWITCHMODE_FULL,
85 DMA_ENDIANSWITCHMODE_MODE0,
86 DMA_ENDIANSWITCHMODE_MODE1,
87 DMA_ENDIANSWITCHMODE_MAX
88 } DMA_ENDIANSWITCHMODE_E;
91 typedef enum _DMA_DATAWIDTH
93 DMA_DATAWIDTH_BYTE = 0,
94 DMA_DATAWIDTH_HALFWORD,
100 typedef enum _DMA_CHN_WORKMODE
102 DMA_CHN_WORKMODE_NORMAL = 0,
103 DMA_CHN_WORKMODE_LINKLIST,
104 DMA_CHN_WORKMODE_SOFTLIST,
106 } DMA_CHN_WORKMODE_E;
109 typedef enum _DMA_CHN_REQMODE
111 DMA_CHN_REQMODE_NORMAL = 0,
112 DMA_CHN_REQMODE_TRASACTION,
113 DMA_CHN_REQMODE_LIST,
114 DMA_CHN_REQMODE_INFINITE,
119 typedef enum _DMA_BLOCKMODE
121 DMA_BLOCKMODE_SINGLETRANS = 0,
125 DMA_BLOCKMODE_INCR16,
129 //dma channel config struct
130 typedef struct _DMA_ChnCfg_Struct
132 // normal config param, these param maybe used in most scence
133 DMA_CHN_TYPE_E type; /* hardware or software */
134 DMA_CHN_PRIORITY_E priority; /* dma channel priority */
135 DMA_CHN_WORKMODE_E workmode; /* normal/linklist/soflist */
136 DMA_DATAWIDTH_E src_datawidth; /* source data width */
137 DMA_DATAWIDTH_E dest_datawidth; /* dest data width */
138 uint32 src_address; /* src start address */
139 uint32 dest_address; /* des start address */
140 DMA_CHN_REQMODE_E requestmode; /* request mode */
141 uint16 block_length; /* block length */
142 uint32 total_length; /* total length */
143 int32 src_step; /* SrcElementPost-modification */
144 int32 dest_step; /* DestElementPost-modification */
145 DMA_BLOCKMODE_E src_blockmode; /* INCR4,8m16 */
146 DMA_BLOCKMODE_E dest_blockmode; /* INCR4,8m16 */
147 int32 src_blockstep ; /* SrcBlockPost-modification */
148 int32 dest_blockstep; /* SrcBlockPost-modification */
149 BOOLEAN is_srcwrapen; /* src wrap enable */
150 BOOLEAN is_destwrapen; /* dst wrap enable */
151 uint32 wrapstart_addr; /* wrap start addr */
152 uint32 wrapend_addr; /* wrap end addr */
153 BOOLEAN is_ll_end; /* linklist end flag */
154 uint32 ll_next; /* point to next link list node */
155 DMA_ENDIANSWITCHMODE_E endian_switchmode; /* endian switch mode */
156 BOOLEAN is_noautoclose; /* no auto close */
157 DMA_ENDIANTYPE_E endian_type; /* endian selection */
158 //uint8 uid; /* dma channel uid 0-31 */
160 } DMA_CHNCFG_T, *DMA_CHNCFG_PTR;
163 typedef enum _DMA_ERR_TYPE_E
165 DMA_ERR_TYPE_NONE = 0,
166 DMA_ERR_TYPE_INVALID_CHNID,
167 DMA_ERR_TYPE_INVALID_PARAM,
168 DMA_ERR_TYPE_CHNTYPE_MISMATCHED,
169 DMA_ERR_TYPE_NOT_AVAILABLE,
170 DMA_ERR_TYPE_LIST_OVERRUN,
171 DMA_ERR_TYPE_LIST_NODATA,
172 DMA_ERR_TYPE_LIST_APPENDFAIL,
177 /**----------------------------------------------------------------------------*
178 ** Public Function Prototype **
179 **----------------------------------------------------------------------------*/
181 /*****************************************************************************/
182 // Description: dma driver init
183 // Global resource dependence:
184 // Author: Guofu.Huang
186 // Return Value: if success return DMA_ERR_TYPE_NONE
187 /*****************************************************************************/
188 PUBLIC void DMA_HAL_Init (void);
190 /*****************************************************************************/
191 // Description: set dma pause
192 // Global resource dependence:
193 // Author: Guofu.Huang
194 // Note: s_pause:SCI_TRUE,pause dma; SCI_FALSE,resume dma
195 // Return Value: if success return DMA_ERR_TYPE_NONE
196 /*****************************************************************************/
197 PUBLIC void DMA_HAL_SetPause (BOOLEAN is_pause);
199 /*****************************************************************************/
200 // Description: alloc soft dma channel
201 // Global resource dependence:
202 // Author: Guofu.Huang
203 // Note: if success return channel id, otherwise return DMA_CHANNELID_INVALID
204 /*****************************************************************************/
205 PUBLIC uint32 DMA_HAL_AllocSoftChn (void);
207 /*****************************************************************************/
208 // Description: release channel
209 // Global resource dependence:
210 // Author: Guofu.Huang
212 // Return Value: if success return DMA_ERR_TYPE_NONE
213 /*****************************************************************************/
214 PUBLIC void DMA_HAL_FreeSoftChn (uint32 channel);
216 /*****************************************************************************/
217 // Description: configure a dma channel
218 // Global resource dependence:
219 // Author: Guofu.Huang
220 // Note: channel:channel to be configured
221 // chncfgstruct:channel configure struct
222 // Return Value: if success return DMA_ERR_TYPE_NONE
223 /*****************************************************************************/
224 PUBLIC void DMA_HAL_ChnConfig (uint32 channel, DMA_CHNCFG_PTR chnparam);
226 /*****************************************************************************/
227 // Description: set dma priority
228 // Global resource dependence:
229 // Author: Guofu.Huang
230 // Note: channel:dma channel number,0-31
231 // priority:channel priority,0-3
232 // Return Value: if success return DMA_ERR_TYPE_NONE
233 /*****************************************************************************/
234 PUBLIC void DMA_HAL_SetChnPriority (uint32 channel,DMA_CHN_PRIORITY_E priority);
236 /*****************************************************************************/
237 // Description: dma request enable/disable
238 // Global resource dependence:
239 // Author: Guofu.Huang
240 // Note: channel : channel No
241 // is_enable: enable/disable
242 // Return Value: if success return DMA_ERR_TYPE_NONE
243 /*****************************************************************************/
244 PUBLIC void DMA_HAL_ChnEnable (uint32 channel, BOOLEAN is_enable);
246 /*****************************************************************************/
247 // Description: get dma channel transdone interrupt raw status
248 // Global resource dependence:
249 // Author: Guofu.Huang
250 // Note: channel:dma channel number,0-31
251 // Return value: return SCI_TRUE if the channel transfer finished,
252 /*****************************************************************************/
253 PUBLIC BOOLEAN DMA_HAL_PollingTransDone (uint32 channel);
255 /*****************************************************************************/
256 // Description: get dma channel blockdone interrupt raw status
257 // Global resource dependence:
258 // Author: Guofu.Huang
259 // Note: channel:dma channel number,0-31
260 // Return value: return SCI_TRUE if the channel transfer finished,
261 /*****************************************************************************/
262 PUBLIC BOOLEAN DMA_HAL_PollingBlockDone (uint32 channel);
264 /*****************************************************************************/
265 // Description: get dma channel listdone interrupt raw status
266 // Global resource dependence:
267 // Author: Guofu.Huang
268 // Note: channel:dma channel number,0-31
269 // Return value: return SCI_TRUE if the channel transfer finished,
270 /*****************************************************************************/
271 PUBLIC BOOLEAN DMA_HAL_PollingListDone (uint32 channel);
273 /*****************************************************************************/
274 // Description: configure dma channel interrupt
275 // Global resource dependence:
276 // Author: Guofu.Huang
277 // Note: channel:dma channel number,0-31
278 // inttype:interrupt type,including all transfer done,burst done and link done.
279 // is_enable:SCI_TRUE,enable the interrupt, SCI_FALSE,disable the interrupt
280 // callback:interrupt service,if is_enable=SCI_FALSE, it is unuseful.
281 // Return Value: if success return DMA_ERR_TYPE_NONE
282 /*****************************************************************************/
283 PUBLIC void DMA_HAL_ChnIntConfig (uint32 channel, uint32 inttype, DMA_HAL_ISR_HANDLER callback);
285 /*****************************************************************************/
286 // Description: init a link transfer
287 // Global resource dependence:
288 // Author: Guofu.Huang
289 // Note: channel:dma channel id
290 // Return value: if success return link list handle, otherwise return DMA_LINKLIST_HANDLE_INVALID
291 /*****************************************************************************/
292 PUBLIC DMA_LINKLIST_HANDLE DMA_HAL_InitLinkList (uint32 channel);
294 /*****************************************************************************/
295 // Description: append a link element
296 // Global resource dependence:
297 // Author: Guofu.Huang
298 // Note: linklisthandle:link list handle
299 // linklistelement:element to append
300 // Return Value: if success return DMA_ERR_TYPE_NONE
301 /*****************************************************************************/
302 PUBLIC DMA_ERR_TYPE_E DMA_HAL_AppendInitLinkList (DMA_LINKLIST_HANDLE linklisthandle,
303 DMA_CHNCFG_PTR param);
305 /*****************************************************************************/
306 // Description: submit a link list and start transfer
307 // Global resource dependence:
308 // Author: Guofu.Huang
309 // Note: linklisthandle: link list handle
310 // is_int_used:polling or interrupt,if SCI_TRUE, intterrupt used
311 // callback: if interrupt used,callback need
312 // Return Value: if success return DMA_ERR_TYPE_NONE
313 /*****************************************************************************/
314 PUBLIC DMA_ERR_TYPE_E DMA_HAL_SubmitInitLinkList (DMA_LINKLIST_HANDLE linklisthandle);
316 /*****************************************************************************/
317 // Description: free link list
318 // Global resource dependence:
319 // Author: Guofu.Huang
320 // Note: linklisthandle:link list to release
321 /*****************************************************************************/
322 PUBLIC void DMA_HAL_FreeLinkList (DMA_LINKLIST_HANDLE linklisthandle);
324 /*****************************************************************************/
325 // Description : This function is used to enable or disable dma pause function.
326 // Global resource dependence : s_dma_pause_disable_cnt
328 // Note : is_enable : TURE: enable dma pause function; FALSE: disable dma pause function
329 /*****************************************************************************/
330 PUBLIC void DMA_HAL_EnableDMAPause (BOOLEAN is_enable);
332 /*****************************************************************************/
333 // Description : This function is used to get the function status of dma pause
334 // Global resource dependence : s_dma_pause_disable_cnt
336 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
337 /*****************************************************************************/
338 PUBLIC BOOLEAN DMA_HAL_IsEnableDMAPause (void);
340 /*****************************************************************************/
341 // Description : This function is used to get the dma pause status
342 // Global resource dependence : s_is_dma_pause
344 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
345 /*****************************************************************************/
346 PUBLIC BOOLEAN DMA_HAL_IsDMAPause (void);
348 /**----------------------------------------------------------------------------*
350 **----------------------------------------------------------------------------*/
354 /**---------------------------------------------------------------------------*/
355 #endif //_DMA_DRV_INTERNAL_H_