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

📄 sdma.c

📁 OMAP1030 处理器的ARM 侧硬件测试代码 OMAP1030 是TI的双核处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
  LCD_DMA_ACC(GDMA_LCD_CSDP) =
     ((DMA_TYPE_16_BITS << DMA_LCD_TYPE_SIZE_B1_POS) |
      (DMA_PACKING      << DMA_LCD_B1_PACK_POS     ) |
      (DMA_BURST_4      << DMA_LCD_B1_BURST_POS    ) |
      (DMA_TYPE_16_BITS << DMA_LCD_TYPE_SIZE_B2_POS) |
      (DMA_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 - 1 + lvFrameSize) % 0x10000;
  LCD_DMA_ACC(GDMA_LCD_BOT_B1_U) = ((UWORD32)inSrcAddr1 - 1 + lvFrameSize) / 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 - 1 + lvFrameSize) % 0x10000;
  LCD_DMA_ACC(GDMA_LCD_BOT_B2_U) = ((UWORD32)inSrcAddr2 - 1 + lvFrameSize) / 0x10000;


  lvEI = (inRotate % 2) ? ((  inCols                           - 1) * (1 << DMA_TYPE_16_BITS)) + 1 : 1;
  lvFI = (inRotate % 2) ? ((((inCols + 1) - (inRows * inCols)) - 1) * (1 << DMA_TYPE_16_BITS)) + 1 : 1;

  /* DMA_LCD_SRC_EI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EI_B1) =
  /* DMA_LCD_SRC_EI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EI_B2) = lvEI;

  /* DMA_LCD_SRC_FI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_B1) =
  /* DMA_LCD_SRC_FI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_B2) = (UWORD32)lvFI % 0x10000;

  /* DMA_LCD_SRC_FI_HI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_HI_B1) =
  /* DMA_LCD_SRC_FI_HI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_HI_B2) = (UWORD32)lvFI / 0x10000;

  /* DMA_LCD_SRC_EN_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EN_B1) =
  /* DMA_LCD_SRC_EN_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EN_B2) = (inRotate % 2) ? inRows : inCols;

  /* DMA_LCD_SRC_FN_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FN_B1) =
  /* DMA_LCD_SRC_FN_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FN_B2) = (inRotate % 2) ? inCols : inRows;

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

  /* DMA_LCD_CCR */
  lvAddMode = DMA_ADD_DOUBINDEX; //(inRotate % 2) ? DMA_ADD_POSTINC : DMA_ADD_DOUBINDEX;
  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   ) |
      (lvAddMode          << DMA_LCD_B1_AMODE_POS  ) |
      (lvAddMode          << DMA_LCD_B2_AMODE_POS));

  return;
}


void SDMA_LcdWindow(void *const inSrcAddr1,
                    void *const inSrcAddr2,
                   unsigned int inSrcRows,
                   unsigned int inSrcCols,
                   unsigned int inDstRows,
                   unsigned int inDstCols,
                            int inRotate)
{
  int lvAddMode;
  int lvEI, lvFI;
  unsigned int lvFrameSize;

  lvFrameSize = inSrcRows * inSrcCols * (1 << DMA_TYPE_16_BITS);

  /* DMA_LCD_CSDP */
  LCD_DMA_ACC(GDMA_LCD_CSDP) =
     ((DMA_TYPE_16_BITS << DMA_LCD_TYPE_SIZE_B1_POS) |
      (DMA_PACKING      << DMA_LCD_B1_PACK_POS     ) |
      (DMA_BURST_4      << DMA_LCD_B1_BURST_POS    ) |
      (DMA_TYPE_16_BITS << DMA_LCD_TYPE_SIZE_B2_POS) |
      (DMA_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-1 + lvFrameSize) % 0x10000;
  LCD_DMA_ACC(GDMA_LCD_BOT_B1_U) = ((UWORD32)inSrcAddr1-1 + lvFrameSize) / 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-1 + lvFrameSize) % 0x10000;
  LCD_DMA_ACC(GDMA_LCD_BOT_B2_U) = ((UWORD32)inSrcAddr2-1 + lvFrameSize) / 0x10000;


  lvEI = (inRotate % 2) ?
     ((  inSrcCols                                 - 1) * (1 << DMA_TYPE_16_BITS)) + 1 :
         1;
  lvFI = (inRotate % 2) ?
     ((((inSrcCols + 1) - (inDstRows * inSrcCols)) - 1) * (1 << DMA_TYPE_16_BITS)) + 1 :
         ((inSrcCols-inDstCols) * (1 << DMA_TYPE_16_BITS)) + 1;

  /* DMA_LCD_SRC_EI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EI_B1) =
  /* DMA_LCD_SRC_EI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EI_B2) = lvEI;

  /* DMA_LCD_SRC_FI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_B1) =
  /* DMA_LCD_SRC_FI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_B2) = (UWORD32)lvFI % 0x10000;

  /* DMA_LCD_SRC_FI_HI_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_HI_B1) =
  /* DMA_LCD_SRC_FI_HI_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FI_HI_B2) = (UWORD32)lvFI / 0x10000;

  /* DMA_LCD_SRC_EN_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EN_B1) =
  /* DMA_LCD_SRC_EN_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_EN_B2) = (inRotate % 2) ? inDstRows : inDstCols;

  /* DMA_LCD_SRC_FN_B1 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FN_B1) =
  /* DMA_LCD_SRC_FN_B2 */
  LCD_DMA_ACC(GDMA_LCD_SRC_FN_B2) = (inRotate % 2) ? inDstCols : inDstRows;

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

  /* DMA_LCD_CCR */
  lvAddMode = DMA_ADD_DOUBINDEX;
  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   ) |
      (lvAddMode          << DMA_LCD_B1_AMODE_POS  ) |
      (lvAddMode          << DMA_LCD_B2_AMODE_POS));

  return;
}


void SDMA_ChannelLink (UWORD16 inChannel,
                      UWORD16 inNext)
{
  DMA_Interrupt[inNext] = 0;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
	   DMA_CLNK_CTRL) =
       ((inNext << DMA_NXTCHID_POS) |
        (TRUE   << DMA_ENABLELNK_POS));

  return;
}


void SDMA_ChannelEnable (UWORD16 inChannel)
{
  DMA_Interrupt[inChannel] = 0;

  DMA_ACC (NO_GLOB_REG,
           inChannel,
           DMA_CCR) |= (1 << DMA_ENABBLE_POS);

  return;
}


void SDMA_ChannelDisable (UWORD16 inChannel)
{
  DMA_ACC (NO_GLOB_REG,
           inChannel,
           DMA_CCR) &= ~(1 << DMA_ENABBLE_POS);

  return;
}


void SDMA_ChannelRepeat (UWORD16 inChannel)
{
  register UWORD16 lvCCR;

  DMA_Interrupt[inChannel] = 0;

  lvCCR = DMA_ACC (NO_GLOB_REG,
                        inChannel,
                        DMA_CCR);

  lvCCR &= ~(1 << DMA_COMPATIBLE_POS);

  lvCCR |= ((1 << DMA_ENABBLE_POS) |
            (1 << DMA_AUTOINIT_POS) |
            (1 << DMA_REPEAT_POS));

  DMA_ACC (NO_GLOB_REG,
           inChannel,
           DMA_CCR) = lvCCR;

  return;
}


void SDMA_ChannelInterrupt (UWORD16 inChannel,
                           UWORD16 inFlag,
                           UWORD16 inMask)
{
  register UWORD16 lvCICR;

  lvCICR = DMA_ACC (NO_GLOB_REG,
                    inChannel,
                    DMA_CICR);

  lvCICR &= ~inMask;

  lvCICR |= (inMask & inFlag);

  DMA_ACC (NO_GLOB_REG,
           inChannel,
           DMA_CICR) = lvCICR;

  return;
}


void SDMA_LcdChannelEnable (void)
{
  DMA_LCD_Interrupt = 0;

  LCD_DMA_ACC(GDMA_LCD_CCR) |=
              (1 << DMA_LCD_ENABLE_POS);

  return;
}


void SDMA_LcdChannelDisable (void)
{
  LCD_DMA_ACC(GDMA_LCD_CCR) &=
             ~(1 << DMA_LCD_ENABLE_POS);

  return;
}


void SDMA_LcdChannelRepeat (void)
{
  DMA_LCD_Interrupt = 0;

  LCD_DMA_ACC(GDMA_LCD_CCR) |=
             ((1 << DMA_LCD_ENABLE_POS) |
              (1 << DMA_LCD_AUTOINIT_POS) |
              (1 << DMA_LCD_REPEAT_POS));

  return;
}


void SDMA_LcdChannelInterrupt (UWORD16 inEnable)
{
  SetGroupBits (LCD_DMA_ACC(GDMA_LCD_CTRL),
                DMA_LCD_FRAMEIE_POS,
		DMA_LCD_FRAMEIE_NUMB,
		inEnable);

  return;
}

/* EOF */

⌨️ 快捷键说明

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