view src/cs/drivers/drv_core/dma/sys_dma.h @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/*                @(#) nom : sys_dma.h SID: 1.2 date : 05/23/03               */
/* Filename:      sys_dma.h                                                   */
/* Version:       1.2                                                         */
/******************************************************************************
 *                   WIRELESS COMMUNICATION SYSTEM DEVELOPMENT
 *
 *             (C) 2002 Texas Instruments France. All rights reserved
 *
 *                          Author : Guillaume Leterrier
 *                                   Francois Amand
 *
 *
 *  Important Note
 *  --------------
 *
 *  This S/W is a preliminary version. It contains information on a product 
 *  under development and is issued for evaluation purposes only. Features 
 *  characteristics, data and other information are subject to change.
 *
 *  The S/W is furnished under Non Disclosure Agreement and may be used or
 *  copied only in accordance with the terms of the agreement. It is an offence
 *  to copy the software in any way except as specifically set out in the 
 *  agreement. No part of this document may be reproduced or transmitted in any
 *  form or by any means, electronic or mechanical, including photocopying and
 *  recording, for any purpose without the express written permission of Texas
 *  Instruments Inc.
 *
 ******************************************************************************
 *
 *  FILE NAME: sys_dma.h
 *
 *
 *  PURPOSE:  Include file to use the DMA drivers for CALYPSO PLUS.
 *            The drivers allows DMA module configuration and control.
 *
 *
 *  FILE REFERENCES:
 *
 *  Name                  IO      Description
 *  -------------         --      ---------------------------------------------
 *  
 *
 *
 *  EXTERNAL VARIABLES:
 *
 *  Source:
 *
 *  Name                  Type              IO   Description
 *  -------------         ---------------   --   ------------------------------
 *
 *
 *
 *  EXTERNAL REFERENCES:
 *
 *  Name                Description
 *  ------------------  -------------------------------------------------------
 *
 *
 *
 *  ABNORMAL TERMINATION CONDITIONS, ERROR AND WARNING MESSAGES:
 *  
 *
 *
 *  ASSUMPTION, CONSTRAINTS, RESTRICTIONS:
 *  
 *
 *
 *  NOTES:
 *  
 *
 *
 *  REQUIREMENTS/FUNCTIONAL SPECIFICATION REFERENCES:
 *
 *
 *
 *
 *  DEVELOPMENT HISTORY:
 *
 *  Date         Name(s)         Version  Description
 *  -----------  --------------  -------  -------------------------------------
 *  23-Oct-2002  Francois AMAND  0.0.1    First implementation
 *  23-Oct-2002  G.Leterrier     0.0.2    Type, prototype definition
 *   6-Dec-2002  G.Leterrier     0.0.3    remove base address
 *  24-Feb-2003  G.Leterrier     0.0.4    change base address include name
 *  ALGORITHM: 
 *  ALGORITHM: 
 *
 *
 *****************************************************************************/


#ifndef __SYS_DMA_H__
  #define __SYS_DMA_H__

  #include "l1sw.cfg"
  #include "chipset.cfg" 

  #if (CHIPSET == 12)

    #if (OP_L1_STANDALONE == 0)
      #include "main/sys_types.h"
    #else
      #include "sys_types.h"
    #endif

    #include "sys_map.h"
  
    /****************************************************************************
     *                            CONSTANT DEFINITION
     ***************************************************************************/
 



    #define C_DMA_VERSION_DRIVER                       0x0001

    #define C_DMA_NUMBER_OF_CHANNEL                   6
    
    /*
     *  Registers offset definition
     */

    #define C_DMA_CHANNEL_SELECT_POS                  6

    /* Global registers */
    #define C_DMA_GCR_OFFSET                          0x0400
    #define C_DMA_ISR_OFFSET                          0x0402
    #define C_DMA_CAR_OFFSET                          0x0404
    #define C_DMA_SCR_OFFSET                          0x0406
    #define C_DMA_SRR_OFFSET                          0x0408
    #define C_DMA_AR_OFFSET                           0x040A
    
    /* Channel registers */
    #define C_DMA_CSDP_OFFSET(d_channel_index)        (0x0000 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CCR_OFFSET(d_channel_index)         (0x0002 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CICR_OFFSET(d_channel_index)        (0x0004 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CSR_OFFSET(d_channel_index)         (0x0006 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CSSA_L_OFFSET(d_channel_index)      (0x0008 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CSSA_U_OFFSET(d_channel_index)      (0x000A + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CDSA_L_OFFSET(d_channel_index)      (0x000C + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CDSA_U_OFFSET(d_channel_index)      (0x000E + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CEN_OFFSET(d_channel_index)         (0x0010 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CFN_OFFSET(d_channel_index)         (0x0012 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))
    #define C_DMA_CPC_OFFSET(d_channel_index)         (0x0018 + (d_channel_index << C_DMA_CHANNEL_SELECT_POS))


    /*
     *  Registers address definition
     */
    /* Global registers */
    #define C_DMA_GCR_REG                             * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_GCR_OFFSET)
    #define C_DMA_ISR_REG                             * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_ISR_OFFSET)
    #define C_DMA_CAR_REG                             * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CAR_OFFSET)
    #define C_DMA_SCR_REG                             * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_SCR_OFFSET)
    #define C_DMA_SRR_REG                             * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_SRR_OFFSET)
    #define C_DMA_AR_REG                              * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_AR_OFFSET)

    /* Channel registers */
    #define C_DMA_CSDP_REG(d_channel_index)           * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CSDP_OFFSET(d_channel_index))
    #define C_DMA_CCR_REG(d_channel_index)            * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CCR_OFFSET(d_channel_index))
    #define C_DMA_CICR_REG(d_channel_index)           * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CICR_OFFSET(d_channel_index))
    #define C_DMA_CSR_REG(d_channel_index)            * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CSR_OFFSET(d_channel_index))
    #define C_DMA_CSSA_L_REG(d_channel_index)         * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CSSA_L_OFFSET(d_channel_index))
    #define C_DMA_CSSA_U_REG(d_channel_index)         * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CSSA_U_OFFSET(d_channel_index))
    #define C_DMA_CDSA_L_REG(d_channel_index)         * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CDSA_L_OFFSET(d_channel_index))
    #define C_DMA_CDSA_U_REG(d_channel_index)         * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CDSA_U_OFFSET(d_channel_index))
    #define C_DMA_CEN_REG(d_channel_index)            * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CEN_OFFSET(d_channel_index))
    #define C_DMA_CFN_REG(d_channel_index)            * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CFN_OFFSET(d_channel_index))
    #define C_DMA_CPC_REG(d_channel_index)            * (volatile SYS_UWORD16 *) (C_MAP_DMA_BASE + C_DMA_CPC_OFFSET(d_channel_index))
  
  
  
    /*
     *  DMA_GCR register definition
     */
    /* Bits position in the register */
    #define C_DMA_GCR_FREE_POS                        2
    #define C_DMA_GCR_AUTO_GATE_POS                   3
    
    /* Mask of the field in the register */
    #define C_DMA_GCR_FREE_MASK                       0x0001
    #define C_DMA_GCR_AUTO_GATE_MASK                  0x0001
  
   
   
    /*
     *  DMA_AR register definition
     */
    /* Bits position in the register */
    #define C_DMA_AR_IMIF_PRIO_POS                    0
    #define C_DMA_AR_RHEA_PRIO_POS                    3
    #define C_DMA_AR_API_PRIO_POS                     4
    
    /* Mask of the field in the register */
    #define C_DMA_AR_IMIF_PRIO_MASK                   0x0007
    #define C_DMA_AR_RHEA_PRIO_MASK                   0x0001
    #define C_DMA_AR_API_PRIO_MASK                    0x0001
    

    /*
     *  DMA_CSDP register definition
     */
    /* Bits position in the register */
    #define C_DMA_CSDP_DATA_TYPE_POS                  0
    #define C_DMA_CSDP_SRC_POS                        2
    #define C_DMA_CSDP_SRC_PACK_POS                   6
    #define C_DMA_CSDP_SRC_BURST_EN_POS               7
    #define C_DMA_CSDP_DST_POS                        9
    #define C_DMA_CSDP_DST_PACK_POS                   13
    #define C_DMA_CSDP_DST_BURST_EN_POS               14
    
    /* Mask of the field in the register */
    #define C_DMA_CSDP_DATA_TYPE_MASK                 0x0003
    #define C_DMA_CSDP_SRC_MASK                       0x000F
    #define C_DMA_CSDP_SRC_PACK_MASK                  0x0001
    #define C_DMA_CSDP_SRC_BURST_EN_MASK              0x0003
    #define C_DMA_CSDP_DST_MASK                       0x000F
    #define C_DMA_CSDP_DST_PACK_MASK                  0x0001
    #define C_DMA_CSDP_DST_BURST_EN_MASK              0x0003


    /*
     *  DMA_CCR register definition
     */
    /* Bits position in the register */
    #define C_DMA_CCR_SYNC_POS                        0
    #define C_DMA_CCR_PRIO_POS                        6
    #define C_DMA_CCR_EN_POS                          7
    #define C_DMA_CCR_AUTO_INIT_POS                   8
    #define C_DMA_CCR_FIFO_FLUSH_POS                  10
    #define C_DMA_CCR_SRC_AMODE_POS                   12
    #define C_DMA_CCR_DST_AMODE_POS                   14
    
    /* Mask of the field in the register */
    #define C_DMA_CCR_SYNC_MASK                       0x001F
    #define C_DMA_CCR_PRIO_MASK                       0x0001
    #define C_DMA_CCR_EN_MASK                         0x0001
    #define C_DMA_CCR_AUTO_INIT_MASK                  0x0001
    #define C_DMA_CCR_FIFO_FLUSH_MASK                 0x0001
    #define C_DMA_CCR_SRC_AMODE_MASK                  0x0003
    #define C_DMA_CCR_DST_AMODE_MASK                  0x0003


    /*
     *  DMA_CICR register definition
     */
    /* Bits position in the register */
    #define C_DMA_CICR_TOUT_IE_POS                    0
    #define C_DMA_CICR_DROP_IE_POS                    1
    #define C_DMA_CICR_FRAME_IE_POS                   3
    #define C_DMA_CICR_BLOCK_IE_POS                   5
    #define C_DMA_CICR_HALF_BLOCK_IE_POS              6
    
    /* Mask of the field in the register */
    #define C_DMA_CICR_TOUT_IE_MASK                   0x0001
    #define C_DMA_CICR_DROP_IE_MASK                   0x0001
    #define C_DMA_CICR_FRAME_IE_MASK                  0x0001
    #define C_DMA_CICR_BLOCK_IE_MASK                  0x0001
    #define C_DMA_CICR_HALF_BLOCK_IE_MASK             0x0001


    /*
     *  DMA_CSR register definition
     */
    /* Bits position in the register */
    #define C_DMA_CSR_TOUT_POS                        0
    #define C_DMA_CSR_DROP_POS                        1
    #define C_DMA_CSR_FRAME_POS                       3
    #define C_DMA_CSR_BLOCK_POS                       5
    #define C_DMA_CSR_SYNC_POS                        6
    #define C_DMA_CSR_HALF_BLOCK_POS                  7
    #define C_DMA_CSR_TOUT_SRC_NDST_POS                8
    
    /* Mask of the field in the register */
    #define C_DMA_CSR_TOUT_MASK                       0x0001
    #define C_DMA_CSR_DROP_MASK                       0x0001
    #define C_DMA_CSR_FRAME_MASK                      0x0001
    #define C_DMA_CSR_BLOCK_MASK                      0x0001
    #define C_DMA_CSR_SYNC_MASK                       0x0001
    #define C_DMA_CSR_HALF_BLOCK_MASK                 0x0001
    #define C_DMA_CSR_TOUT_SRC_NDST_MASK              0x0001



    /****************************************************************************
     *                            TYPE DEFINITION
     ***************************************************************************/

    /*
    *  Channel number definition
    */
    typedef  SYS_UWORD8  T_DMA_TYPE_CHANNEL_NUMBER;
    #define   C_DMA_CHANNEL_0      0
    #define   C_DMA_CHANNEL_1      1
    #define   C_DMA_CHANNEL_2      2
    #define   C_DMA_CHANNEL_3      3
    #define   C_DMA_CHANNEL_4      4
    #define   C_DMA_CHANNEL_5      5



    #define   C_DMA_CHANNEL_0_MASK              0x01
    #define   C_DMA_CHANNEL_1_MASK              0x02
    #define   C_DMA_CHANNEL_2_MASK              0x04
    #define   C_DMA_CHANNEL_3_MASK              0x08
    #define   C_DMA_CHANNEL_4_MASK              0x10
    #define   C_DMA_CHANNEL_5_MASK              0x20


    /*
    *  Channel secure parameter definition
    */
    /*  channel secured, must be used with crypto module  */

    typedef  SYS_UWORD8  T_DMA_TYPE_CHANNEL_SECURED;
    #define    C_DMA_CHANNEL_NOT_SECURED    0    
    #define    C_DMA_CHANNEL_SECURED        1    

    /*
    *  Channel data type definition
    */

    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_DATA_TYPE;
    #define    C_DMA_DATA_S8      0        /* byte definition */
    #define    C_DMA_DATA_S16     1        /* half word definition */
    #define    C_DMA_DATA_S32      2        /* word definition */



    /*
    *  Port definition
    */


    typedef SYS_UWORD8      T_DMA_TYPE_CHANNEL_PORT;    
    #define    C_DMA_IMIF_PORT      0        /*  IMIF PORT definition */
    #define    C_DMA_RHEA_PORT      1        /*  RHEA PORT definition */
    #define    C_DMA_API_PORT       2        /*  API PORT definition  */



    /*
    *  port packing definition
    */
    /*   port is performing packing to increase bandwidth if possible */

    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_PACKED;
    #define    C_DMA_CHANNEL_NOT_PACKED  0      
    #define    C_DMA_CHANNEL_PACKED      1      


    /*
    *  port transfer busrt/single definition
    */


    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_BURST_EN;
    #define    C_DMA_CHANNEL_SINGLE    0      /*  port transfer Single */
    #define    C_DMA_CHANNEL_BURST4    2      /*  port transfer burst 4 bytes, only IMIF can manage it */
  

    /*
    *  Channel synchronisation definition
    */

    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_HW_SYNCH;
    #define    C_DMA_CHANNEL_NO_SYNCH        0      /*  No Synch means software synchronisation */
    #define    C_DMA_CHANNEL_RIF_TX          1
    #define    C_DMA_CHANNEL_RIF_RX          2
    #define    C_DMA_CHANNEL_LCD              3
    #define    C_DMA_CHANNEL_UART_MODEM1_TX  4
    #define    C_DMA_CHANNEL_UART_MODEM1_RX  5
    #define    C_DMA_CHANNEL_UART_MODEM2_TX  6
    #define    C_DMA_CHANNEL_UART_MODEM2_RX  7
    #define    C_DMA_CHANNEL_UART_IRDA_TX    8
    #define    C_DMA_CHANNEL_UART_IRDA_RX    9 
    #define    C_DMA_CHANNEL_USB_RX1          10
    #define    C_DMA_CHANNEL_USB_TX1          11
    #define    C_DMA_CHANNEL_USB_RX2          12
    #define    C_DMA_CHANNEL_USB_TX2          13
    #define    C_DMA_CHANNEL_USB_RX3          14
    #define    C_DMA_CHANNEL_USB_TX3          15
    #define    C_DMA_CHANNEL_MMC_SD_RX        16
    #define    C_DMA_CHANNEL_MMC_SD_TX        17
    #define    C_DMA_CHANNEL_MS_RX_TX         18
    #define    C_DMA_CHANNEL_USIM_RX          19
    #define    C_DMA_CHANNEL_USIM_TX          20
    #define    C_DMA_CHANNEL_UWIRE_RX_TX      23
    #define    C_DMA_CHANNEL_NAND_FLASH      24
    #define    C_DMA_CHANNEL_I2C_RX          25
    #define    C_DMA_CHANNEL_I2C_TX          26
    #define    C_DMA_CHANNEL_SHA1_TX         27    // channel must be set as secured channel
    #define    C_DMA_CHANNEL_DES_RX          28    // channel must be set as secured channel
    #define    C_DMA_CHANNEL_DES_TX          29    // channel must be set as secured channel
    #define    C_DMA_CHANNEL_CPORT_RX        30
    #define    C_DMA_CHANNEL_CPORT_TX        31


    /*
    *  Channel priority definition
    */

    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_PRIORITY;
    #define    C_DMA_CHANNEL_PRIORITY_LOW     0    /* channel priority low */
    #define    C_DMA_CHANNEL_PRIORITY_HIGH    1    /* channel priority high */


    /*
    *  Channel auto-initialisation definition
    */
    /* channel auto-init on, transfer restart on next HW request */

    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_AUTO_INIT;
    #define   C_DMA_CHANNEL_AUTO_INIT_OFF    0  
    #define   C_DMA_CHANNEL_AUTO_INIT_ON     1    


    /*
    *  Channel fifo-flush control
    */


    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_FIFO_FLUSH;
    #define   C_DMA_CHANNEL_FIFO_FLUSH_OFF     0  /*  nothing happens on fifo  */
    #define   C_DMA_CHANNEL_FIFO_FLUSH_ON      1  /*  fifo is flushed  */

    /*
    *  definition addressng mode of source/destination port
    */

    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_ADDR_MODE;
    #define    C_DMA_CHANNEL_ADDR_MODE_CONSTANT    0  /*  constant address */
    #define    C_DMA_CHANNEL_ADDR_MODE_POST_INC    1  /* post-increment address */
    #define    C_DMA_CHANNEL_ADDR_MODE_FRAME_INDEX    2  /* frame indexed address */


    /*
    *  Channel interrupt event definition
    */


    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_IT_TIME_OUT;
    #define    C_DMA_CHANNEL_IT_TIME_OUT_OFF      0  
    #define    C_DMA_CHANNEL_IT_TIME_OUT_ON       1  /* time out event on a port*/


    /* drop event if new HW request issued, before completion of previous one */
    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_IT_DROP;  
    #define    C_DMA_CHANNEL_IT_DROP_OFF      0    
    #define    C_DMA_CHANNEL_IT_DROP_ON       1  


    /*  frame interrupt event */
    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_IT_FRAME;
    #define    C_DMA_CHANNEL_IT_FRAME_OFF      0      
    #define    C_DMA_CHANNEL_IT_FRAME_ON       1  


    /* end of block transfer event */
    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_IT_BLOCK;
    #define    C_DMA_CHANNEL_IT_BLOCK_OFF      0  
    #define    C_DMA_CHANNEL_IT_BLOCK_ON       1


    /* half of block transfer event */
    typedef SYS_UWORD8  T_DMA_TYPE_CHANNEL_IT_HALF_BLOCK;  
    #define    C_DMA_CHANNEL_IT_HALF_BLOCK_OFF    0
    #define    C_DMA_CHANNEL_IT_HALF_BLOCK_ON     1


    /*
    *  DMA Definition of channel enable/disable
    */  

    typedef  SYS_UWORD8  T_DMA_TYPE_CHANNEL_ENABLE;
    #define    C_DMA_CHANNEL_ENABLE_OFF       0      
    #define    C_DMA_CHANNEL_ENABLE_ON        1    




    /*  
    *  DMA Definition of free mode for emulation
    */

    typedef  SYS_UWORD8  T_DMA_TYPE_FREE;
    #define    C_DMA_FREE_OFF         0      
    #define    C_DMA_FREE_ON          1    

    /* In FREE_ON , on-going transfers are not stopped
    when DMA receives the "suspend" signal from the processor */



    /*
    *  DMA Definition of auto-gating clock
    */

    typedef  SYS_UWORD8  T_DMA_TYPE_AUTO_GATE;
    #define    C_DMA_AUTO_GATE_OFF        0    /*  DMA clock always ON */
    #define    C_DMA_AUTO_GATE_ON         1    /*  DMA cut off clock according to activity */


    /*
    *  priority definition on API port
    */


    typedef  SYS_UWORD8  T_DMA_TYPE_API_PRIO;
    #define   C_DMA_API_PRIO_DMA         0    /* DMA has priority */
    #define    C_DMA_API_PRIO_ARM        1    /* ARM has priority */


    /*
    *  priority definition on RHEA port
    */    


    typedef  SYS_UWORD8  T_DMA_TYPE_RHEA_PRIO;
    #define    C_DMA_RHEA_PRIO_DMA        0    /* DMA has priority */
    #define    C_DMA_RHEA_PRIO_ARM        1    /* ARM has priority */




    /*
    *  priority definition on IMIF port
    */

    /*  defines the number of consecutive cycles that are allocates to the CPU before DMA steals one cycle*/

    typedef  SYS_UWORD8  T_DMA_TYPE_IMIF_PRIO;
    #define    C_DMA_IMIF_PRIO_CPU_0      0    
    #define    C_DMA_IMIF_PRIO_CPU_1      1
    #define    C_DMA_IMIF_PRIO_CPU_2      2
    #define    C_DMA_IMIF_PRIO_CPU_3      3
    #define    C_DMA_IMIF_PRIO_CPU_4      4
    #define    C_DMA_IMIF_PRIO_CPU_5      5
    #define    C_DMA_IMIF_PRIO_CPU_6      6
    #define    C_DMA_IMIF_PRIO_CPU_7      7


    /*
    *  Definition of channel allocation between the DSP and ARM
    */


    typedef  SYS_UWORD8  T_DMA_TYPE_CHANNEL_ALLOCATION;
    #define    C_DMA_CHANNEL_ARM        0      /* channel reserved to ARM */
    #define    C_DMA_CHANNEL_DSP        1      /* channel reserved to DSP */


    /*
    * Type definition of pointer for call back function
    */


    typedef  void (*T_DMA_CALL_BACK) (SYS_UWORD16);

    /****************************************************************************
     *                            MACRO DEFINITION
     ***************************************************************************/
  


    /* enable free mode of dma */
    #define F_DMA_SUSPEND_MODE_EMULATION_FREE_ENABLE    C_DMA_GCR_REG |= (C_DMA_FREE_ON << C_DMA_GCR_FREE_POS )



    /*disable free mode of the dma */
    #define F_DMA_SUSPEND_MODE_EMULATION_FREE_DISABLE   C_DMA_GCR_REG &= ~( C_DMA_GCR_FREE_MASK << C_DMA_GCR_FREE_POS )


    /*enable channel transfer*/
    #define F_DMA_CHANNEL_ENABLE(d_dma_channel_number)  C_DMA_CCR_REG(d_dma_channel_number)  |= (C_DMA_CHANNEL_ENABLE_ON   << C_DMA_CCR_EN_POS )

 
    /*disable channel transfer*/ 
    #define F_DMA_CHANNEL_DISABLE(d_dma_channel_number)  C_DMA_CCR_REG(d_dma_channel_number)  &= ~(C_DMA_CCR_EN_MASK    << C_DMA_CCR_EN_POS )


    /*disable channel auto-initialisation mode*/
    #define F_DMA_CHANNEL_AUTO_INIT_DISABLE(d_dma_channel_number)   C_DMA_CCR_REG(d_dma_channel_number)  &= ~(C_DMA_CCR_AUTO_INIT_MASK    << C_DMA_CCR_AUTO_INIT_POS  )


    /* get channel counter */
    #define F_DMA_GET_CHANNEL_COUNTER(d_dma_channel_number)      C_DMA_CPC_REG(d_dma_channel_number) 


    /* get channel interrupt status, cleared after read. must be saved in a variable if re-use*/
    #define F_DMA_GET_CHANNEL_IT_STATUS(d_dma_channel_number)    C_DMA_CSR_REG(d_dma_channel_number)


    /* compare if interruption status is time_out event on source */
    #define F_DMA_COMPARE_CHANNEL_IT_STATUS_TIME_OUT_SRC(d_dma_status_it)   ((C_DMA_CSR_TOUT_MASK & (d_dma_status_it >>C_DMA_CSR_TOUT_POS)) & (C_DMA_CSR_TOUT_SRC_NDST_MASK & (d_dma_status_it >>C_DMA_CSR_TOUT_SRC_NDST_POS)))


    /* compare if interruption status is time_out event on destination */
    #define F_DMA_COMPARE_CHANNEL_IT_STATUS_TIME_OUT_DST(d_dma_status_it)   ((C_DMA_CSR_TOUT_MASK & (d_dma_status_it >>C_DMA_CSR_TOUT_POS)) & ( C_DMA_CSR_TOUT_SRC_NDST_MASK & ((~d_dma_status_it) >>C_DMA_CSR_TOUT_SRC_NDST_POS)))



    /* compare if interruption status is drop event ( new hw event, before completion of the previous one */
    #define F_DMA_COMPARE_CHANNEL_IT_STATUS_DROP(d_dma_status_it)   (C_DMA_CSR_DROP_MASK & (d_dma_status_it >>C_DMA_CSR_DROP_POS))



    /* compare if interruption status is an end of frame transfer event*/
    #define F_DMA_COMPARE_CHANNEL_IT_STATUS_FRAME(d_dma_status_it)   (C_DMA_CSR_FRAME_MASK & (d_dma_status_it >>C_DMA_CSR_FRAME_POS))



    /* compare if interruption status is an end of block transfer event*/
    #define F_DMA_COMPARE_CHANNEL_IT_STATUS_BLOCK(d_dma_status_it)   (C_DMA_CSR_BLOCK_MASK & (d_dma_status_it >>C_DMA_CSR_BLOCK_POS))



    /* compare if interruption status is an end of half_block transfer event*/
    #define F_DMA_COMPARE_CHANNEL_IT_STATUS_HALF_BLOCK(d_dma_status_it)   (C_DMA_CSR_HALF_BLOCK_MASK & (d_dma_status_it >>C_DMA_CSR_HALF_BLOCK_POS))


    /****************************************************************************
     *                            STRUCTURE DEFINITION
     ***************************************************************************/
  


    /* definition of parameter structure for global configuration */

    typedef struct 
        {
        T_DMA_TYPE_AUTO_GATE    d_dma_global_auto_gate;
        T_DMA_TYPE_API_PRIO     d_dma_global_api_prio;
        T_DMA_TYPE_RHEA_PRIO    d_dma_global_rhea_prio;
        T_DMA_TYPE_IMIF_PRIO    d_dma_global_imif_prio;
        }
        T_DMA_TYPE_GLOBAL_PARAMETER;


    /* definition of parameter structure for channel configuration */


    typedef struct  
       
      {
      T_DMA_CALL_BACK               pf_dma_call_back_address;
      //void (*pf_dma_call_back_address) (SYS_UWORD16);      /* call back function address for interrupt */


      T_DMA_TYPE_CHANNEL_NUMBER       d_dma_channel_number;    /* channel parameter */
      T_DMA_TYPE_CHANNEL_SECURED      d_dma_channel_secured;
      T_DMA_TYPE_CHANNEL_DATA_TYPE    d_dma_channel_data_type;  /* type of element to be transfered */

      T_DMA_TYPE_CHANNEL_PORT        d_dma_channel_src_port;    /* source port parameter */
      T_DMA_TYPE_CHANNEL_PACKED      d_dma_src_channel_packed;
      T_DMA_TYPE_CHANNEL_BURST_EN    d_dma_src_channel_burst_en;

      T_DMA_TYPE_CHANNEL_PORT        d_dma_channel_dst_port;    /* destination port parameter */
      T_DMA_TYPE_CHANNEL_PACKED      d_dma_dst_channel_packed;
      T_DMA_TYPE_CHANNEL_BURST_EN    d_dma_dst_channel_burst_en;

      T_DMA_TYPE_CHANNEL_HW_SYNCH      d_dma_channel_hw_synch;    /* channel parameter */
      T_DMA_TYPE_CHANNEL_PRIORITY      d_dma_channel_priority;
      T_DMA_TYPE_CHANNEL_AUTO_INIT     d_dma_channel_auto_init;
      T_DMA_TYPE_CHANNEL_FIFO_FLUSH    d_dma_channel_fifo_flush;

      T_DMA_TYPE_CHANNEL_ADDR_MODE    d_dma_src_channel_addr_mode;  /* source addressing mode */
      T_DMA_TYPE_CHANNEL_ADDR_MODE    d_dma_dst_channel_addr_mode;  /* destination addressinf mode */

      T_DMA_TYPE_CHANNEL_IT_TIME_OUT   d_dma_channel_it_time_out;    /* channel interrupt setting */
      T_DMA_TYPE_CHANNEL_IT_DROP       d_dma_channel_it_drop;  
      T_DMA_TYPE_CHANNEL_IT_FRAME      d_dma_channel_it_frame;
      T_DMA_TYPE_CHANNEL_IT_BLOCK      d_dma_channel_it_block;  
      T_DMA_TYPE_CHANNEL_IT_HALF_BLOCK d_dma_channel_it_half_block;

      SYS_UWORD32              d_dma_channel_src_address;    /* source address */
      SYS_UWORD32              d_dma_channel_dst_address;    /* destination address */

      SYS_UWORD16              d_dma_channel_element_number;  /* number of element per frame */
      SYS_UWORD16              d_dma_channel_frame_number;    /* number of frame to be transfered */
      }
    T_DMA_TYPE_CHANNEL_PARAMETER;




    /****************************************************************************
     *                            PROTOTYPE DEFINITION
     ***************************************************************************/

    SYS_UWORD16 f_dma_get_version_driver(void);



    void f_dma_global_parameter_set(T_DMA_TYPE_GLOBAL_PARAMETER  *p_dma_global_parameter);



    void f_dma_channel_allocation_set(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number, T_DMA_TYPE_CHANNEL_ALLOCATION d_dma_channel_allocation);



    void f_dma_channel_parameter_set(T_DMA_TYPE_CHANNEL_PARAMETER    *p_dma_channel_parameter);



    void f_dma_channel_enable (T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number);



    void f_dma_channel_disable(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number);



    void f_dma_channel_auto_init_disable(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number);


    SYS_UWORD16  f_dma_get_channel_counter(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number);



    void f_dma_channel_soft_reset(T_DMA_TYPE_CHANNEL_NUMBER d_dma_channel_number);


    void f_dma_default_call_back_it(SYS_UWORD16 d_dma_channel_it_status);


    void f_dma_interrupt_manager();

    void f_dma_secure_interrupt_manager();

  #endif /* (CHIPSET == 12) */

#endif /* __SYS_DMA_H__ */