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

📄 ser_arch.c

📁 基于三星S3C2410的串口驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:

// ********************************************************************
// 声明:BOOL	SerArch_Open( PVOID pHead )
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	0
// 功能描述:串口打开
// 引用: 
// ********************************************************************
BOOL	SerArch_Open( PVOID pHead )
{
    PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

//	SerDebug_Enable( DEBUGTO_DESKTOP );
#ifdef	DEBUG_SERARCH
	//SerDebug_CleanScreen( );
#endif

	EdbgOutputDebugString( "SerArch_Open begin\r\n");
	//RETAILMSG( 1, (TEXT("\r\n ....  SerArch_Open begin ....\r\n")));
    if( pInfoSerArch->dwOpenCount )
	{
        return(FALSE);
	}
    pInfoSerArch->dwOpenCount++;

	SerSetOutputMode( pInfoSerArch, FALSE );	//设置使用串口模式:屏蔽红外线
	//
	ser_OpenMode( pInfoSerArch );

	RETAILMSG( 1, (TEXT("\r\n ....  SerArch_Open end ....\r\n")));
#ifdef	DEBUG_SERARCH
		RETAILMSG(1,TEXT("\r\n SerArch_Open() ---- Debug_Arch \r\n"));
	Debug_Arch( pInfoSerArch );
#endif

	return(TRUE);
}

// ********************************************************************
// 声明:BOOL	SerArch_PowerOff(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	TRUE
// 功能描述:串口关电源
// 引用: 
// ********************************************************************
BOOL	SerArch_PowerOff(PVOID pHead)
{
	PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	if( pInfoSerArch->dwOpenCount )
	{
		//if( pInfoSerArch->dwOpt & OPT_MODEM )
		//{
		//	//pInfoSerArch->DTRPin = pInfoSerArch->pGPIO->gplr.gp10;
		//	//pInfoSerArch->RTSPin = pInfoSerArch->pGPIO->gplr.gp11;
		//}
		pInfoSerArch->fPowerOff = 1;
	}
	ser_CloseMode( pInfoSerArch );

	return TRUE;
}

// ********************************************************************
// 声明:BOOL	SerArch_PowerOn(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	TRUE
// 功能描述:串口开电源
// 引用: 
// ********************************************************************
BOOL	SerArch_PowerOn(PVOID pHead)
{
	PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	if( pInfoSerArch->fPowerOff )
	{
		ser_OpenMode( pInfoSerArch );
		//
		//if( pInfoSerArch->dwOpt & OPT_MODEM )
		//{
		//	pInfoSerArch->pGPIO->gpsr.gp10 = pInfoSerArch->DTRPin;
		//	pInfoSerArch->pGPIO->gpsr.gp11 = pInfoSerArch->RTSPin;
		//}
	}
	return TRUE;
}

//------------------------------------------------------------------------------
// ********************************************************************
// 声明:VOID	SerArch_PurgeComm(PVOID pHead,DWORD fdwAction)
// 参数:
//	IN pHead-ARCH信息
//	IN fdwAction-操作
// 返回值:
//	无
// 功能描述:PURGE串口
// 引用: 
// ********************************************************************
VOID	SerArch_PurgeComm(PVOID pHead,DWORD fdwAction)
{
	PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;
	//volatile PS2410_UART_REG pUART;

	//pUART = pInfoSerArch->pUART;
	//if( (fdwAction & PURGE_RXCLEAR) || (fdwAction & PURGE_RXABORT) )
	//{
	//	WRITE_BITFIELD(struct utcr3Bits,&pUART->utcr3,rie,0);
	//	WRITE_BITFIELD(struct utcr3Bits,&pUART->utcr3,rxe,0);
	//	WRITE_BITFIELD(struct utcr3Bits,&pUART->utcr3,rxe,1);
	//	WRITE_BITFIELD(struct utcr3Bits,&pUART->utcr3,rie,1);
	//}
	//if( (fdwAction & PURGE_TXCLEAR) || (fdwAction & PURGE_TXABORT) )
	//{
	//	WRITE_BITFIELD(struct utcr3Bits,&pUART->utcr3,txe, 0);
	//	WRITE_BITFIELD(struct utcr3Bits,&pUART->utcr3,txe, 1);
	//}

	if (fdwAction & (PURGE_TXABORT | PURGE_TXCLEAR))
	{
		SETREG(pInfoSerArch,rUFCON,0x4);	//Tx FIFO reset
		CLEARREG(pInfoSerArch,rUFCON,0x4);	//Tx FIFO Normal
	}
	if (fdwAction & (PURGE_RXABORT | PURGE_RXCLEAR))
	{
		SETREG(pInfoSerArch,rUFCON,0x2);	//Rx FIFO reset
		CLEARREG(pInfoSerArch,rUFCON,0x2);	//Rx FIFO Normal		;
	}

//#ifdef	DEBUG_SERARCH
//	Debug_Arch( );
//#endif
}
// ********************************************************************
// 声明:VOID SerArch_ClearPinDTR(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	无
// 功能描述:clear modem pin
// 引用: 
// ********************************************************************
VOID SerArch_ClearPinDTR(PVOID pHead)
{
	//PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	//if( pInfoSerArch->dwOpt & OPT_MODEM )
	//{
	//	//pInfoSerArch->pGPIO->gpsr.gp10 = 1;
	//	EnterCriticalSection(&(pInfoSerArch->RegCritSec));
	//	{
	//		// Low active pin.
	//		//*(pInfoSerArch->rDTRport) |= (1<<(pInfoSerArch->DtrPortNum));
	//	}
	//	LeaveCriticalSection(&(pInfoSerArch->RegCritSec));
	//}
}
// ********************************************************************
// 声明:VOID SerArch_SetPinDTR(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	无
// 功能描述:set modem pin
// 引用: 
// ********************************************************************
VOID SerArch_SetPinDTR(PVOID pHead)
{
	//PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	//if( pInfoSerArch->dwOpt & OPT_MODEM )
	//{
	//	//pInfoSerArch->pGPIO->gpcr.gp10 = 1;
	//	EnterCriticalSection(&(pInfoSerArch->RegCritSec));
	//	{
	//		// Low active
	//		*(pInfoSerArch->rDTRport) &= ~(1<<(pInfoSerArch->DtrPortNum));
	//	}
	//	LeaveCriticalSection(&(pInfoSerArch->RegCritSec));
	//}
}
// ********************************************************************
// 声明:VOID SerArch_ClearPinRTS(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	无
// 功能描述:clear modem pin
// 引用: 
// ********************************************************************
VOID SerArch_ClearPinRTS(PVOID pHead)
{
	PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	//if( pInfoSerArch->dwOpt & OPT_MODEM )
	{
		//pInfoSerArch->pGPIO->gpsr.gp11 = 1;
		CLEARREG(pInfoSerArch, rUMCON, SER2410_RTS);
	}
}
// ********************************************************************
// 声明:VOID SerArch_SetPinRTS(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	无
// 功能描述:set modem pin
// 引用: 
// ********************************************************************
VOID SerArch_SetPinRTS(PVOID pHead)
{
	PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	//if( pInfoSerArch->dwOpt & OPT_MODEM )
	{
		//pInfoSerArch->pGPIO->gpcr.gp11 = 1;
		//EnterCriticalSection(&(pInfoSerArch->RegCritSec));
		{
			SETREG(pInfoSerArch, rUMCON, SER2410_RTS);
		}
		//LeaveCriticalSection(&(pInfoSerArch->RegCritSec));
	}
}

// ********************************************************************
// 声明:VOID SerArch_ClearBreak(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	无
// 功能描述:clear break pin
// 引用: 
// ********************************************************************
VOID SerArch_ClearBreak(PVOID pHead)
{
	PSERARCH_INFO pInfoSerArch = (PSERARCH_INFO)pHead;

	//pInfoSerArch->pUART->utcr3.brk = 0;
	//EnterCriticalSection(&(pInfoSerArch->RegCritSec));
	{
		CLEARREG(pInfoSerArch,rUCON,BS_SEND);
	}
	//LeaveCriticalSection(&(pInfoSerArch->RegCritSec));
}

// ********************************************************************
// 声明:VOID	SerArch_SetBreak(PVOID pHead)
// 参数:
//	IN pHead-ARCH信息
// 返回值:
//	无
// 功能描述:set break pin
// 引用: 
// ********************************************************************
//功能:导致本地不能发送数据(原因: pUART->utsr0==0  and  pUART->utsr1==0 )
VOID	SerArch_SetBreak(PVOID pHead)
{
	PSERARCH_INFO   pInfoSerArch=(PSERARCH_INFO)pHead;

	EnterCriticalSection(&(pInfoSerArch->csTransmit)); // This will stop xmit action
	//EnterCriticalSection(&(pInfoSerArch->RegCritSec));
	{
		SETREG(pInfoSerArch,rUCON,BS_SEND);
	}
	//LeaveCriticalSection(&(pInfoSerArch->RegCritSec));
	LeaveCriticalSection(&(pInfoSerArch->csTransmit));
}

//-----------------------------------------
// ********************************************************************
// 声明:BOOL	ser_CheckDCB( LPDCB lpDCB, PSERARCH_INFO pInfoSerArch )
// 参数:
//	IN lpDCB-DCB信息
//	IN pInfoSerArch-ARCH信息
// 返回值:
//	无
// 功能描述:check dcb wether is validate
// 引用: 
// ********************************************************************
BOOL	ser_CheckDCB( LPDCB lpDCB, PSERARCH_INFO pInfoSerArch )
{
	PBAUDTBL	pTbl;
	DWORD		dwSizeTbl;
	DWORD		index;

	DWORD		BaudRate;
	DWORD		ByteSize;
	DWORD		Parity;
	DWORD		StopBits;
	
	//
	BaudRate = lpDCB->BaudRate;
	ByteSize = lpDCB->ByteSize;
	Parity   = lpDCB->Parity  ;
	StopBits = lpDCB->StopBits;

	pTbl = pInfoSerArch->pBaudTbl;
	dwSizeTbl = pInfoSerArch->dwSizeTbl;
	for( index=0; index<dwSizeTbl; index++ )
	{
		if( BaudRate==pTbl[index].dwBaud )
			break;
	}
	if( index<dwSizeTbl )//baud
	{
		if( ByteSize==8 || ByteSize==7 )//
		{
			if( Parity==NOPARITY || Parity==EVENPARITY || Parity==ODDPARITY )//
			{
				if( StopBits==TWOSTOPBITS || StopBits==ONESTOPBIT )//
				{
					return TRUE;
				}
			}
		}
	}

	return FALSE;
}

// ********************************************************************
// 声明:BOOL	SerArch_SetDCB( PVOID pHead, LPDCB lpDCB, DWORD dwFlagSetDCB )
// 参数:
//	IN pHead-ARCH信息
//	IN lpDCB-DCB信息
//	IN dwFlagSetDCB-设置DCB的标志
// 返回值:
//	成功返回TRUE
// 功能描述:设置成功的部分采用lpDCB,失败的部分采用原默认值
// 引用: 
// ********************************************************************
//set dcb info into hardware/function
BOOL	SerArch_SetDCB( PVOID pHead, LPDCB lpDCB, DWORD dwFlagSetDCB )
{
	PSERARCH_INFO	pInfoSerArch = (PSERARCH_INFO)pHead;
	volatile	PS2410_UART_REG	pUART;//UART-registers
	BOOL		bRet;

	if(pInfoSerArch->dwOpenCount)
	{
		pUART = pInfoSerArch->pUART;
		//
		if( ser_CheckDCB(lpDCB, pInfoSerArch) )
		{
			//EnterCriticalSection(&(pInfoSerArch->RegCritSec));
			//baudrate
			if( dwFlagSetDCB & SETDCB_BAUD )
			{
				RETAILMSG(1,(TEXT("\r\n设置波特率后:%d\r\n"),lpDCB->BaudRate));
				OUTREG(pInfoSerArch,rUBRDIV,( (int)( S2410PCLK / (lpDCB->BaudRate * 16) ) -1));
				RETAILMSG(1,(TEXT("\r\n设置波特率后:%x\r\n"),pInfoSerArch->pUART->rUBRDIV));
			}
			//ByteSize
			if( dwFlagSetDCB & SETDCB_BYTESIZE )
			{
				UINT32 lcr;
				bRet = TRUE;
				//if( ByteSize==8 || ByteSize==7 )
				//WRITE_BITFIELD(struct utcr0Bits, &pUART->utcr0, dss, (lpDCB->ByteSize==8 ? 1 : 0));
				{
					lcr = (UINT32)INREG(pInfoSerArch,rULCON);
					lcr &= ~SER2410_DATABIT_MASK;
					
					switch ( lpDCB->ByteSize ) 
					{
					case 5:
						lcr |= 0;//SERIAL_5_DATA;
						break;
					case 6:
						lcr |= 1;//SERIAL_6_DATA;
						break;
					case 7:
						lcr |= 2;//SERIAL_7_DATA;
						break;
					case 8:
						lcr |= 3;//SERIAL_8_DATA;
						break;
					default:
						bRet = FALSE;
						break;
					}
					if (bRet)
						OUTREG(pInfoSerArch,rULCON,lcr);	//设置数据位至硬件
				}
			}
			//Parity
			if( dwFlagSetDCB & SETDCB_PARITY )
			{
				UINT32 lcr;
				bRet = TRUE;
				//if( Parity==NOPARITY || Parity==EVENPARITY || Parity==ODDPARITY )
				//WRITE_BITFIELD(struct utcr0Bits, &pUART->utcr0, oes, (lpDCB->Parity==EVENPARITY ? 1 : 0));
				//WRITE_BITFIELD(struct utcr0Bits, &pUART->utcr0, pe,  (lpDCB->fParity));//lpDCB->Parity==NOPARITY ? 0 : 1
				{
					lcr = (UINT32)INREG(pInfoSerArch,rULCON);      
					lcr &= ~SER2410_PARITY_MASK;	//0x38
					
					switch ( lpDCB->Parity )
					{
					case ODDPARITY:
						lcr |= 0x20;	//SERIAL_ODD_PARITY;
						break;
					case EVENPARITY:
						lcr |= 0x28;	//SERIAL_EVEN_PARITY;
						break;
					case MARKPARITY:
						lcr |= 0x30;	//SERIAL_MARK_PARITY;
						break;
					case SPACEPARITY:
						lcr |= 0x38;	//SERIAL_SPACE_PARITY;
						break;
					case NOPARITY:
						lcr |= 0;		//SERIAL_NONE_PARITY;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -