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_TYPE
65 DMA_CHN_TYPE_HARD = 0,
72 typedef enum _DMA_CHN_PRIORITY
74 DMA_CHN_PRIORITY_0 = 0, // LOWEST PRI
77 DMA_CHN_PRIORITY_3, // HIGHIST
82 typedef enum _DMA_ENDIANTYPE
84 DMA_ENDIANTYPE_BIG = 0,
85 DMA_ENDIANTYPE_LITTLE,
90 typedef enum _DMA_ENDIANSWITCHMODE
92 DMA_ENDIANSWITCHMODE_UN = 0,
93 DMA_ENDIANSWITCHMODE_FULL,
94 DMA_ENDIANSWITCHMODE_MODE0,
95 DMA_ENDIANSWITCHMODE_MODE1,
96 DMA_ENDIANSWITCHMODE_MAX
97 } DMA_ENDIANSWITCHMODE_E;
100 typedef enum _DMA_DATAWIDTH
102 DMA_DATAWIDTH_BYTE = 0,
103 DMA_DATAWIDTH_HALFWORD,
109 typedef enum _DMA_CHN_WORKMODE
111 DMA_CHN_WORKMODE_NORMAL = 0,
112 DMA_CHN_WORKMODE_LINKLIST,
113 DMA_CHN_WORKMODE_SOFTLIST,
115 } DMA_CHN_WORKMODE_E;
118 typedef enum _DMA_CHN_REQMODE
120 DMA_CHN_REQMODE_NORMAL = 0,
121 DMA_CHN_REQMODE_TRASACTION,
122 DMA_CHN_REQMODE_LIST,
123 DMA_CHN_REQMODE_INFINITE,
128 typedef enum _DMA_BLOCKMODE
130 DMA_BLOCKMODE_SINGLETRANS = 0,
134 DMA_BLOCKMODE_INCR16,
138 //dma channel config struct
139 typedef struct _DMA_ChnCfg_Struct
141 // normal config param, these param maybe used in most scence
142 DMA_CHN_TYPE_E type; /* hardware or software */
143 DMA_CHN_PRIORITY_E priority; /* dma channel priority */
144 DMA_CHN_WORKMODE_E workmode; /* normal/linklist/soflist */
145 DMA_DATAWIDTH_E src_datawidth; /* source data width */
146 DMA_DATAWIDTH_E dest_datawidth; /* dest data width */
147 uint32 src_address; /* src start address */
148 uint32 dest_address; /* des start address */
149 DMA_CHN_REQMODE_E requestmode; /* request mode */
150 uint16 block_length; /* block length */
151 uint32 total_length; /* total length */
152 int32 src_step; /* SrcElementPost-modification */
153 int32 dest_step; /* DestElementPost-modification */
154 DMA_BLOCKMODE_E src_blockmode; /* INCR4,8m16 */
155 DMA_BLOCKMODE_E dest_blockmode; /* INCR4,8m16 */
156 int32 src_blockstep ; /* SrcBlockPost-modification */
157 int32 dest_blockstep; /* SrcBlockPost-modification */
158 BOOLEAN is_srcwrapen; /* src wrap enable */
159 BOOLEAN is_destwrapen; /* dst wrap enable */
160 uint32 wrapstart_addr; /* wrap start addr */
161 uint32 wrapend_addr; /* wrap end addr */
162 BOOLEAN is_ll_end; /* linklist end flag */
163 uint32 ll_next; /* point to next link list node */
164 DMA_ENDIANSWITCHMODE_E endian_switchmode; /* endian switch mode */
165 BOOLEAN is_noautoclose; /* no auto close */
166 DMA_ENDIANTYPE_E endian_type; /* endian selection */
167 //uint8 uid; /* dma channel uid 0-31 */
169 } DMA_CHNCFG_T, *DMA_CHNCFG_PTR;
172 typedef enum _DMA_ERR_TYPE_E
174 DMA_ERR_TYPE_NONE = 0,
175 DMA_ERR_TYPE_INVALID_CHNID,
176 DMA_ERR_TYPE_INVALID_PARAM,
177 DMA_ERR_TYPE_CHNTYPE_MISMATCHED,
178 DMA_ERR_TYPE_NOT_AVAILABLE,
179 DMA_ERR_TYPE_LIST_OVERRUN,
180 DMA_ERR_TYPE_LIST_NODATA,
181 DMA_ERR_TYPE_LIST_APPENDFAIL,
186 /**----------------------------------------------------------------------------*
187 ** Public Function Prototype **
188 **----------------------------------------------------------------------------*/
190 /*****************************************************************************/
191 // Description: dma driver init
192 // Global resource dependence:
193 // Author: Guofu.Huang
195 // Return Value: if success return DMA_ERR_TYPE_NONE
196 /*****************************************************************************/
197 PUBLIC void DMA_HAL_Init (void);
199 /*****************************************************************************/
200 // Description: set dma pause
201 // Global resource dependence:
202 // Author: Guofu.Huang
203 // Note: s_pause:SCI_TRUE,pause dma; SCI_FALSE,resume dma
204 // Return Value: if success return DMA_ERR_TYPE_NONE
205 /*****************************************************************************/
206 PUBLIC void DMA_HAL_SetPause (BOOLEAN is_pause);
208 /*****************************************************************************/
209 // Description: alloc soft dma channel
210 // Global resource dependence:
211 // Author: Guofu.Huang
212 // Note: if success return channel id, otherwise return DMA_CHANNELID_INVALID
213 /*****************************************************************************/
214 PUBLIC uint32 DMA_HAL_AllocSoftChn (void);
216 /*****************************************************************************/
217 // Description: release channel
218 // Global resource dependence:
219 // Author: Guofu.Huang
221 // Return Value: if success return DMA_ERR_TYPE_NONE
222 /*****************************************************************************/
223 PUBLIC void DMA_HAL_FreeSoftChn (uint32 channel);
225 /*****************************************************************************/
226 // Description: configure a dma channel
227 // Global resource dependence:
228 // Author: Guofu.Huang
229 // Note: channel:channel to be configured
230 // chncfgstruct:channel configure struct
231 // Return Value: if success return DMA_ERR_TYPE_NONE
232 /*****************************************************************************/
233 PUBLIC void DMA_HAL_ChnConfig (uint32 channel, DMA_CHNCFG_PTR chnparam);
235 /*****************************************************************************/
236 // Description: set dma priority
237 // Global resource dependence:
238 // Author: Guofu.Huang
239 // Note: channel:dma channel number,0-31
240 // priority:channel priority,0-3
241 // Return Value: if success return DMA_ERR_TYPE_NONE
242 /*****************************************************************************/
243 PUBLIC void DMA_HAL_SetChnPriority (uint32 channel,DMA_CHN_PRIORITY_E priority);
245 /*****************************************************************************/
246 // Description: dma request enable/disable
247 // Global resource dependence:
248 // Author: Guofu.Huang
249 // Note: channel : channel No
250 // is_enable: enable/disable
251 // Return Value: if success return DMA_ERR_TYPE_NONE
252 /*****************************************************************************/
253 PUBLIC void DMA_HAL_ChnEnable (uint32 channel, BOOLEAN is_enable);
255 /*****************************************************************************/
256 // Description: get dma channel transdone 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_PollingTransDone (uint32 channel);
264 /*****************************************************************************/
265 // Description: get dma channel blockdone 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_PollingBlockDone (uint32 channel);
273 /*****************************************************************************/
274 // Description: get dma channel listdone interrupt raw status
275 // Global resource dependence:
276 // Author: Guofu.Huang
277 // Note: channel:dma channel number,0-31
278 // Return value: return SCI_TRUE if the channel transfer finished,
279 /*****************************************************************************/
280 PUBLIC BOOLEAN DMA_HAL_PollingListDone (uint32 channel);
282 /*****************************************************************************/
283 // Description: configure dma channel interrupt
284 // Global resource dependence:
285 // Author: Guofu.Huang
286 // Note: channel:dma channel number,0-31
287 // inttype:interrupt type,including all transfer done,burst done and link done.
288 // is_enable:SCI_TRUE,enable the interrupt, SCI_FALSE,disable the interrupt
289 // callback:interrupt service,if is_enable=SCI_FALSE, it is unuseful.
290 // Return Value: if success return DMA_ERR_TYPE_NONE
291 /*****************************************************************************/
292 PUBLIC void DMA_HAL_ChnIntConfig (uint32 channel, uint32 inttype, DMA_HAL_ISR_HANDLER callback);
294 /*****************************************************************************/
295 // Description: init a link transfer
296 // Global resource dependence:
297 // Author: Guofu.Huang
298 // Note: channel:dma channel id
299 // Return value: if success return link list handle, otherwise return DMA_LINKLIST_HANDLE_INVALID
300 /*****************************************************************************/
301 PUBLIC DMA_LINKLIST_HANDLE DMA_HAL_InitLinkList (uint32 channel);
303 /*****************************************************************************/
304 // Description: append a link element
305 // Global resource dependence:
306 // Author: Guofu.Huang
307 // Note: linklisthandle:link list handle
308 // linklistelement:element to append
309 // Return Value: if success return DMA_ERR_TYPE_NONE
310 /*****************************************************************************/
311 PUBLIC DMA_ERR_TYPE_E DMA_HAL_AppendInitLinkList (DMA_LINKLIST_HANDLE linklisthandle,
312 DMA_CHNCFG_PTR param);
314 /*****************************************************************************/
315 // Description: submit a link list and start transfer
316 // Global resource dependence:
317 // Author: Guofu.Huang
318 // Note: linklisthandle: link list handle
319 // is_int_used:polling or interrupt,if SCI_TRUE, intterrupt used
320 // callback: if interrupt used,callback need
321 // Return Value: if success return DMA_ERR_TYPE_NONE
322 /*****************************************************************************/
323 PUBLIC DMA_ERR_TYPE_E DMA_HAL_SubmitInitLinkList (DMA_LINKLIST_HANDLE linklisthandle);
325 /*****************************************************************************/
326 // Description: free link list
327 // Global resource dependence:
328 // Author: Guofu.Huang
329 // Note: linklisthandle:link list to release
330 /*****************************************************************************/
331 PUBLIC void DMA_HAL_FreeLinkList (DMA_LINKLIST_HANDLE linklisthandle);
333 /*****************************************************************************/
334 // Description : This function is used to enable or disable dma pause function.
335 // Global resource dependence : s_dma_pause_disable_cnt
337 // Note : is_enable : TURE: enable dma pause function; FALSE: disable dma pause function
338 /*****************************************************************************/
339 PUBLIC void DMA_HAL_EnableDMAPause (BOOLEAN is_enable);
341 /*****************************************************************************/
342 // Description : This function is used to get the function status of dma pause
343 // Global resource dependence : s_dma_pause_disable_cnt
345 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
346 /*****************************************************************************/
347 PUBLIC BOOLEAN DMA_HAL_IsEnableDMAPause (void);
349 /*****************************************************************************/
350 // Description : This function is used to get the dma pause status
351 // Global resource dependence : s_is_dma_pause
353 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
354 /*****************************************************************************/
355 PUBLIC BOOLEAN DMA_HAL_IsDMAPause (void);
357 /**----------------------------------------------------------------------------*
359 **----------------------------------------------------------------------------*/
363 /**---------------------------------------------------------------------------*/
364 #endif //_DMA_DRV_INTERNAL_H_