📄 sdma.c
字号:
/*****************************************************************************
*
* 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 + -