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

📄 hal.c

📁 用C语言设计的EPSON LCD控制器S1D13700驱动。
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -