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

📄 sdma.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
 *
 *           TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
 *
 *   Property of Texas Instruments
 *   For  Unrestricted  Internal  Use  Only
 *   Unauthorized reproduction and/or distribution is strictly prohibited.
 *   This product is protected under copyright law and trade secret law
 *   as an unpublished work.
 *   Created 2002, (C) Copyright 2002 Texas Instruments.  All rights reserved.
 *
 *              System DMA Controller Access Routines
 *
 *     Author : Brian Forde (S3)
 *
 *  May-14-2003	 Thady Nolan	 Added DMA_OCPT1_PERIF port identifier code
 *
 *  June-05-2003  Madhav Vij     Added DMA_EMIFS_PERIPH port identifier code
 *
 *****************************************************************************/

#include <stdlib.h>

#include "global_types.h"
#include "sdma.h"



volatile int DMA_Interrupt[DMA_NUMBER_OF_CHANNEL_OMAP32];
volatile int DMA_LCD_Interrupt;



void SDMA_Setup (int inWithOrWithoutFree)
{
  SetGroupBits (DMA_ACC (GLOB_REG, 0, DMA_GCR),
                DMA_FREE_POS,
		DMA_FREE_NUMB,
		inWithOrWithoutFree);

  /* Disable OMAP 3.0/3.1 mapping by default */
  SetGroupBits (DMA_ACC (GLOB_REG, 0, DMA_GSCR),
		DMA_OMAP31_MAPPING_POS,
    		DMA_OMAP31_MAPPING_NUMB,
    		TRUE);

  return;
}


void SDMA_ChannelConfig (UWORD16     inChannel,
                        UWORD16     inSrcPort,
                        void *const inSrcAddr,
                        UWORD16     inDstPort,
                        void *const inDstAddr,
                        UWORD8      inTypeSize,
                        UWORD16     inFrameLength,
                        UWORD16     inFrameCount,
                        UWORD8      inChannelType,
                        UWORD8      inSync)
{
  register UWORD32 lvSrcPack,
                   lvDstPack;
  register UWORD32 lvSrcBurst,
                   lvDstBurst;
  register UWORD32 lvSrcAddrMode,
                   lvDstAddrMode;

  switch (inSrcPort)
  {
    case DMA_EMIFF:
    case DMA_EMIFS:
    case DMA_OCPT1:
      lvSrcPack = DMA_PACKING;
      lvSrcBurst = DMA_BURST_8;
      lvSrcAddrMode = DMA_ADD_POSTINC;
      break;

    case DMA_RHEA:
    case DMA_OCPT2:
    case DMA_RHEA_API:
      lvSrcPack = DMA_NO_PACKING;
      lvSrcBurst = DMA_SINGLE_BURST;
      lvSrcAddrMode = DMA_ADD_CONSTANT;
      break;

    case DMA_OCPT1_PERIF:
      lvSrcPack = DMA_PACKING;
      lvSrcBurst = DMA_BURST_8;
      lvSrcAddrMode = DMA_ADD_CONSTANT;
      inSrcPort = DMA_OCPT1;
      break;

    case DMA_EMIFS_PERIPH:
      lvSrcPack = DMA_NO_PACKING;
      lvSrcBurst = DMA_SINGLE_BURST;
      lvSrcAddrMode = DMA_ADD_CONSTANT;
      inSrcPort = DMA_EMIFS;
      break;
  }

  switch (inDstPort)
  {
    case DMA_EMIFF:
    case DMA_EMIFS:
    case DMA_OCPT1:
      lvDstPack = DMA_PACKING;
      lvDstBurst = DMA_BURST_8;
      lvDstAddrMode = DMA_ADD_POSTINC;
      break;

    case DMA_RHEA:
    case DMA_RHEA_API:
    case DMA_OCPT2:
      lvDstPack = DMA_NO_PACKING;
      lvDstBurst = DMA_SINGLE_BURST;
      lvDstAddrMode = DMA_ADD_CONSTANT;
      break;

    case DMA_EMIFS_PERIPH:
       lvDstPack = DMA_NO_PACKING;
       lvDstBurst = DMA_SINGLE_BURST;
       lvDstAddrMode = DMA_ADD_CONSTANT;
       inDstPort = DMA_EMIFS;
       break;
  }



  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CSDP) =
     ((inTypeSize  << DMA_TYPE_SIZE_POS) |
      (inSrcPort   << DMA_SRC_PORT_POS) |
      (inDstPort   << DMA_DEST_PORT_POS) |
      (lvSrcPack   << DMA_SRC_PACK_POS) |
      (lvDstPack   << DMA_DEST_PACK_POS) |
      (lvSrcBurst  << DMA_SRC_BURST_POS) |
      (lvDstBurst  << DMA_DEST_BURST_POS));

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CCR) =
     ((inSync                << DMA_SYNCNUMB_POS) |
     ((inFrameCount ?
       DMA_FRAME_SYNCHRONIZED :
       DMA_ELT_SYNCHRONIZED) << DMA_FS_POS) |
      (DMA_HIGH_PRIORITY     << DMA_PRIORITY_POS) |
      (DMA_AUTOINIT_OFF      << DMA_AUTOINIT_POS) |
      (FALSE                 << DMA_REPEAT_POS) |
      (TRUE                  << DMA_COMPATIBLE_POS) |
      (lvSrcAddrMode         << DMA_SRC_AMODE_POS) |
      (lvDstAddrMode         << DMA_DEST_AMODE_POS));

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CICR) =
     ((ENABLE  << DMA_TOUTIE_POS ) |
      (ENABLE  << DMA_DROPIE_POS ) |
      (DISABLE << DMA_HALFIE_POS ) |
      (DISABLE << DMA_FRAMEIE_POS) |
      (DISABLE << DMA_LASTIE_POS ) |
      (ENABLE  << DMA_BLOCKIE_POS));


  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CSSA_L) = (UWORD32)inSrcAddr % 0x10000;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CSSA_U) = (UWORD32)inSrcAddr / 0x10000;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CDSA_L) = (UWORD32)inDstAddr % 0x10000;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CDSA_U) = (UWORD32)inDstAddr / 0x10000;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
           DMA_CEN) = inFrameLength;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CFN) = inFrameCount;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
           DMA_CCR2) =
       ((FALSE << DMA_CFE_POS) |
        (FALSE << DMA_TCE_POS) |
        (FALSE << DMA_BSE_POS));

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_LCH_CTRL) =
       ((inChannelType << DMA_LCHTYPE_POS) |
        (FALSE         << DMA_LCHINTDIS_POS));

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CLNK_CTRL) =
        (FALSE << DMA_ENABLELNK_POS);

  return;
}


void SSDMA_SetupLCDChannel (void *const inSrcAddr1,
                          void *const inSrcAddr2,
			  UWORD32     inFrameSize)
{
  /* DMA_LCD_CSDP */
  LCD_DMA_ACC(GDMA_LCD_CSDP) =
     ((DMA_TYPE_32_BITS << DMA_LCD_TYPE_SIZE_B1_POS) |
      (DMA_NO_PACKING   << DMA_LCD_B1_PACK_POS     ) |
      (DMA_BURST_4      << DMA_LCD_B1_BURST_POS    ) |
      (DMA_TYPE_32_BITS << DMA_LCD_TYPE_SIZE_B2_POS) |
      (DMA_NO_PACKING   << DMA_LCD_B2_PACK_POS     ) |
      (DMA_BURST_4      << DMA_LCD_B2_BURST_POS));

  /* DMA_LCD_CTRL */
  LCD_DMA_ACC(GDMA_LCD_CTRL) =
     (((inSrcAddr2 != NULL)       << DMA_LCD_FRAMEMODE_POS) |
      (FALSE                      << DMA_LCD_FRAMEIE_POS  ) |
      (TRUE                       << DMA_LCD_BUSERROR_POS ) |
      (DMA_LCD_EMIFF_SRC          << DMA_LCD_SRC_POS      ) |
      (DMA_LCD_EXT_DEST           << DMA_LCD_DEST_POS));

  /* DMA_LCD_TOP_B1 */
  LCD_DMA_ACC(GDMA_LCD_TOP_B1_L) = (UWORD32)inSrcAddr1 % 0x10000;
  LCD_DMA_ACC(GDMA_LCD_TOP_B1_U) = (UWORD32)inSrcAddr1 / 0x10000;

  /* DMA_LCD_BOT_B1 */
  LCD_DMA_ACC(GDMA_LCD_BOT_B1_L) = ((UWORD32)inSrcAddr1 % 0x10000)-1 + inFrameSize;
  LCD_DMA_ACC(GDMA_LCD_BOT_B1_U) =  (UWORD32)inSrcAddr1 / 0x10000;

  /* DMA_LCD_TOP_B2 */
  LCD_DMA_ACC(GDMA_LCD_TOP_B2_L) = (UWORD32)inSrcAddr2 % 0x10000;
  LCD_DMA_ACC(GDMA_LCD_TOP_B2_U) = (UWORD32)inSrcAddr2 / 0x10000;

  /* DMA_LCD_BOT_B2 */
  LCD_DMA_ACC(GDMA_LCD_BOT_B2_L) = ((UWORD32)inSrcAddr2 % 0x10000)-1 + inFrameSize;
  LCD_DMA_ACC(GDMA_LCD_BOT_B2_U) =  (UWORD32)inSrcAddr2 / 0x10000;

  /* DMA_LCD_SRC_EI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EI_B1) = 0;

  /* DMA_LCD_SRC_EI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EI_B2) = 0;

  /* DMA_LCD_SRC_FI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_B1) = 0;

  /* DMA_LCD_SRC_FI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_B2) = 0;

  /* DMA_LCD_SRC_FI_HI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_HI_B1) = 0;

  /* DMA_LCD_SRC_FI_HI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_HI_B2) = 0;

  /* DMA_LCD_SRC_EN_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EN_B1) = inFrameSize/sizeof(UWORD32);

  /* DMA_LCD_SRC_EN_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EN_B2) = inFrameSize/sizeof(UWORD32);

  /* DMA_LCD_SRC_FN_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FN_B1) = 1;

  /* DMA_LCD_SRC_FN_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FN_B2) = 1;

  /* DMA_LCH_CTRL */
  LCD_DMA_ACC(GDMA_LCD_LCH_CTRL) = DMA_LCH_TYP_D;

  /* DMA_LCD_CCR */
  LCD_DMA_ACC(GDMA_LCD_CCR) =
     ((FALSE              << DMA_LCD_BLOCKSYNC_POS ) |
      (DMA_HIGH_PRIORITY  << DMA_LCD_PRIORITY_POS  ) |
//    (TRUE               << DMA_LCD_ENABLE_POS    ) |
      (DMA_AUTOINIT_OFF   << DMA_LCD_AUTOINIT_POS  ) |
      (DMA_REPEAT_OFF     << DMA_LCD_REPEAT_POS    ) |
      (DMA_COMPATIBLE_DIS << DMA_LCD_COMPATIBLE_POS) |
      (DMA_ENDPROG_OFF    << DMA_LCD_ENDPROG_POS   ) |
      (DMA_ADD_POSTINC    << DMA_LCD_B1_AMODE_POS  ) |
      (DMA_ADD_POSTINC    << DMA_LCD_B2_AMODE_POS));

  return;
}


void SDMA_LcdDblIndex(void *const inSrcAddr1,
                      void *const inSrcAddr2,
                     unsigned int inRows,
                     unsigned int inCols,
                              int inRotate)
{
  int lvAddMode;
  int lvEI, lvFI;
  unsigned int lvFrameSize;

  lvFrameSize = inRows * inCols * (1 << DMA_TYPE_16_BITS);

  /* DMA_LCD_CSDP */

⌨️ 快捷键说明

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