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