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

📄 ser2440_hw.c.bak

📁 2440 wince uart source code
💻 BAK
📖 第 1 页 / 共 5 页
字号:
	{
		// Low active
		if ( !pHWHead->UseIrDA )
			*(pHWHead->rDTRport) &= ~(1<<(pHWHead->DtrPortNum));
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		// Just exit
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE, (TEXT("-SL_SetDTR, 0x%X\r\n"), pHead));
}

//
// @doc OEM
// @func VOID | SL_ClearRTS | This routine clears RTS.
// 
// @rdesc None.
// 
VOID
SL_ClearRTS(PVOID   pHead)			// @parm PVOID returned by HWinit.
{

#if 0 // by shin
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;

	RETAILMSG(0, (TEXT("+SL_ClearRTS, 0x%X\r\n"), pHead));

	EnterCriticalSection(&(pHWHead->RegCritSec));

	try
	{
		CLEARREG(pHWHead, rUMCON, SER2440_RTS);
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		// Just exit
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE, (TEXT("-SL_ClearRTS, 0x%X\r\n"), pHead));

#else

	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;

	RETAILMSG(DEBUGMODE, (TEXT("+SL_ClearRTS, 0x%X\r\n"), pHead));

	if ( !pHWHead->UseIrDA )
	{
#if USE_AFC
		// by 0212.
		*(pHWHead->rRTSport) |= (1<<(pHWHead->RtsPortNum));
#else
		EnterCriticalSection(&(pHWHead->RegCritSec));
		try
		{
			CLEARREG(pHWHead, rUMCON, SER2440_RTS);
		}
		
		except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
			EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
		{
			// Just exit
		}

		LeaveCriticalSection(&(pHWHead->RegCritSec));
#endif	
	}

	RETAILMSG(DEBUGMODE, (TEXT("-SL_ClearRTS, 0x%X\r\n"), pHead));
#endif	
}

//
// @doc OEM
// @func VOID | SL_SetRTS | This routine sets RTS.
// 
// @rdesc None.
//
VOID
SL_SetRTS(PVOID   pHead)			// @parm PVOID returned by HWinit.
{
#if 0
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;

	RETAILMSG(0, (TEXT("+SL_SetRTS, 0x%X\r\n"), pHead));
	EnterCriticalSection(&(pHWHead->RegCritSec));
	try
	{
		SETREG(pHWHead, rUMCON, SER2440_RTS);
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		// Just exit
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE, (TEXT("-SL_SetRTS, 0x%X\r\n"), pHead));
#else
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;

	RETAILMSG(DEBUGMODE, (TEXT("+SL_SetRTS, 0x%X\r\n"), pHead));

	if ( !pHWHead->UseIrDA )
	{
#if USE_AFC
		// by .0212.
		*(pHWHead->rRTSport) &= ~(1<<(pHWHead->RtsPortNum));
#else
		EnterCriticalSection(&(pHWHead->RegCritSec));
		try
		{
			SETREG(pHWHead, rUMCON, SER2440_RTS);
		}

		except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
			EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
		{
			// Just exit
		}

		LeaveCriticalSection(&(pHWHead->RegCritSec));
#endif
	}
	RETAILMSG(DEBUGMODE, (TEXT("-SL_SetRTS, 0x%X\r\n"), pHead));
#endif	
}

//
// @doc OEM
// @func VOID | SL_ClearBreak | This routine clears break.
// 
// @rdesc None.
// 
VOID
SL_ClearBreak(PVOID   pHead)			// @parm PVOID returned by HWinit.
{
	PS2440_UART_INFO   pHWHead   = (PS2440_UART_INFO)pHead;

	RETAILMSG(DEBUGMODE,  (TEXT("SL_ClearBreak:\r\n"))); 
	// S2440 does not need to clear break signal, for cleared by automatic.
}

//
// @doc OEM
// @func VOID | SL_SetBreak | This routine sets break.
// 
// @rdesc None.
//
VOID
SL_SetBreak(PVOID   pHead)			// @parm PVOID returned by HWinit.
{
	PS2440_UART_INFO    pHWHead = (PS2440_UART_INFO)pHead;

	RETAILMSG(DEBUGMODE, (TEXT("+SL_SetBreak, 0x%X\r\n"), pHead));
	EnterCriticalSection(&(pHWHead->RegCritSec));
	try
	{
		SETREG(pHWHead,rUCON,BS_SEND);
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		// Just exit
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE, (TEXT("-SL_SetBreak, 0x%X\r\n"), pHead));
}

//
// SetBaudRate
//
// Internal function.  The only real reason for splitting this out
// is so that we can call it from PowerOn and still allow SL_SetBaud
// to do debug messages, acquire critical sections, etc.
//
BOOL
SetBaudRate(PVOID   pHead, ULONG   BaudRate)
{
	PS2440_UART_INFO    pHWHead = (PS2440_UART_INFO)pHead;

	ClearPendingInts( pHWHead );

	RETAILMSG(1, (TEXT("SetBaudRate -> %d\r\n"), BaudRate));

	if ( (pHWHead->s2440SerReg->rUCON & CS_MASK) == CS_PCLK )
	{
//		if ( BaudRate == 115200 || BaudRate == 38400 )
//			OUTREG(pHWHead,rUBRDIV,( (int)(S2440PCLK/16.0/BaudRate)));
//		else
			RETAILMSG(1, (TEXT("before outreg %d\r\n"),S2440PCLK));
			OUTREG(pHWHead,rUBRDIV,( (int)(S2440PCLK/16.0/BaudRate) -1 ));
			RETAILMSG(1, (TEXT("after reg %d\r\n"),S2440PCLK));
	}
	else		// if  ( (pHWHead2->s2440SerReg->rUCON & CS_MASK) == CS_UCLK )
		OUTREG(pHWHead,rUBRDIV,( (int)(S2440UCLK/16.0/BaudRate) -1 ));
	RETAILMSG(1, (TEXT("SetBaudRate -> %d end \r\n"), BaudRate));

	return( TRUE );
}

//
// @doc OEM
// @func BOOL | SL_SetBaudRate |
//  This routine sets the baud rate of the device.
//
// @rdesc None.
//
BOOL
SL_SetBaudRate(
              PVOID   pHead,    // @parm     PVOID returned by HWInit
              ULONG   BaudRate    // @parm     ULONG representing decimal baud rate.
              )
{
	BOOL fRet;
	PS2440_UART_INFO    pHWHead = (PS2440_UART_INFO)pHead;

	RETAILMSG (DEBUGMODE, (TEXT("+SL_SetbaudRate 0x%X, %d\r\n"), pHead, BaudRate));

	try
	{
		// Enter critical section before calling function, since
		// we can't make sys calls inside SetBaudRate
		EnterCriticalSection(&(pHWHead->RegCritSec));
		RETAILMSG(1, (TEXT("before SetBaudRate \r\n"), BaudRate));
		fRet = SetBaudRate(pHead, BaudRate);
		LeaveCriticalSection(&(pHWHead->RegCritSec));
		RETAILMSG(1, (TEXT("SetBaudRate -> %d end 1\r\n"), BaudRate));
	}
	
	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		RETAILMSG(1, (TEXT("SetBaudRate except \r\n")));
		return( FALSE );
	}
	RETAILMSG(1, (TEXT("SetBaudRate -> %d end2\r\n"), BaudRate));
	if ( fRet )
	{
		pHWHead->dcb.BaudRate = BaudRate;
		RETAILMSG(1, (TEXT("SetBaudRate -> %d end 3\r\n"), BaudRate));
		RETAILMSG(DEBUGMODE, (TEXT("-SL_SetbaudRate 0x%X (%d Baud)\r\n"), pHead, BaudRate));
		return( TRUE );
	}
	else
	{
		RETAILMSG(1, (TEXT("SetBaudRate -> %d end 4\r\n"), BaudRate));
		RETAILMSG(DEBUGMODE, (TEXT("-SL_SetbaudRate - Error setting %d, failing to %d\r\n"), BaudRate, pHWHead->dcb.BaudRate));
		return( FALSE );
	}
}

//
// @doc OEM
// @func BOOL | SL_SetByteSize |
//  This routine sets the WordSize of the device.
//
// @rdesc None.
//
BOOL
SL_SetByteSize(
              PVOID   pHead,        // @parm     PVOID returned by HWInit
              ULONG   ByteSize    // @parm     ULONG ByteSize field from DCB.
              )
{
	PS2440_UART_INFO    pHWHead = (PS2440_UART_INFO)pHead;
	UINT32 lcr;
	BOOL bRet;

	RETAILMSG(DEBUGMODE,(TEXT("+SL_SetByteSize 0x%X, 0x%X\r\n"), pHead, ByteSize));

	bRet = TRUE;

	EnterCriticalSection(&(pHWHead->RegCritSec));

	try {      
		lcr = (UINT32)INREG(pHWHead,rULCON);
		lcr &= ~SER2440_DATABIT_MASK;

		switch ( 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(pHWHead,rULCON,lcr); 
		}
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		bRet = FALSE;
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE,(TEXT("-SL_SetByteSize 0x%X\r\n"), pHead));

	return(bRet);
}

//
// @doc OEM
// @func BOOL | SL_SetParity |
//  This routine sets the parity of the device.
//
// @rdesc None.
//
BOOL
SL_SetParity(
            PVOID   pHead,    // @parm     PVOID returned by HWInit
            ULONG   Parity    // @parm     ULONG parity field from DCB.
            )
{
	PS2440_UART_INFO    pHWHead = (PS2440_UART_INFO)pHead;

	UINT32 lcr;
	BOOL bRet;

	RETAILMSG(DEBUGMODE,(TEXT("+SL_SetParity 0x%X, 0x%X\r\n"), pHead, Parity));

	bRet = TRUE;

	EnterCriticalSection(&(pHWHead->RegCritSec));

	try
	{
		lcr = (UINT32)INREG(pHWHead,rULCON);      
		lcr &= ~SER2440_PARITY_MASK;

		switch ( 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;
				break;
			
			default:
				bRet = FALSE;
				break;
		}
		if (bRet)
		{
			OUTREG(pHWHead,rULCON,lcr) ;
		}
	}

	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		bRet = FALSE;
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE, (TEXT("-SL_SetParity 0x%X\r\n"), pHead));

	return(bRet);
}
//
// @doc OEM
// @func VOID | SL_SetStopBits |
//  This routine sets the Stop Bits for the device.
//
// @rdesc None.
//
BOOL
SL_SetStopBits(
              PVOID   pHead,      // @parm     PVOID returned by HWInit
              ULONG   StopBits  // @parm     ULONG StopBits field from DCB.
              )
{
	PS2440_UART_INFO    pHWHead = (PS2440_UART_INFO)pHead;

	UINT32 lcr;
	BOOL bRet;

	RETAILMSG (DEBUGMODE,(TEXT("+SL_SetStopBits 0x%X, 0x%X\r\n"), pHead, StopBits));

	bRet = TRUE;

	EnterCriticalSection(&(pHWHead->RegCritSec));

	try
	{
		lcr = INREG(pHWHead,rULCON);
		lcr &= ~SER2440_STOPBIT_MASK;

		// Note that 1.5 stop bits only works if the word size
		// is 5 bits.  Any other xmit word size will cause the
		// 1.5 stop bit setting to generate 2 stop bits.        
		switch ( StopBits )
		{
			case ONESTOPBIT :
				lcr |= 0;//SERIAL_1_STOP ;
				break;
			
			case ONE5STOPBITS :
				//lcr |= SERIAL_1_5_STOP ;
				//break;
			
			case TWOSTOPBITS :
				lcr |= 4;//SERIAL_2_STOP ;
				break;
			
			default:
				bRet = FALSE;
				break;
		}

		if (bRet)
		{
			OUTREG(pHWHead,rULCON,lcr);
		}
	}
	except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
	{
		bRet = FALSE;
	}

	LeaveCriticalSection(&(pHWHead->RegCritSec));

	RETAILMSG(DEBUGMODE,(TEXT("-SL_SetStopBits 0x%X\r\n"), pHead));

	return(bRet);

⌨️ 快捷键说明

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