Home | History | Annotate | Download | only in hwdefs
      1 /*
      2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
      3  * Copyright (c) Imagination Technologies Limited, UK
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  */
     25 
     26 
     27 /*!
     28 ******************************************************************************
     29  @file   : dma_api.h
     30 
     31  @brief
     32 
     33  @date   02/11/2005
     34 
     35  \n<b>Description:</b>\n
     36          This file contains header file for the MTX DMAC API.
     37 
     38          The MTX DMAC API can operate synchronously or asynchronously.
     39 
     40                  In synchronous case, the API uses an internal callback function
     41                  to detect state transitions and the SEMA API to block whilst
     42                  waiting for the transfer to complete.
     43 
     44                  In the asynchronous case, the caller is responsible for
     45                  detecting and handling the state transitions and synchronising
     46                  with other processes/processing.
     47 
     48  \n<b>Platform:</b>\n
     49          MSVDX/MTX
     50 
     51 ******************************************************************************/
     52 /*
     53 ******************************************************************************
     54  Modifications :-
     55 
     56  $Log: dma_api.h $
     57 
     58   --- Revision Logs Removed ---
     59 
     60   --- Revision Logs Removed ---
     61 
     62   --- Revision Logs Removed ---
     63 
     64   --- Revision Logs Removed ---
     65 
     66   --- Revision Logs Removed ---
     67 
     68   --- Revision Logs Removed ---
     69 
     70   --- Revision Logs Removed ---
     71 
     72   --- Revision Logs Removed ---
     73 
     74   --- Revision Logs Removed ---
     75 
     76   --- Revision Logs Removed ---
     77 
     78   --- Revision Logs Removed ---
     79 
     80   --- Revision Logs Removed ---
     81 
     82   --- Revision Logs Removed ---
     83 
     84   --- Revision Logs Removed ---
     85 
     86   --- Revision Logs Removed ---
     87 
     88   --- Revision Logs Removed ---
     89 
     90   --- Revision Logs Removed ---
     91 
     92   --- Revision Logs Removed ---
     93 
     94   --- Revision Logs Removed ---
     95 
     96   --- Revision Logs Removed ---
     97 
     98   --- Revision Logs Removed ---
     99 
    100   --- Revision Logs Removed ---
    101 
    102   --- Revision Logs Removed ---
    103 
    104 
    105 *****************************************************************************/
    106 
    107 
    108 #if !defined (__DMA_API_H__)
    109 #define __DMA_API_H__
    110 
    111 #include <img_types.h>
    112 #include "msvdx_dmac_regs_io2.h"
    113 #include "msvdx_dmac_linked_list.h"
    114 
    115 #if (__cplusplus)
    116 extern "C" {
    117 #endif
    118 
    119     /*!
    120     ******************************************************************************
    121      This type defines the DMAC status
    122     ******************************************************************************/
    123     typedef enum {
    124         DMA_STATUS_IDLE,                        //!< The DMAC is idle.
    125         DMA_STATUS_BUSY,                        //!< The DMAC is busy - a DMA is in progress.
    126         DMA_STATUS_COMPLETE,            /*!< The DMAC operation has completed - return by
    127                                                                          DMA_GetStatus()once before the DMAC returns
    128                                                                          to #DMA_STATUS_IDLE.                                                   */
    129         DMA_STATUS_TIMEOUT,                 /*!< The DMAC operation has timed-out - return by
    130                                                                          DMA_GetStatus()once before the DMAC returns
    131                                                                          to #DMA_STATUS_IDLE.                                                   */
    132 
    133     }
    134     DMA_eStatus;
    135 
    136     /*!
    137     ******************************************************************************
    138      This type defines the DMA channel Ids
    139     ******************************************************************************/
    140     typedef enum {
    141         DMA_CHANNEL_MTX = 0x0,          //!< DMA channel for MTX
    142         DMA_CHANNEL_RESERVED,           //!< DMA channel 1 is reserved for VEC use
    143         DMA_CHANNEL_SR1,                        //!< DMA channel for 1st shift register
    144         DMA_CHANNEL_SR2,                        //!< DMA channel for 2nd shift register
    145         DMA_CHANNEL_SR3,                        //!< DMA channel for 3rd shift register
    146         DMA_CHANNEL_SR4,                        //!< DMA channel for 4th shift register
    147 
    148     } DMA_eChannelId;
    149 
    150     /*!
    151     ******************************************************************************
    152      Used with DMA_SyncAction() and DMA_AsyncAction() to indicate whether
    153      the peripheral is the mtx or not.
    154     ******************************************************************************/
    155     enum {
    156         DMA_PERIPH_IS_NOT_MTX   = 0,   //!< The peripheral is not the mtx.
    157         DMA_PERIPH_IS_MTX               = 1,   //!< The peripheral is the mtx.
    158     };
    159 
    160     /*!
    161     ******************************************************************************
    162      This type defines the byte swap settings.
    163     ******************************************************************************/
    164     typedef enum {
    165         DMA_BSWAP_NO_SWAP = 0x0,   //!< No byte swapping will be performed.
    166         DMA_BSWAP_REVERSE = 0x1,   //!< Byte order will be reversed.
    167 
    168     } DMA_eBSwap;
    169 
    170     /*!
    171     ******************************************************************************
    172      This type defines the peripheral width settings
    173     ******************************************************************************/
    174     typedef enum {
    175         DMA_PWIDTH_32_BIT = 0x0,       //!< Peripheral width 32-bit.
    176         DMA_PWIDTH_16_BIT = 0x1,       //!< Peripheral width 16-bit.
    177         DMA_PWIDTH_8_BIT  = 0x2,       //!< Peripheral width 8-bit.
    178 
    179     } DMA_ePW;
    180 
    181     /*!
    182     ******************************************************************************
    183      This type defines the direction of the DMA transfer
    184     ******************************************************************************/
    185     typedef enum {
    186         DMA_DIR_MEM_TO_PERIPH = 0x0, //!< Data from memory to peripheral.
    187         DMA_DIR_PERIPH_TO_MEM = 0x1, //!< Data from peripheral to memory.
    188 
    189     } DMA_eDir;
    190 
    191     /*!
    192     ******************************************************************************
    193      This type defines whether the peripheral address is to be incremented
    194     ******************************************************************************/
    195     typedef enum {
    196         DMA_PERIPH_INCR_ON      = 0x1,          //!< Peripheral address will be incremented
    197         DMA_PERIPH_INCR_OFF     = 0x0,          //!< Peripheral address will not be incremented
    198 
    199     } DMA_ePeriphIncr;
    200 
    201     /*!
    202     ******************************************************************************
    203      This type defines how much the peripheral address is incremented by
    204     ******************************************************************************/
    205     typedef enum {
    206         DMA_PERIPH_INCR_1       = 0x2,          //!< Increment peripheral address by 1
    207         DMA_PERIPH_INCR_2       = 0x1,          //!< Increment peripheral address by 2
    208         DMA_PERIPH_INCR_4       = 0x0,          //!< Increment peripheral address by 4
    209 
    210     } DMA_ePeriphIncrSize;
    211 
    212     /*!
    213     ******************************************************************************
    214      This type defines whether the 2d mode is enabled or disabled
    215     ******************************************************************************/
    216     typedef enum {
    217         DMA_MODE_2D_ON  = 0x1,          //!< the 2d mode will be used
    218         DMA_MODE_2D_OFF = 0x0,          //!< the 2d mode will not be used
    219 
    220     } DMA_eMode2D;
    221 
    222     /*!
    223     ******************************************************************************
    224 
    225      @Function              DMA_LL_SET_WD0
    226 
    227      @Description
    228 
    229      Set word 0 in a dmac linked list entry.
    230 
    231      @Input    pList            : pointer to start of linked list entry
    232 
    233      @Input    BSWAP        : big/little endian byte swap (see DMA_eBSwap).
    234 
    235      @Input    DIR                      : transfer direction (see DMA_eDir).
    236 
    237      @Input    PW                       : peripheral width (see DMA_ePW).
    238 
    239      @Return   nothing
    240 
    241     ******************************************************************************/
    242 #define DMA_LL_SET_WD0(pList, BSWAP, DIR, PW)                   \
    243         do{                                                                                                     \
    244                 MEMIO_WRITE_FIELD(pList, DMAC_LL_BSWAP, BSWAP); \
    245                 MEMIO_WRITE_FIELD(pList, DMAC_LL_DIR,   DIR);   \
    246                 MEMIO_WRITE_FIELD(pList, DMAC_LL_PW,    PW);    \
    247         }while(0)
    248 
    249 
    250     /*!
    251     ******************************************************************************
    252 
    253      @Function              DMA_LL_SET_WD1
    254 
    255      @Description
    256 
    257      Set word 1 in a dmac linked list entry.
    258 
    259      @Input    pList            : pointer to start of linked list entry
    260 
    261      @Input    INCR                     : whether to increment the peripeheral address (see DMA_ePeriphIncr)
    262 
    263      @Input    PI                       : how much to increment the peripheral address by (see DMA_ePeriphIncrSize)
    264 
    265      @Input    LEN                      : length of transfer in peripheral width units
    266 
    267      @Return   nothing
    268 
    269     ******************************************************************************/
    270 #define DMA_LL_SET_WD1(pList, INCR, PI, LEN)                    \
    271         do      {                                                                                                       \
    272                 MEMIO_WRITE_FIELD(pList, DMAC_LL_PI,    PI);            \
    273                 MEMIO_WRITE_FIELD(pList, DMAC_LL_INCR,  INCR);          \
    274                 MEMIO_WRITE_FIELD(pList, DMAC_LL_LEN,   LEN);           \
    275         }while(0)
    276 
    277     /*!
    278     ******************************************************************************
    279 
    280      @Function              DMA_LL_SET_WD2
    281 
    282      @Description
    283 
    284      Set word 2 in a dmac linked list entry.
    285 
    286      @Input    pList            : pointer to start of linked list entry
    287 
    288      @Input    PERI_ADDR        : the perihperal address to transfer to/from
    289 
    290      @Return   nothing
    291 
    292     ******************************************************************************/
    293 #define DMA_LL_SET_WD2(pList, PERI_ADDR)                                        \
    294         do {                                                                                                    \
    295                 MEMIO_WRITE_FIELD(pList, DMAC_LL_ADDR, PERI_ADDR);      \
    296         }while(0)
    297 
    298     /*!
    299     ******************************************************************************
    300 
    301      @Function              DMA_LL_SET_WD3
    302 
    303      @Description
    304 
    305      Set word 3 in a dmac linked list entry.
    306 
    307      @Input    pList            : pointer to start of linked list entry
    308 
    309      @Input    ACC_DEL          : access delay (see DMA_eAccDel)
    310 
    311      @Input    BURST            : burst size (see DMA_eBurst)
    312 
    313      @Return   nothing
    314 
    315     ******************************************************************************/
    316 #define DMA_LL_SET_WD3(pList, ACC_DEL, BURST , EXTSA )                  \
    317         do {                                                                                                            \
    318                 MEMIO_WRITE_FIELD(pList, DMAC_LL_ACC_DEL,       ACC_DEL);       \
    319                 MEMIO_WRITE_FIELD(pList, DMAC_LL_BURST,         BURST);         \
    320                 MEMIO_WRITE_FIELD(pList, DMAC_LL_EXT_SA,        EXTSA);         \
    321         }while(0)
    322 
    323     /*!
    324     ******************************************************************************
    325 
    326      @Function              DMA_LL_SET_WD4
    327 
    328      @Description
    329 
    330      Set word 4 in a dmac linked list entry.
    331 
    332      @Input    pList            : pointer to start of linked list entry
    333 
    334      @Input    MODE_2D          : enable/disable 2d mode (see DMA_eMode2D)
    335 
    336      @Input    REP_COUNT        : repeat count (the number of rows transferred)
    337 
    338      @Return   nothing
    339 
    340     ******************************************************************************/
    341 #define DMA_LL_SET_WD4(pList, MODE_2D, REP_COUNT)                       \
    342         do {                                                                                                    \
    343         MEMIO_WRITE_FIELD(pList, DMAC_LL_MODE_2D,       MODE_2D);       \
    344         MEMIO_WRITE_FIELD(pList, DMAC_LL_REP_COUNT,     REP_COUNT); \
    345         } while(0)
    346 
    347     /*!
    348     ******************************************************************************
    349 
    350      @Function              DMA_LL_SET_WD5
    351 
    352      @Description
    353 
    354      Set word 5 in a dmac linked list entry.
    355 
    356      @Input    pList            : pointer to start of linked list entry
    357 
    358      @Input    LINE_ADD_OFF     : number of bytes from the end of one row to the start of the next row
    359                                                 (only applicable when using 2D transfer mode)
    360 
    361      @Input    ROW_LENGTH       : number of bytes per row
    362                                                 (only applicable when using 2D transfer mode)
    363 
    364      @Return   nothing
    365 
    366     ******************************************************************************/
    367 #define DMA_LL_SET_WD5(pList, LINE_ADD_OFF, ROW_LENGTH)                                 \
    368         do{                                                                                                                                     \
    369         MEMIO_WRITE_FIELD(pList, DMAC_LL_LINE_ADD_OFF,  LINE_ADD_OFF);          \
    370         MEMIO_WRITE_FIELD(pList, DMAC_LL_ROW_LENGTH,    ROW_LENGTH);            \
    371         }while(0)
    372 
    373     /*!
    374     ******************************************************************************
    375 
    376      @Function              DMA_LL_SET_WD6
    377 
    378      @Description
    379 
    380      Set word 6 in a dmac linked list entry.
    381 
    382      @Input    pList            : pointer to start of linked list entry
    383 
    384      @Input    SA                       : the host memory address to transfer to/from
    385 
    386      @Return   nothing
    387 
    388     ******************************************************************************/
    389 #define DMA_LL_SET_WD6(pList, SA)                                               \
    390         do{                                                                                                     \
    391                 MEMIO_WRITE_FIELD(pList, DMAC_LL_SA,    SA);    \
    392         }while(0)
    393 
    394     /*!
    395     ******************************************************************************
    396 
    397     @Function              DMA_LL_SET_WD7
    398 
    399     @Description
    400 
    401     Set word 7 in a dmac linked list entry.
    402 
    403     @Input    pList:            pointer to start of linked list entry
    404 
    405     @Input    LISTPTR:          pointer to next linked list entry
    406 
    407     If the linked list entry is in MTX memory (eListLocation == DMA_LIST_IS_IN_MTX_MEM) then
    408     LISTPTR is a pointer to the start of the next linked list entry.  If the linked list entry
    409     is in HOST memory (eListLocation == DMA_LIST_IS_IN_SYS_MEM) then LISTPTR is a pointer to the
    410     start of the next linked list entry, but right shifted by 4 bits (i.e. ptr >> 4).  If this
    411     is the last entry in the linked list sequence then LISTPTR must be set to NULL.
    412 
    413     @Return   nothing
    414 
    415     ******************************************************************************/
    416 #define DMA_LL_SET_WD7(pList, LISTPTR)                                                                  \
    417         do {                                                                                                                            \
    418                 MEMIO_WRITE_FIELD(pList, DMAC_LL_LISTPTR,       LISTPTR);                       \
    419                 MEMIO_WRITE_FIELD(pList, DMAC_LL_LIST_FIN,      (LISTPTR) ? 0 : 1);     \
    420         }while(0)
    421 
    422 
    423     /*!
    424     ******************************************************************************
    425 
    426      @Function              DMA_VALUE_COUNT
    427 
    428      @Description
    429 
    430      This MACRO is used to aid the generation of the ui32Count member of the DMA_sParams
    431      structure required by DMA_SyncAction() and DMA_AsyncAction().  If this is not suitable
    432      for a given application then the programmer is free to fill in the fields in any way they
    433      see fit.
    434 
    435      @Input    BSWAP        : Big/little endian byte swap (see DMA_eBSwap).
    436 
    437      @Input    PW           : The width of the peripheral DMA register (see DMA_ePW).
    438 
    439      @Input    DIR          : The direction of the transfer (see DMA_eDir).
    440 
    441      @Input    PERIPH_INCR      : How much to increment the peripheral address by (see DMA_ePeriphIncr).
    442 
    443      @Input    COUNT            : The length of the transfer in transfer units.
    444 
    445      @Return   img_uint32   : The value of the generated word.
    446 
    447     ******************************************************************************/
    448 #define DMA_VALUE_COUNT(BSWAP,PW,DIR,PERIPH_INCR,COUNT)                                                 \
    449                                                                                                                                                                     \
    450     (((BSWAP)           & DMAC_DMAC_COUNT_BSWAP_LSBMASK)        << DMAC_DMAC_COUNT_BSWAP_SHIFT) |   \
    451         (((PW)                  & DMAC_DMAC_COUNT_PW_LSBMASK)           << DMAC_DMAC_COUNT_PW_SHIFT)    |   \
    452         (((DIR)                 & DMAC_DMAC_COUNT_DIR_LSBMASK)          << DMAC_DMAC_COUNT_DIR_SHIFT)   |   \
    453         (((PERIPH_INCR) & DMAC_DMAC_COUNT_PI_LSBMASK)           << DMAC_DMAC_COUNT_PI_SHIFT)    |   \
    454         (((COUNT)               & DMAC_DMAC_COUNT_CNT_LSBMASK)          << DMAC_DMAC_COUNT_CNT_SHIFT)
    455 
    456     /*!
    457     ******************************************************************************
    458      This type defines the access delay settings.
    459     ******************************************************************************/
    460     typedef enum {
    461         DMA_ACC_DEL_0       = 0x0,              //!< Access delay zero clock cycles
    462         DMA_ACC_DEL_256     = 0x1,      //!< Access delay 256 clock cycles
    463         DMA_ACC_DEL_512     = 0x2,      //!< Access delay 512 clock cycles
    464         DMA_ACC_DEL_768     = 0x3,      //!< Access delay 768 clock cycles
    465         DMA_ACC_DEL_1024    = 0x4,      //!< Access delay 1024 clock cycles
    466         DMA_ACC_DEL_1280    = 0x5,      //!< Access delay 1280 clock cycles
    467         DMA_ACC_DEL_1536    = 0x6,      //!< Access delay 1536 clock cycles
    468         DMA_ACC_DEL_1792    = 0x7,      //!< Access delay 1792 clock cycles
    469 
    470     } DMA_eAccDel;
    471 
    472     /*!
    473     ******************************************************************************
    474      This type defines whether the peripheral address is static or auto-incremented.
    475     ******************************************************************************/
    476     typedef enum {
    477         DMA_INCR_OFF            = 0,            //!< Static peripheral address.
    478         DMA_INCR_ON                 = 1                 //!< Incrementing peripheral address.
    479 
    480     } DMA_eIncr;
    481 
    482     /*!
    483     ******************************************************************************
    484      This type defines the burst size setting.
    485     ******************************************************************************/
    486     typedef enum {
    487         DMA_BURST_0             = 0x0,          //!< burst size of 0
    488         DMA_BURST_1     = 0x1,      //!< burst size of 1
    489         DMA_BURST_2     = 0x2,      //!< burst size of 2
    490         DMA_BURST_3     = 0x3,      //!< burst size of 3
    491         DMA_BURST_4     = 0x4,      //!< burst size of 4
    492         DMA_BURST_5     = 0x5,      //!< burst size of 5
    493         DMA_BURST_6     = 0x6,      //!< burst size of 6
    494         DMA_BURST_7     = 0x7,      //!< burst size of 7
    495 
    496     } DMA_eBurst;
    497 
    498     /*!
    499     ******************************************************************************
    500 
    501     @Function              DMA_VALUE_PERIPH_PARAM
    502 
    503     @Description
    504 
    505     This MACRO is used to aid the generation of the ui32PeripheralParam member of the
    506     DMA_sParams structure required by DMA_SyncAction() and DMA_AsyncAction().  If this is
    507     not suitable for a given application then the programmer is free to fill in the fields in
    508     any way they see fit.
    509 
    510     @Input      ACC_DEL:        The access delay (see DMA_eAccDel).
    511 
    512     @Input      INCR:           Whether the peripheral address is incremented (see DMA_eIncr).
    513 
    514     @Input      BURST:          The burst size.  This should correspond to the amount of data that the
    515                                         peripheral will either be able to supply or accept from its FIFO (see DMA_eBurst).
    516 
    517     @Return     img_uint32: The value of the generated word.
    518 
    519     ******************************************************************************/
    520 #define DMA_VALUE_PERIPH_PARAM(ACC_DEL,INCR,BURST)                                                                  \
    521                                                                                                                                                                     \
    522         (((ACC_DEL)     & DMAC_DMAC_PERIPH_ACC_DEL_LSBMASK)     << DMAC_DMAC_PERIPH_ACC_DEL_SHIFT)      |   \
    523         (((INCR)        & DMAC_DMAC_PERIPH_INCR_LSBMASK)        << DMAC_DMAC_PERIPH_INCR_SHIFT)         |   \
    524         (((BURST)       & DMAC_DMAC_PERIPH_BURST_LSBMASK)       << DMAC_DMAC_PERIPH_BURST_SHIFT)
    525 
    526 
    527 
    528     /*!
    529     ******************************************************************************
    530      Used to describe the location of the linked list structure
    531     ******************************************************************************/
    532     typedef enum {
    533         DMA_LIST_IS_IN_MTX_MEM,
    534         DMA_LIST_IS_IN_SYS_MEM,
    535     } DMA_LIST_LOCATION;
    536 
    537     /*!
    538     ******************************************************************************
    539      DMAC linked list structure
    540     ******************************************************************************/
    541     typedef struct {
    542         IMG_UINT32      ui32Word_0;                             //!< Word 0 of the linked list (see DMA_LL_SET_WD0).
    543         IMG_UINT32      ui32Word_1;                             //!< Word 1 of the linked list (see DMA_LL_SET_WD1).
    544         IMG_UINT32      ui32Word_2;                             //!< Word 2 of the linked list (see DMA_LL_SET_WD2).
    545         IMG_UINT32      ui32Word_3;                             //!< Word 3 of the linked list (see DMA_LL_SET_WD3).
    546         IMG_UINT32      ui32Word_4;                             //!< Word 4 of the linked list (see DMA_LL_SET_WD4).
    547         IMG_UINT32      ui32Word_5;                             //!< Word 5 of the linked list (see DMA_LL_SET_WD5).
    548         IMG_UINT32      ui32Word_6;                             //!< Word 6 of the linked list (see DMA_LL_SET_WD6).
    549         IMG_UINT32      ui32Word_7;                             //!< Word 7 of the linked list (see DMA_LL_SET_WD7).
    550 
    551     } DMA_sLinkedList;
    552 
    553     /*!
    554     ******************************************************************************
    555      DMAC Parameter structure
    556     ******************************************************************************/
    557     typedef struct {
    558         IMG_UINT32                      ui32PerHold;                    //!< peripheral hold register (see PER_HOLD register in TRM)
    559         DMA_LIST_LOCATION       eListLocation;                  //!< is the linked list in mtx memory or system memory
    560         DMA_sLinkedList *       psDmaLinkedList;                //!< pointer to first element in the linked list
    561         IMG_UINT32                      ui32Ext_sa;
    562     } DMA_sParams;
    563 
    564     /*!
    565     ******************************************************************************
    566 
    567      @Function              DMA_Initialise
    568 
    569      @Description
    570 
    571      This function initialises the DMAC. Only has effect on the first call, second
    572      and subsequent calls are ignored.
    573 
    574      @Input             eChannel        : The channel to initialise.
    575 
    576      @Return    None.
    577 
    578     ******************************************************************************/
    579     extern IMG_VOID DMA_Initialise(DMA_eChannelId eChannel);
    580 
    581     /*!
    582     ******************************************************************************
    583 
    584      @Function              DMA_Reset
    585 
    586      @Description
    587 
    588      This function resets the DMAC, cancels any pending DMAC operation and
    589      return the DMAC to the idle state - #DMA_STATUS_IDLE.
    590 
    591      @Input             eChannel        : The channel to reset.
    592 
    593      @Return    None.
    594 
    595     ******************************************************************************/
    596     extern IMG_VOID DMA_Reset(DMA_eChannelId eChannel);
    597 
    598     /*!
    599     ******************************************************************************
    600 
    601      @Function              DMA_SyncAction
    602 
    603      @Description
    604 
    605      This function is used to initiate a synchronous (blocking) DMAC tranfer.
    606 
    607      An internal callback function is registered using DMA_RegisterStatusCallback()
    608      to detect and act upon status transitions.
    609 
    610      The DMAC driver also uses the SEMA API, SEMA_ID_B to block whilst waiting
    611      for the DMAC transfer to complete.  The callback function will set the
    612      semaphore when the
    613 
    614      NOTE: The DMAC must be in the idle state - #DMA_STATUS_IDLE - when the
    615      transfer is initiated.
    616 
    617      @Input             eChannel        : The channel to use.
    618 
    619      @Input             psParams        : A pointer to a #DMA_sParams structure set with the
    620                                                   required DMAC setup.
    621 
    622      @Input             bMtx            : If true then the peripheral address specifies an
    623                                                   offset in MTX memory
    624 
    625      @Return    DMA_eStatus : The completion status - #DMA_STATUS_COMPLETE or
    626                                                    #DMA_STATUS_TIMEOUT.
    627 
    628     ******************************************************************************/
    629     extern DMA_eStatus DMA_SyncAction(
    630         DMA_eChannelId                  eChannel,
    631         DMA_sParams *                   psParams,
    632         IMG_BOOL                                bMtx
    633     );
    634 
    635     /*!
    636     ******************************************************************************
    637 
    638      @Function              DMA_AsyncAction
    639 
    640      @Description
    641 
    642      This function is used to initiate an asynchronous (non-blocking) DMAC tranfer.
    643 
    644      NOTE: The DMAC must be in the idle state - #DMA_STATUS_IDLE - when the
    645      transfer is initiated.
    646 
    647      @Input             eChannel                        : The channel to use.
    648 
    649      @Input             psDmacLinkedList        : A pointer to a #DMA_sLinkedList structure set with the
    650                                                                   required DMAC setup.
    651 
    652      @Input             bPeriphIsMtx            : If true then the peripheral address specifies an
    653                                                                   offset in MTX memory.
    654 
    655      NOTE: If eListLocation is DMA_LIST_IS_IN_SYS_MEM and bPeriphIsMtx is IMG_TRUE the linked list can only contain a single entry.
    656 
    657      NOTE: If eListLocation is DMA_LIST_IS_IN_MTX_MEM then bPeriphIsMtx applies to all entries in the linked list (i.e.
    658            they all use the mtx as the peripheral, or none of them use the mtx as the peripheral).
    659 
    660      @Return    None.
    661 
    662     ******************************************************************************/
    663     extern IMG_VOID DMA_AsyncAction(
    664         DMA_eChannelId                  eChannel,
    665         DMA_sParams *                   psParams,
    666         IMG_BOOL                                bPeriphIsMtx
    667     );
    668 
    669     /*!
    670     ******************************************************************************
    671 
    672      @Function              DMA_WaitForTransfer
    673 
    674      @Description
    675 
    676      This function waits for the current transfer to complete or timeout.
    677 
    678      @Input             eChannel :      The channel to wait use.
    679 
    680      @Return DMA_eStatus :      DMA_STATUS_COMPLETE when transfer has completed or DMA_STATUS_IDLE
    681                                                 if there wasn't an active transfer in progress to wait for.
    682 
    683     ******************************************************************************/
    684     extern DMA_eStatus DMA_WaitForTransfer(DMA_eChannelId eChannel);
    685 
    686     /*!
    687     ******************************************************************************
    688 
    689      @Function              DMA_GetStatus
    690 
    691      @Description
    692 
    693      This function returns the status of the DMAC.
    694 
    695      @Input             eChannel                : The channel to get the status of.
    696 
    697      @Return    DMA_eStatus     : The status of the DMAC.
    698 
    699     ******************************************************************************/
    700     extern DMA_eStatus DMA_GetStatus(DMA_eChannelId eChannel);
    701 
    702     /*!
    703     ******************************************************************************
    704 
    705      @Function              DMA_pfnStatusCallback
    706 
    707      @Description
    708 
    709      This is the prototype for a status callback functions.
    710 
    711      @Input             eChannel                : The channel that the status change is being reported on.
    712 
    713      @Input             DMA_eStatus     : The "new" state of the DMAC.
    714 
    715      @Return    None.
    716 
    717     ******************************************************************************/
    718     typedef IMG_VOID(*DMA_pfnStatusCallback)(
    719         DMA_eChannelId                          eChannel,
    720         DMA_eStatus                             eStatus
    721     );
    722 
    723 
    724     /*!
    725     ******************************************************************************
    726 
    727      @Function              DMA_RegisterStatusCallback
    728 
    729      @Description
    730 
    731      This function is used to register a status callback function.  The caller
    732      provides the address of a function that will be called when a change in the
    733      status occurs - see #DMA_eStatus.
    734 
    735      NOTE: This can happen asynchronously (at interrupt level) on a
    736      #DMA_STATUS_COMPLETE or #DMA_STATUS_TIMEOUT - or synchronously when
    737      DMA_Action() is called and the state changes to #DMA_STATUS_BUSY or
    738      when DMA_GetStatus() or DMA_Reset() are called and the state returns to
    739      #DMA_STATUS_IDLE.
    740 
    741      NOTE: Only one callback function can be registered with the API.  The
    742      callback function is persistent and is not removed by subsequent calls
    743      to DMA_Initialise() or DMA_Reset().
    744 
    745      NOTE: The function asserts if a callback function has already been set.
    746 
    747      @Input             eChannel                        : The channel that the status change is being reported on.
    748 
    749      @Input             pfnStatusCallback       : A pointer to a status callback function.
    750 
    751      @Return    None.
    752 
    753     ******************************************************************************/
    754     extern IMG_VOID DMA_RegisterStatusCallback(
    755         DMA_eChannelId                          eChannel,
    756         DMA_pfnStatusCallback           pfnStatusCallback
    757     );
    758 
    759 
    760 #if (__cplusplus)
    761 }
    762 #endif
    763 
    764 #endif /* __DMA_API_H__    */
    765