📄 gdma.c
字号:
// PARAMETERS : None
//
// RETURN VALUE : None
//
//--------------------------------------------------------------------------------
void DMA_ReadGlobalReg(GLOBAL_REGISTER* Global)
{
UWORD32 Temp;
//DMA_CSDP
//----------
Temp=DMA_ACC(GLOB_REG, 0 ,DMA_GCR );
Global->Free = GetGroupBits( Temp ,DMA_FREE_POS ,DMA_FREE_NUMB );
Global->AutogatingOn = GetGroupBits( Temp ,DMA_AUTOGATE_POS ,DMA_AUTOGATE_NUMB );
}
//-------------------------------------------------------------------------------
// NAME : DMA_ReadChannel
//
// DESCRIPTION : Copy the DMA registers in the structure
//
// PARAMETERS : ChannelNumber DMA_CHANNEL_0
// DMA_CHANNEL_1
// DMA_CHANNEL_2
// DMA_CHANNEL_3
// DMA_CHANNEL_4
// DMA_CHANNEL_5
// DMA_CHANNEL_6
// DMA_CHANNEL_7
// DMA_CHANNEL_8
// DMA_CHANNEL_LCD
//
// RETURN VALUE : None
//
//--------------------------------------------------------------------------------
void DMA_ReadChannel(UWORD16 ChannelNumber)
{
UWORD32 Temp;
if (ChannelNumber != DMA_CHANNEL_LCD)
{
CHANNEL_DESCRIPTOR* Chptr;
Chptr=&(SystemDma.DmaChannel[ChannelNumber]);
//DMA_CSDP
//----------
Temp=DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CSDP );
Chptr->TypeSize = GetGroupBits( Temp ,DMA_TYPE_SIZE_POS ,DMA_TYPE_SIZE_NUMB );
Chptr->SrcPort = GetGroupBits( Temp ,DMA_SRC_PORT_POS ,DMA_SRC_PORT_NUMB );
Chptr->DestPort = GetGroupBits( Temp ,DMA_DEST_PORT_POS ,DMA_DEST_PORT_NUMB );
Chptr->SrcPack = GetGroupBits( Temp ,DMA_SRC_PACK_POS ,DMA_SRC_PACK_NUMB );
Chptr->DestPack = GetGroupBits( Temp ,DMA_DEST_PACK_POS ,DMA_DEST_PACK_NUMB );
Chptr->SrcBurst = GetGroupBits( Temp ,DMA_SRC_BURST_POS ,DMA_SRC_BURST_NUMB );
Chptr->DestBurst = GetGroupBits( Temp ,DMA_DEST_BURST_POS ,DMA_DEST_BURST_NUMB );
//DMA_CCR
//----------
Temp=DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CCR );
Chptr->SyncNumb = GetGroupBits( Temp ,DMA_SYNCNUMB_POS ,DMA_SYNCNUMB_NUMB );
Chptr->SyncPr = GetGroupBits( Temp ,DMA_SYNCPR_POS ,DMA_SYNCPR_NUMB );
Chptr->EventSync = GetGroupBits( Temp ,DMA_FS_POS ,DMA_FS_NUMB );
Chptr->Priority = GetGroupBits( Temp ,DMA_PRIORITY_POS ,DMA_PRIORITY_NUMB );
Chptr->Enable = GetGroupBits( Temp ,DMA_ENABBLE_POS ,DMA_ENABLE_NUMB );
Chptr->Autoinit = GetGroupBits( Temp ,DMA_AUTOINIT_POS ,DMA_AUTOINIT_NUMB );
Chptr->Fifofush = GetGroupBits( Temp ,DMA_FLUSH_POS ,DMA_FLUSH_NUMB );
Chptr->SrcAddressMode = GetGroupBits( Temp ,DMA_SRC_AMODE_POS ,DMA_SRC_AMODE_NUMB );
Chptr->DestAddressMode = GetGroupBits( Temp ,DMA_DEST_AMODE_POS ,DMA_DEST_AMODE_NUMB );
//DMA_CICR
//----------
Temp=DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CICR );
Chptr->TimeoutIntEnable = GetGroupBits( Temp ,DMA_TOUTIE_POS ,DMA_TOUTIE_NUMB );
Chptr->DropIntEnable = GetGroupBits( Temp ,DMA_DROPIE_POS ,DMA_DROPIE_NUMB );
Chptr->HalfFrameIntEnable = GetGroupBits( Temp ,DMA_HALFIE_POS ,DMA_HALFIE_NUMB );
Chptr->FrameIntEnable = GetGroupBits( Temp ,DMA_FRAMEIE_POS ,DMA_FRAMEIE_NUMB );
Chptr->LastFrameIntEnable = GetGroupBits( Temp ,DMA_LASTIE_POS ,DMA_LASTIE_NUMB );
Chptr->BlockIntEnable = GetGroupBits( Temp ,DMA_BLOCKIE_POS ,DMA_BLOCKIE_NUMB );
//DMA_CSR
//----------
Temp=DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CSR );
Chptr->TimeoutInt = GetGroupBits( Temp ,DMA_TOUT_POS ,DMA_TOUT_NUMB );
Chptr->DropInt = GetGroupBits( Temp ,DMA_DROP_POS ,DMA_DROP_NUMB );
Chptr->HalfFrameInt = GetGroupBits( Temp ,DMA_HALF_POS ,DMA_HALF_NUMB );
Chptr->FrameInt = GetGroupBits( Temp ,DMA_FRAME_POS ,DMA_FRAME_NUMB );
Chptr->LastFrameInt = GetGroupBits( Temp ,DMA_LASTFRAME_POS ,DMA_LASTFRAME_NUMB );
Chptr->BlockInt = GetGroupBits( Temp ,DMA_BLOCK_POS ,DMA_BLOCK_NUMB );
//DMA_CSSA_L and DMA_CSSA_U
//--------------------------
Chptr->SrcAdd = ( GetGroupBits(DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CSSA_L ) ,DMA_CSSA_L_POS ,DMA_CSSA_L_NUMB)) |
((GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CSSA_U ) ,DMA_CSSA_U_POS ,DMA_CSSA_U_NUMB ))<<16);
//DMA_CDSA_L and DMA_CDSA_U
//--------------------------
Chptr->DestAdd = ( GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CDSA_L ) ,DMA_CDSA_L_POS ,DMA_CDSA_L_NUMB )) |
((GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CDSA_U ) ,DMA_CDSA_U_POS ,DMA_CDSA_U_NUMB ))<< 16);
//DMA_CEN
//----------
Chptr->EltNumber = GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CEN ) ,DMA_CEN_POS ,DMA_CEN_NUMB );
//DMA_CFN
//----------
Chptr->FrameNumber = GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CFN ) ,DMA_CFN_POS ,DMA_CFN_NUMB );
//DMA_CFI
//----------
Chptr->FrameIndex = GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CFI ) ,DMA_CFI_POS ,DMA_CFI_NUMB );
//DMA_CEI
//----------
Chptr->EltIndex = GetGroupBits( DMA_ACC(NO_GLOB_REG,Chptr->ChannelNumb ,DMA_CEI ) ,DMA_CEI_POS ,DMA_CEI_NUMB );
}
else
{
LCD_CHANNEL_DESCRIPTOR* Chptr;
Chptr=&(SystemDma.LcdChannel);
//DMA_LCD_CTRL
//----------
Temp=DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_CTRL );
Chptr->FrameMode = GetGroupBits( Temp ,DMA_LCD_FRAMEMODE_POS ,DMA_LCD_FRAMEMODE_NUMB );
Chptr->FrameItIe = GetGroupBits( Temp ,DMA_LCD_FRAMEIE_POS ,DMA_LCD_FRAMEIE_NUMB );
Chptr->BusErrorItIe = GetGroupBits( Temp ,DMA_LCD_BUSERROR_POS ,DMA_LCD_BUSERROR_NUMB );
Chptr->Frame1ItCond = GetGroupBits( Temp ,DMA_LCD_FRAME1IT_POS ,DMA_LCD_FRAME1IT_NUMB );
Chptr->Frame2ItCond = GetGroupBits( Temp ,DMA_LCD_FRAME2IT_POS ,DMA_LCD_FRAME2IT_NUMB );
Chptr->BusErrorItCond = GetGroupBits( Temp ,DMA_LCD_BUSERRORIT_POS ,DMA_LCD_BUSERRORIT_NUMB );
Chptr->LcdSrc = GetGroupBits( Temp ,DMA_DEST_BURST_POS ,DMA_DEST_BURST_NUMB );
//DMA_LCD_TOP_F1
//----------
Chptr->LcdTopF1 = (GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_TOP_F1_U ) ,DMA_LCD_TOP_F1_U_POS ,DMA_LCD_TOP_F1_U_NUMB )<<16) |
(GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_TOP_F1_L ) ,DMA_LCD_TOP_F1_L_POS ,DMA_LCD_TOP_F1_L_NUMB ));
//DMA_LCD_BOT_F1
//----------
Chptr->LcdBotF1 = (GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_BOT_F1_U ) ,DMA_LCD_BOT_F1_U_POS ,DMA_LCD_BOT_F1_U_NUMB )<<16) |
(GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_BOT_F1_L ) ,DMA_LCD_BOT_F1_L_POS ,DMA_LCD_BOT_F1_L_NUMB ));
//DMA_LCD_TOP_F2
//----------
Chptr->LcdTopF2 = (GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_TOP_F2_U ) ,DMA_LCD_TOP_F2_U_POS ,DMA_LCD_TOP_F2_U_NUMB )<<16) |
(GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_TOP_F2_L ) ,DMA_LCD_TOP_F2_L_POS ,DMA_LCD_TOP_F2_L_NUMB ));
//DMA_LCD_BOT_F2
//----------
Chptr->LcdBotF2 = (GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_BOT_F2_U ) ,DMA_LCD_BOT_F2_U_POS ,DMA_LCD_BOT_F2_U_NUMB )<<16) |
(GetGroupBits( DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_BOT_F2_L ) ,DMA_LCD_BOT_F2_L_POS ,DMA_LCD_BOT_F2_L_NUMB ));
}
}
//-------------------------------------------------------------------------------
// NAME : DMA_GetCondBitsInterrupt
//
// DESCRIPTION : Get back the condition bits of the specified channel
//
// PARAMETERS : ChannelNumber DMA_CHANNEL_0
// DMA_CHANNEL_1
// DMA_CHANNEL_2
// DMA_CHANNEL_3
// DMA_CHANNEL_4
// DMA_CHANNEL_5
// DMA_CHANNEL_6
// DMA_CHANNEL_7
// DMA_CHANNEL_8
// DMA_CHANNEL_LCD
//
// RETURN VALUE : None
//
//--------------------------------------------------------------------------------
UWORD32 DMA_GetCondBitsInterrupt(UWORD16 ChannelNumber)
{
UWORD32 Temp;
if (ChannelNumber != DMA_CHANNEL_LCD)
{
CHANNEL_DESCRIPTOR* ChptrA;
CHANNEL_DESCRIPTOR* ChptrB;
ChptrA=&(SystemDma.DmaChannel[ChannelNumber]);
//DMA_CSR
//----------
Temp=DMA_ACC(NO_GLOB_REG, ChannelNumber ,DMA_CSR );
ChptrA->TimeoutInt = GetGroupBits( Temp ,DMA_TOUT_POS ,DMA_TOUT_NUMB );
ChptrA->DropInt = GetGroupBits( Temp ,DMA_DROP_POS ,DMA_DROP_NUMB );
ChptrA->HalfFrameInt = GetGroupBits( Temp ,DMA_HALF_POS ,DMA_HALF_NUMB );
ChptrA->FrameInt = GetGroupBits( Temp ,DMA_FRAME_POS ,DMA_FRAME_NUMB );
ChptrA->LastFrameInt = GetGroupBits( Temp ,DMA_LASTFRAME_POS ,DMA_LASTFRAME_NUMB );
ChptrA->BlockInt = GetGroupBits( Temp ,DMA_BLOCK_POS ,DMA_BLOCK_NUMB );
if ((ChannelNumber==6)||(ChannelNumber==7)||(ChannelNumber==8))
Temp=Temp>>7;
if (ChannelNumber <= 2) // Cover concatenated interrupt status registers
{
ChptrB=&(SystemDma.DmaChannel[(ChannelNumber + 6)]);
ChptrB->TimeoutInt = GetGroupBits( Temp ,(DMA_TOUT_POS + 7) ,DMA_TOUT_NUMB );
ChptrB->DropInt = GetGroupBits( Temp ,(DMA_DROP_POS + 7) ,DMA_DROP_NUMB );
ChptrB->HalfFrameInt = GetGroupBits( Temp ,(DMA_HALF_POS + 7) ,DMA_HALF_NUMB );
ChptrB->FrameInt = GetGroupBits( Temp ,(DMA_FRAME_POS + 7) ,DMA_FRAME_NUMB );
ChptrB->LastFrameInt = GetGroupBits( Temp ,(DMA_LASTFRAME_POS + 7),DMA_LASTFRAME_NUMB );
ChptrB->BlockInt = GetGroupBits( Temp ,(DMA_BLOCK_POS + 7) ,DMA_BLOCK_NUMB );
}
}
else
{
LCD_CHANNEL_DESCRIPTOR* Chptr;
Chptr=&(SystemDma.LcdChannel);
//DMA_LCD_CTRL
//----------
Temp=DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_CTRL );
Chptr->Frame1ItCond = GetGroupBits( Temp ,DMA_LCD_FRAME1IT_POS ,DMA_LCD_FRAME1IT_NUMB );
Chptr->Frame2ItCond = GetGroupBits( Temp ,DMA_LCD_FRAME2IT_POS ,DMA_LCD_FRAME2IT_NUMB );
Chptr->BusErrorItCond = GetGroupBits( Temp ,DMA_LCD_BUSERRORIT_POS ,DMA_LCD_BUSERRORIT_NUMB );
// Clear the interrupt flags
SetGroupBits( Temp ,DMA_LCD_FRAME1IT_POS ,DMA_LCD_FRAME1IT_NUMB , DISABLE );
SetGroupBits( Temp ,DMA_LCD_FRAME2IT_POS ,DMA_LCD_FRAME2IT_NUMB , DISABLE );
SetGroupBits( Temp ,DMA_LCD_BUSERRORIT_POS ,DMA_LCD_BUSERRORIT_NUMB , DISABLE );
DMA_ACC(NO_GLOB_REG,DMA_CHANNEL_LCD ,DMA_LCD_CTRL )=Temp;
}
return(Temp);
}
//-------------------------------------------------------------------------------
// NAME : DMA_EnableIntFlags
//
// DESCRIPTION : Setup interrupt flags in the channel structure specified
//
// PARAMETERS : ChannelNumber DMA_CHANNEL_0
// DMA_CHANNEL_1
// DMA_CHANNEL_2
// DMA_CHANNEL_3
// DMA_CHANNEL_4
// DMA_CHANNEL_5
// DMA_CHANNEL_6
// DMA_CHANNEL_7
// DMA_CHANNEL_8
//
//
// PARAMETERS : TimeoutIntEnable ENABLE or DISABLE
// DropIntEnable "
// HalfFrameIntEnable "
// FrameIntEnable "
// LastFrameIntEnable "
// BlockIntEnable "
//
// RETURN VALUE : IS_OK or NOT_OK if something fail
//
//--------------------------------------------------------------------------------
void DMA_EnableIntFlags( UWORD16 ChannelNumber,
UWORD32 TimeoutIntEnable,
UWORD32 DropIntEnable,
UWORD32 HalfFrameIntEnable,
UWORD32 FrameIntEnable,
UWORD32 LastFrameIntEnable,
UWORD32 BlockIntEnable)
{
CHANNEL_DESCRIPTOR* Chptr;
Chptr=&(SystemDma.DmaChannel[ChannelNumber]);
//DMA Interrupt Flag Control
//---------------------------
Chptr->TimeoutIntEnable = TimeoutIntEnable;
Chptr->DropIntEnable = DropIntEnable;
Chptr->HalfFrameIntEnable = HalfFrameIntEnable;
Chptr->FrameIntEnable = FrameIntEnable;
Chptr->LastFrameIntEnable = LastFrameIntEnable;
Chptr->BlockIntEnable = BlockIntEnable;
}
//-------------------------------------------------------------------------------
// NAME : DMA_EnableLcdIntFlags
//
// DESCRIPTION : Setup interrupt flags in the channel structure specified
//
// PARAMETERS : FrameItIe ENABLE or DISABLE
// BusErrorItIe "
//
// RETURN VALUE : IS_OK or NOT_OK if something fail
//
//--------------------------------------------------------------------------------
void DMA_EnableLcdIntFlags(UWORD32 FrameItIe,
UWORD32 BusErrorItIe)
{
LCD_CHANNEL_DESCRIPTOR* Chptr;
Chptr=&(SystemDma.LcdChannel);
//LCD Channel Interrupt Flag Control
//---------------------------
Chptr->FrameItIe = FrameItIe;
Chptr->BusErrorItIe = BusErrorItIe;
}
//-------------------------------------------------------------------------------
// NAME : DMA_ConfigInt
//
// DESCRIPTION : Configure the DMA interrupts prior to transfer
//
// PARAMETERS : ChannelNumb DMA_CHANNEL_0
// DMA_CHANNEL_1
// DMA_CHANNEL_2
// DMA_CHANNEL_3
// DMA_CHANNEL_4
// DMA_CHANNEL_5
// DMA_CHANNEL_6
// DMA_CHANNEL_7
// DMA_CHANNEL_8
//
// RETURN VALUE : None
//
//--------------------------------------------------------------------------------
void DMA_ConfigInt(UWORD16 ChannelNumb)
{
//-----------------------------------------------------
// Initialize ARM Interrupt Handler
//-----------------------------------------------------
switch(ChannelNumb)
{
case (DMA_CHANNEL_0) : // Physical channel 0, Logical channel 0
{
INTH_InitLevel (INTH_FIQNIRQ_DMA_CH0,
INTH_IRQ, // InterruptKind Irq or Fiq
INTH_FIQNIRQ_DMA_CH0, // priority
INTH_LOW_LEVEL_SENSITIVE); // type level or edge
// Enable IRQ CH0
INTH_EnableOneIt(INTH_FIQNIRQ_DMA_CH0);
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -