⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma_inth.c

📁 MMI层OBJ不能完全编译
💻 C
📖 第 1 页 / 共 2 页
字号:
/*/ * @file dma_inth.c
 *
 * DMA initialise and handle interrupt functions.
 *
 * @author   ()
 * @version 0.1
 */

/*
 * History:
 *
 *  Date        Author          Modification
 *  -------------------------------------------------------------------
 *  6/17/2003  ()   Create.
 *
 * (C) Copyright 2003 by Texas Instruments Incorporated, All Rights Reserved
 */

#ifndef _DMA_INTH_H_
#include "dma/board/dma_inth.h"
#endif


#include "rv/rv_defined_swe.h"

#if (L1_EXT_AUDIO_MGT == 1)
  #include "dma/sys_dma.h"
#endif

#undef    DMA_DEBUG

UINT8 dma_channel_number;
UINT16 dma_it_status;

extern T_DMA_CHANNEL_ARRAY dma_channel_array [DMA_MAX_NUMBER_OF_CHANNEL]; 
extern UINT8 dma_function_status [DMA_MAX_NUMBER_OF_CHANNEL];

#ifdef RVM_CAMD_SWE
#if CHIPSET != 15
	extern void camd_stop_sensor_clock (void);
#else
	extern void camcore_disable(void);
#endif
#endif

extern UINT8 dma_channel_number_tab[DMA_MAX_NUMBER_OF_CHANNEL];
extern UINT8 dma_it_status_tab[DMA_MAX_NUMBER_OF_CHANNEL];
extern UINT8 total_active_dma_channels;
/*-----------------------------------------------------------------------*/
/* dma_hisr()                                                            */
/*                                                                       */
/* This function is called when an DMA interrupt is received.            */
/*-----------------------------------------------------------------------*/

void dma_hisr (void)
{
  /* used to determine the status of the interrupt */
  UINT16 dma_channel_status = DMA_OK;
  
  /* used to send the status back to the originator */
  UINT8 dma_interrupt_status;       

  UINT8 n,dma_channel_index;

  T_DMA_TYPE_CHANNEL_PARAMETER dma_ll_channel_info ;

#ifdef DMA_DEBUG
  DMA_HISR_SEND_TRACE ("DMA HISR called", DMA_TRACE_LEVEL); 
#endif

  for(dma_channel_index=0;dma_channel_index<total_active_dma_channels;dma_channel_index++)
  {
  dma_channel_number = dma_channel_number_tab[dma_channel_index];
  /* Get the reason of the interrupt */
  dma_channel_status = dma_it_status_tab[dma_channel_index];

  if (dma_channel_number == DMA_MAX_NUMBER_OF_CHANNEL)
  {
    /* This is an impossible situation. Return immediatly */

		continue;
	/* UnMask interrupts */
  }


  /* Check if notification is required, otherwise 
     skip this part. Determine the reason now  */
  
  if (dma_channel_array[dma_channel_number].dma_end_notification_bool 
                     == DMA_NOTIFICATION)
  {

    /* Find out the reason */
    if ((dma_channel_status & DMA_CICR_TOUT_IE_MASK) == 
                              DMA_CICR_TOUT_IE_MASK)
    {
      if ((dma_channel_status & DMA_CICR_TOUT_SRC_NDEST_IE_MASK) == 
                                DMA_CICR_TOUT_SRC_NDEST_IE_MASK)
      {
        dma_interrupt_status = DMA_TIMEOUT_SOURCE;
      }
      else
      {
        dma_interrupt_status = DMA_TIMEOUT_DESTINATION;
      }
    }
    else
    {
      if ((dma_channel_status & DMA_CICR_DROP_IE_MASK) == 
                                DMA_CICR_DROP_IE_MASK)
      {
        dma_interrupt_status = DMA_MISS_EVENT;
      }
      else
      {
        if ((dma_channel_status & DMA_CICR_HALF_BLOCK_IE_MASK) == 
                                  DMA_CICR_HALF_BLOCK_IE_MASK)
        {
#ifdef DMA_DEBUG
          DMA_HISR_SEND_TRACE ("DMA HISR half block interupt received", DMA_TRACE_LEVEL); 
#endif
          if (dma_channel_array[dma_channel_number].
              double_buf_mode != DMA_NO_DOUBLE_BUF)
          {
            /* if the camera is working then the clock must be stopped as */
            /* soon as possible. it is restarted after copying the momory */
#if CHIPSET != 15
						if (dma_channel_array[dma_channel_number].channel_info.
                d_dma_channel_hw_synch == DMA_SYNC_DEVICE_NAND_FLASH)
            {
#ifdef RVM_CAMD_SWE
              extern void camd_stop_sensor_clock (void);
              /* Stop the camera sensor */
              camd_stop_sensor_clock ();
#endif
            }
#else
#ifdef RVM_CAMD_SWE
						if (dma_channel_array[dma_channel_number].channel_info.
                d_dma_channel_hw_synch == DMA_SYNC_DEVICE_CAM_THRESHOLD)
            {
              /* Stop the camera sensor */
              /*camd_stop_sensor_clock ();*/
							camcore_disable();
            }
#endif
#endif

            /* Decrease the amount of bytes to be transferred */
            dma_channel_array[dma_channel_number].bytes_to_be_transferred -=
                 dma_channel_array[dma_channel_number].buffer_size;

            dma_interrupt_status = DMA_BUF1_READY;
          }
          else
          {
			continue;
          }
        }
        else
        if ((dma_channel_status & DMA_CICR_BLOCK_IE_MASK) == 
                                  DMA_CICR_BLOCK_IE_MASK)
        {
          dma_interrupt_status = DMA_COMPLETED;
		   

          /* if the camera is working then the clock must be stopped as */
          /* soon as possible. it is restarted after copying the momory */

#if CHIPSET != 15
						if (dma_channel_array[dma_channel_number].channel_info.
                d_dma_channel_hw_synch == DMA_SYNC_DEVICE_NAND_FLASH)
            {
#ifdef RVM_CAMD_SWE
              extern void camd_stop_sensor_clock (void);
              /* Stop the camera sensor */
              camd_stop_sensor_clock ();
#endif
            }
#else
#ifdef RVM_CAMD_SWE
		if (dma_channel_array[dma_channel_number].channel_info.
                d_dma_channel_hw_synch == DMA_SYNC_DEVICE_CAM_THRESHOLD)
            {
              /* Stop the camera sensor */
              /*camd_stop_sensor_clock ();*/
							camcore_disable();
            }
#endif
#endif

          if (dma_channel_array[dma_channel_number].double_buf_mode != 
              DMA_NO_DOUBLE_BUF)
          {
            /* Check if for this channel double buffering is needed */
            if ((dma_channel_array[dma_channel_number].double_buf_mode == 
                            DMA_DEST_XRAM) || 
                (dma_channel_array[dma_channel_number].double_buf_mode == 
                            DMA_DEST_DOUBLE_BUF))
            {
              /* Change the offset in the source buffer if post incremental address mode is used */
              if (dma_channel_array[dma_channel_number].channel_info.
                  d_dma_dst_channel_addr_mode == DMA_ADDR_MODE_POST_INC) 
              {
                if (dma_channel_array[dma_channel_number].int_or_ext == DMA_INTERNAL)
                {
                  /* add offset to the destination adress */
                  dma_channel_array[dma_channel_number].channel_info.d_dma_channel_src_address+=
                    dma_channel_array[dma_channel_number].buffer_size;
                }
              }
            }
            else
            {
              if ((dma_channel_array[dma_channel_number].double_buf_mode == DMA_SOURCE_DOUBLE_BUF) ||
                  (dma_channel_array[dma_channel_number].double_buf_mode == DMA_SOURCE_XRAM ))
              {
                /* Change the offset in the destination buffer if post incremental address mode is used */
                if (dma_channel_array[dma_channel_number].channel_info.
                    d_dma_dst_channel_addr_mode == DMA_ADDR_MODE_POST_INC) 
                {
                  if (dma_channel_array[dma_channel_number].int_or_ext == DMA_EXTERNAL)
                  {
                    /* add offset to the destination adress */
                    dma_channel_array[dma_channel_number].channel_info.d_dma_channel_dst_address+=
                      dma_channel_array[dma_channel_number].buffer_size;
                  }
                }
              }
            }

            /* Decrease the amount of bytes to be transferred */
            dma_channel_array[dma_channel_number].bytes_to_be_transferred -=
                 dma_channel_array[dma_channel_number].buffer_size;

            /*if (dma_channel_array[dma_channel_number].bytes_to_be_transferred>=0)*/
            /*{*/
              if (dma_channel_array[dma_channel_number].bytes_to_be_transferred<
                  dma_channel_array[dma_channel_number].buffer_size)
              {
                /* for the last part the frames might be modified */
                /* Write the number of frames to do */
                C_DMA_CFN_REG(dma_channel_number) = 
                   (dma_channel_array[dma_channel_number].bytes_to_be_transferred/
                  ((1<<dma_channel_array[dma_channel_number].channel_info.d_dma_channel_data_type)*
                  dma_channel_array[dma_channel_number].channel_info.d_dma_channel_element_number)); 

                /* make sure that this is the last run */
                dma_channel_array[dma_channel_number].buffer_size = 
                  dma_channel_array[dma_channel_number].bytes_to_be_transferred;
              }
        
                  dma_interrupt_status = DMA_BUF2_READY;
            /*}*/
          }
        }
        else
        {
          /* other status are not catched yet, or 
             an invalid status has been received.
             in either way, nothing is done now 
          */
			continue;

        }
      }
    }

    dma_send_status_message(dma_channel_number, dma_interrupt_status,
                            dma_channel_array[dma_channel_number].return_path);
    
    
    /* if finished, send DMG completed to the client */
    if (dma_channel_array[dma_channel_number].double_buf_mode != DMA_NO_DOUBLE_BUF)
    {
      if ((dma_interrupt_status == DMA_BUF1_READY) ||
          (dma_interrupt_status == DMA_BUF2_READY))
      {
        if (dma_channel_array[dma_channel_number].bytes_to_be_transferred==0)
        {
          dma_send_status_message(dma_channel_number, DMA_COMPLETED ,
                   dma_channel_array[dma_channel_number].return_path);
          f_dma_channel_auto_init_disable(dma_channel_number);
        }
        else
        {
          /* restart if auto init is off and we are not finished yet */
          if (dma_channel_array[dma_channel_number].channel_info.d_dma_channel_auto_init==DMA_SINGLE)
          {
            dma_channel_array[dma_channel_number].dma_restart = TRUE;
          }
        }
      }      
    }
  }

  }

  total_active_dma_channels=0;
    /* Unmask interrupts */
  F_INTH_ENABLE_ONE_IT(C_INTH_DMA_IT);

}



/*-----------------------------------------------------------------------*/
/* dma_secure_hisr()                                                     */
/*                                                                       */
/* This function is called when an secure DMA interrupt is received.     */
/*-----------------------------------------------------------------------*/
void dma_secure_hisr (void)
{
  /* used to determine the status of the interrupt */
  UINT16 dma_channel_status = DMA_OK; 
  
  /* used to send the status back to the originator */
  UINT16 dma_channel_number = DMA_OK;

  UINT16 dma_interrupt_status;
  UINT8 n;

  T_DMA_TYPE_CHANNEL_PARAMETER dma_ll_channel_info ;

#ifdef DMA_DEBUG
  DMA_HISR_SEND_TRACE ("DMA HISR called", DMA_TRACE_LEVEL); 
#endif

  /* Get the channel which generated an interrupt */
  dma_channel_number = DMA_ISR_REG;

  /* In case the ISR has no bits set, return immediately */
  if (dma_channel_number == 0)
  {
    /* UnMask interrupts */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -