📄 ser_arch.c
字号:
// ********************************************************************
// 声明: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 + -