?? hal.c
字號:
return dwRetVal;
}
}
else
{
if( HalInfo.dwFlags & fINDIRECT_INTERFACE )
return halpIndReadDisplay32( (UInt16)Offset );
else
{
UInt32 dwRetVal;
dwRetVal = *(pvUInt8)(gHD.MemoryAddress + Offset);
dwRetVal |= (*(pvUInt8)(gHD.MemoryAddress + Offset + 1))<< 8;
dwRetVal |= (*(pvUInt8)(gHD.MemoryAddress + Offset + 1))<<16;
dwRetVal |= (*(pvUInt8)(gHD.MemoryAddress + Offset + 1))<<24;
return dwRetVal;
}
}
}
//-----------------------------------------------------------------------------
// COMMON FUNCTION: halWriteDisplay8()
// COMMON FUNCTION: halWriteDisplay16()
// COMMON FUNCTION: halWriteDisplay32()
//-----------------------------------------------------------------------------
void halWriteDisplay8( UInt32 Offset, UInt8 Value, UInt32 Count )
{
if ( HalInfo.dwFlags & fPCCARD_INTERFACE )
{
if( Count )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
halpIndWriteDisplay8( (UInt16)(Offset*2), Value, Count );
else
{
UInt32 dwMemAddr = gHD.MemoryAddress;
dwMemAddr += Offset*2;
do
{
*((UInt8*)dwMemAddr) = Value;
dwMemAddr += 2;
} while( --Count );
}
}
}
else
{
if( Count )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
halpIndWriteDisplay8( (UInt16)Offset, Value, Count );
else
{
UInt32 dwMemAddr = gHD.MemoryAddress;
dwMemAddr += Offset;
do
{
*((UInt8*)dwMemAddr) = Value;
dwMemAddr++;
} while( --Count );
}
}
}
}
void halWriteDisplay16( UInt32 Offset, UInt16 Value, UInt32 Count )
{
if ( HalInfo.dwFlags & fPCCARD_INTERFACE )
{
if( Count )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
halpIndWriteDisplay16( (UInt16)Offset, Value, Count );
else
{
UInt8 b0 = (UInt8) Value;
UInt8 b1 = (UInt8)(Value>>8);
pvUInt8 pMem = (pvUInt8)(gHD.MemoryAddress+Offset);
do
{ *pMem = b0;
pMem += 2;
*pMem = b1;
pMem += 2;
} while( --Count );
}
}
}
else
{
if( Count )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
halpIndWriteDisplay16( (UInt16)Offset, Value, Count );
else
{
UInt8 b0 = (UInt8) Value;
UInt8 b1 = (UInt8)(Value>>8);
pvUInt8 pMem = (pvUInt8)(gHD.MemoryAddress+Offset);
do
{ *pMem++ = b0;
*pMem++ = b1;
} while( --Count );
}
}
}
}
void halWriteDisplay32( UInt32 Offset, UInt32 Value, UInt32 Count )
{
if ( HalInfo.dwFlags & fPCCARD_INTERFACE )
{
if( Count )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
halpIndWriteDisplay32( (UInt16)Offset, Value, Count );
else
{
UInt8 b0 = (UInt8) Value;
UInt8 b1 = (UInt8)(Value>>8 );
UInt8 b2 = (UInt8)(Value>>16);
UInt8 b3 = (UInt8)(Value>>24);
pvUInt8 pMem = (pvUInt8)(gHD.MemoryAddress+Offset);
do
{ *pMem = b0;
pMem += 2;
*pMem = b1;
pMem += 2;
*pMem = b2;
pMem += 2;
*pMem = b3;
pMem += 2;
} while( --Count );
}
}
}
else
{
if( Count )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
halpIndWriteDisplay32( (UInt16)Offset, Value, Count );
else
{
UInt8 b0 = (UInt8) Value;
UInt8 b1 = (UInt8)(Value>>8 );
UInt8 b2 = (UInt8)(Value>>16);
UInt8 b3 = (UInt8)(Value>>24);
pvUInt8 pMem = (pvUInt8)(gHD.MemoryAddress+Offset);
do
{ *pMem++ = b0;
*pMem++ = b1;
*pMem++ = b2;
*pMem++ = b3;
} while( --Count );
}
}
}
}
//===========================================================================
// Register Access
//===========================================================================
// *** NOTE ***
//
// The register access routines do not perform any error checking. This means:
// 1) NEVER call these routines if halAcquireController() did not succeed.
// 2) No checks are performed on the Offset to ensure it is a valid register
// address. It is possible to request a read or write to a non-register
// offset.
//-----------------------------------------------------------------------------
// FUNCTION: halReadReg()
//
// DESCRIPTION:
// These routines read the S1D13700 control registers in the width
// indicated in the function name.
//
// PARAMETERS:
// Index - Offset to the register to read. The index value is zero
// based from the beginning of register address space.
//
// RETURNS:
// The value read from the register.
//
// Be very cautious in determining the index and interpretting the values
// returned from halReadReg() ensure the correct
// meaning is given to the values. Differing endians will move relative
// register offsets.
//
// MODIFIES: No S1D13700 register are changed.
//-----------------------------------------------------------------------------
UInt8 halReadReg8( UInt16 Index )
{
if ( HalInfo.dwFlags & fPCCARD_INTERFACE )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
{
if( Index==REG001E_CSRR_P1||Index==REG001F_CSRR_P2 )
halIndRegWrite8( Index, 0 );
return (UInt8)HalInfo.Regs[Index].Value;
}
else
{
if( HalInfo.dwFlags&fDEBUG_USECACHED&&(Index<REG001E_CSRR_P1||Index>REG001F_CSRR_P2) )
return (UInt8)HalInfo.Regs[Index].Value;
else
return *((pvUInt8)((UInt32)gHD.RegisterAddress + Index*2));
}
}
else
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
{
if( Index==REG001E_CSRR_P1||Index==REG001F_CSRR_P2 )
halIndRegWrite8( Index, 0 );
return (UInt8)HalInfo.Regs[Index].Value;
}
else
{
if( HalInfo.dwFlags&fDEBUG_USECACHED&&(Index<REG001E_CSRR_P1||Index>REG001F_CSRR_P2) )
return (UInt8)HalInfo.Regs[Index].Value;
else
return *((pvUInt8)((UInt32)gHD.RegisterAddress + Index));
}
}
}
UInt16 halReadReg16( UInt16 Index )
{
UInt16 wRetVal;
if ( HalInfo.dwFlags & fPCCARD_INTERFACE )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
{
if( Index==REG001E_CSRR_P1||Index==REG001F_CSRR_P2 )
halIndRegWrite16( Index, 0 );
wRetVal = (UInt16) HalInfo.Regs[Index].Value;
wRetVal |= (UInt16)(HalInfo.Regs[Index+1].Value<<8);
}
else
{
if( HalInfo.dwFlags&fDEBUG_USECACHED&&(Index<REG001E_CSRR_P1||Index>REG001F_CSRR_P2) )
{
wRetVal = (UInt8) HalInfo.Regs[Index].Value;
if( (Index+1)==REG001E_CSRR_P1)
wRetVal |= (UInt16)(*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index+1)*2))<<8);
else
wRetVal |= (UInt16)(HalInfo.Regs[Index+1].Value<<8);
}
else
{
wRetVal = (UInt8) (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index*2)));
wRetVal |= (UInt16)(*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index+1)*2))<<8);
}
}
}
else
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
{
if( Index==REG001E_CSRR_P1||Index==REG001F_CSRR_P2 )
halIndRegWrite16( Index, 0 );
wRetVal = (UInt16) HalInfo.Regs[Index].Value;
wRetVal |= (UInt16)(HalInfo.Regs[Index+1].Value<<8);
}
else
{
if( HalInfo.dwFlags&fDEBUG_USECACHED&&(Index<REG001E_CSRR_P1||Index>REG001F_CSRR_P2) )
{
wRetVal = (UInt8) HalInfo.Regs[Index].Value;
if( (Index+1)==REG001E_CSRR_P1)
wRetVal |= (UInt16)(*((pvUInt8)((UInt32)gHD.RegisterAddress + Index+1))<<8);
else
wRetVal |= (UInt16)(HalInfo.Regs[Index+1].Value<<8);
}
else
{
wRetVal = (UInt8)(*((pvUInt8)((UInt32)gHD.RegisterAddress + Index)));
wRetVal |= (UInt16)(*((pvUInt8)((UInt32)gHD.RegisterAddress + Index+1))<<8);
}
}
}
return wRetVal;
}
UInt32 halReadReg32( UInt16 Index )
{
UInt32 dwRetVal;
if ( HalInfo.dwFlags & fPCCARD_INTERFACE )
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
{
if( Index==REG001E_CSRR_P1||Index==REG001F_CSRR_P2 )
halIndRegWrite32( Index, 0 );
dwRetVal = (UInt8 ) HalInfo.Regs[Index].Value;
dwRetVal |= (UInt32)(HalInfo.Regs[Index+1].Value<<8 );
dwRetVal |= (UInt32)(HalInfo.Regs[Index+2].Value<<16);
dwRetVal |= (UInt32)(HalInfo.Regs[Index+3].Value<<24);
}
else
{
if( HalInfo.dwFlags&fDEBUG_USECACHED&&(Index<REG001E_CSRR_P1||Index>REG001F_CSRR_P2) )
{
dwRetVal = (UInt8) HalInfo.Regs[Index].Value;
if( (Index+1)==REG001E_CSRR_P1 )
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index + 1)*2))<<8 );
else dwRetVal |= (UInt32)(HalInfo.Regs[Index+1].Value<<8 );
if( ((Index+2)==REG001E_CSRR_P1)||((Index+2)==REG001F_CSRR_P2) )
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index + 2)*2))<<16);
else dwRetVal |= (UInt32)(HalInfo.Regs[Index+2].Value<<16);
if( ((Index+3)==REG001E_CSRR_P1)||((Index+2)==REG001F_CSRR_P2) )
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index + 3)*2))<<24);
else
dwRetVal |= (UInt32)(HalInfo.Regs[Index+3].Value<<24);
}
else
{
dwRetVal = (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index*2)));
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index + 1)*2))<<8 );
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index + 2)*2))<<16);
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + (Index + 3)*2))<<24);
}
}
}
else
{
if( HalInfo.dwFlags&fINDIRECT_INTERFACE )
{
if( Index==REG001E_CSRR_P1||Index==REG001F_CSRR_P2 )
halIndRegWrite32( Index, 0 );
dwRetVal = (UInt8 ) HalInfo.Regs[Index].Value;
dwRetVal |= (UInt32)(HalInfo.Regs[Index+1].Value<<8 );
dwRetVal |= (UInt32)(HalInfo.Regs[Index+2].Value<<16);
dwRetVal |= (UInt32)(HalInfo.Regs[Index+3].Value<<24);
}
else
{
if( HalInfo.dwFlags&fDEBUG_USECACHED&&(Index<REG001E_CSRR_P1||Index>REG001F_CSRR_P2) )
{
dwRetVal = (UInt8) HalInfo.Regs[Index].Value;
if( (Index+1)==REG001E_CSRR_P1 )
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index + 1))<<8 );
else dwRetVal |= (UInt32)(HalInfo.Regs[Index+1].Value<<8 );
if( ((Index+2)==REG001E_CSRR_P1)||((Index+2)==REG001F_CSRR_P2) )
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index + 2))<<16);
else dwRetVal |= (UInt32)(HalInfo.Regs[Index+2].Value<<16);
if( ((Index+3)==REG001E_CSRR_P1)||((Index+2)==REG001F_CSRR_P2) )
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index + 3))<<24);
else
dwRetVal |= (UInt32)(HalInfo.Regs[Index+3].Value<<24);
}
else
{
dwRetVal = (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index)));
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index + 1))<<8 );
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index + 2))<<16);
dwRetVal |= (*((pvUInt8)((UInt32)gHD.RegisterAddress + Index + 3))<<24);
}
}
}
return dwRetVal;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -