📄 ser_smdk6410.cpp
字号:
PARITY_MARK;
// Setup m_DCB.
// Set Detault Parameter.
SetOutputMode(FALSE, TRUE ); // No IR.
// For DCB. The PDD only need to take care BaudRate, ByteSize Parity & StopBit
m_DCB.DCBlength = sizeof(DCB);
SetBaudRate(m_DCB.BaudRate = 9600,FALSE);
SetByteSize(m_DCB.ByteSize = 8);
SetParity(m_DCB.Parity = NOPARITY);
SetStopBits(m_DCB.StopBits = ONESTOPBIT);
}
volatile S3C6410_GPIO_REG * m_pIOPregs;
volatile S3C6410_SYSCON_REG * m_pSysconRegs;
};
/// CPdd6410Serial2 is used for UART2
/// enabling UART2 is dependent to board jumper setting.
/// We assume that jumper setting is correct.
/// UART2 has no RTS&CTS signal
/// RxD2 & TxD2 uses GPB0 & GPB1 respectively
class CPdd6410Serial2 : public CPdd6410Uart
{
public:
CPdd6410Serial2(LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CPdd6410Uart(lpActivePath, pMdd, pHwObj)
{
m_pIOPregs = NULL;
m_pSysconRegs = NULL;
}
~CPdd6410Serial2()
{
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE &= ~PCLK_UART2; // UART2;
m_pSysconRegs->SCLK_GATE &= ~SCLK_UART; // UART0~3
}
if (m_pIOPregs!=NULL)
{
MmUnmapIoSpace((PVOID)m_pIOPregs, sizeof(S3C6410_GPIO_REG));
}
if (m_pSysconRegs!=NULL)
{
MmUnmapIoSpace((PVOID)m_pSysconRegs, sizeof(S3C6410_SYSCON_REG));
}
}
virtual BOOL Init()
{
PHYSICAL_ADDRESS ioPhysicalBase = {0,0};
ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_SYSCON;
ioPhysicalBase.HighPart = 0;
m_pSysconRegs = (S3C6410_SYSCON_REG *) MmMapIoSpace(ioPhysicalBase,sizeof(S3C6410_SYSCON_REG),FALSE);
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE |= PCLK_UART2; // UART2
m_pSysconRegs->SCLK_GATE |= SCLK_UART; // UART0~3
}
else
{
return FALSE;
}
ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
ioPhysicalBase.HighPart = 0;
m_pIOPregs = (S3C6410_GPIO_REG *) MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_REG),FALSE);
if (m_pIOPregs)
{
DDKISRINFO ddi;
if (GetIsrInfo(&ddi)== ERROR_SUCCESS &&
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &ddi.dwIrq, sizeof(UINT32), &ddi.dwSysintr, sizeof(UINT32), NULL))
{
RETAILMSG( FALSE, (TEXT("DEBUG: Serial2 SYSINTR : %d\r\n"), (PBYTE)&ddi.dwSysintr));
RegSetValueEx(DEVLOAD_SYSINTR_VALNAME,REG_DWORD,(PBYTE)&ddi.dwSysintr, sizeof(UINT32));
}
else
{
return FALSE;
}
// TXD2(GPB1), RXD2(GPB0)
m_pIOPregs->GPBCON &= ~(0xf<<0 | 0xf<<4); ///< Clear Bit
m_pIOPregs->GPBCON |= (0x2<<0 | 0x2<<4); ///< Select RXD2, TXD2
m_pIOPregs->GPBPUD &= ~(0x3<<0 | 0x3<<2); ///< Pull-Up/Down Disable
return CPdd6410Uart::Init();
}
return FALSE;
}
virtual BOOL PowerOff()
{
CSerialPDD::PowerOff();
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE &= ~PCLK_UART2; // UART2;
m_pSysconRegs->SCLK_GATE &= ~SCLK_UART; // UART0~3
}
return TRUE;
}
virtual BOOL PowerOn()
{
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE |= PCLK_UART2; // UART2
m_pSysconRegs->SCLK_GATE |= SCLK_UART; // UART0~3
}
CSerialPDD::PowerOn();
return TRUE;
}
virtual ULONG GetModemStatus()
{
return (CPdd6410Uart::GetModemStatus() | MS_CTS_ON);
}
virtual void SetDefaultConfiguration()
{
// Default Value. Can be altered.
m_CommPorp.wPacketLength = 0xffff;
m_CommPorp.wPacketVersion = 0xffff;
m_CommPorp.dwServiceMask = SP_SERIALCOMM;
m_CommPorp.dwReserved1 = 0;
m_CommPorp.dwMaxTxQueue = 16;
m_CommPorp.dwMaxRxQueue = 16;
m_CommPorp.dwMaxBaud = BAUD_115200;
m_CommPorp.dwProvSubType = PST_RS232;
m_CommPorp.dwProvCapabilities =
PCF_DTRDSR | PCF_RLSD | PCF_RTSCTS |
PCF_SETXCHAR |
PCF_INTTIMEOUTS |
PCF_PARITY_CHECK |
PCF_SPECIALCHARS |
PCF_TOTALTIMEOUTS |
PCF_XONXOFF;
m_CommPorp.dwSettableBaud =
BAUD_075 | BAUD_110 | BAUD_150 | BAUD_300 | BAUD_600 |
BAUD_1200 | BAUD_1800 | BAUD_2400 | BAUD_4800 |
BAUD_7200 | BAUD_9600 | BAUD_14400 |
BAUD_19200 | BAUD_38400 | BAUD_56K | BAUD_128K |
BAUD_115200 | BAUD_57600 | BAUD_USER;
m_CommPorp.dwSettableParams =
SP_BAUD | SP_DATABITS | SP_HANDSHAKING | SP_PARITY |
SP_PARITY_CHECK | SP_RLSD | SP_STOPBITS;
m_CommPorp.wSettableData =
DATABITS_5 | DATABITS_6 | DATABITS_7 | DATABITS_8;
m_CommPorp.wSettableStopParity =
STOPBITS_10 | STOPBITS_20 |
PARITY_NONE | PARITY_ODD | PARITY_EVEN | PARITY_SPACE |
PARITY_MARK;
// Setup m_DCB.
// Set Detault Parameter.
SetOutputMode(FALSE, TRUE ); // No IR.
// For DCB. The PDD only need to take care BaudRate, ByteSize Parity & StopBit
m_DCB.DCBlength = sizeof(DCB);
SetBaudRate(m_DCB.BaudRate = 9600,FALSE);
SetByteSize(m_DCB.ByteSize = 8);
SetParity(m_DCB.Parity = NOPARITY);
SetStopBits(m_DCB.StopBits = ONESTOPBIT);
}
/// change GPIO between RXD2 and Input
#ifndef BSP_NOIRDA2
// This function is needed when we use IrDA2.
// If use IrDA. When data is transmitted, data cannot be received.
virtual void Rx_Pause(BOOL bSet)
{
if(bSet)
{ ///< from RXD2 to Input
m_pIOPregs->GPBCON = (m_pIOPregs->GPBCON & ~(0xf<<0)) | 0x0<<0;
}
else
{ ///< from Input to RXD2
m_pIOPregs->GPBCON = (m_pIOPregs->GPBCON & ~(0xf<<0)) | 0x2<<0;
}
}
#endif
volatile S3C6410_GPIO_REG * m_pIOPregs;
volatile S3C6410_SYSCON_REG * m_pSysconRegs;
};
/// CPdd6410Serial3 is used for UART3
/// enabling UART3 is dependent to board's jumper setting.
/// We assume that jumper setting is correct.
/// UART3 has no RTS&CTS signal
/// RxD3 & TxD3 uses GPB2 & GPB3 respectively
class CPdd6410Serial3 : public CPdd6410Uart
{
public:
CPdd6410Serial3(LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CPdd6410Uart(lpActivePath, pMdd, pHwObj)
{
m_pIOPregs = NULL;
m_pSysconRegs = NULL;
}
~CPdd6410Serial3()
{
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE &= ~PCLK_UART3; // UART3
m_pSysconRegs->SCLK_GATE &= ~SCLK_UART; // UART0~3
}
if (m_pIOPregs!=NULL)
{
MmUnmapIoSpace((PVOID)m_pIOPregs, sizeof(S3C6410_GPIO_REG));
}
if (m_pSysconRegs!=NULL)
{
MmUnmapIoSpace((PVOID)m_pSysconRegs, sizeof(S3C6410_SYSCON_REG));
}
}
virtual BOOL Init()
{
PHYSICAL_ADDRESS ioPhysicalBase = {0,0};
ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_SYSCON;
ioPhysicalBase.HighPart = 0;
m_pSysconRegs = (S3C6410_SYSCON_REG *) MmMapIoSpace(ioPhysicalBase,sizeof(S3C6410_SYSCON_REG),FALSE);
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE |= PCLK_UART3; // UART3
m_pSysconRegs->SCLK_GATE |= SCLK_UART; // UART0~3
}
else
{
return FALSE;
}
ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
ioPhysicalBase.HighPart = 0;
m_pIOPregs = (S3C6410_GPIO_REG *) MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_REG),FALSE);
if (m_pIOPregs)
{
DDKISRINFO ddi;
if (GetIsrInfo(&ddi)== ERROR_SUCCESS &&
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &ddi.dwIrq, sizeof(UINT32), &ddi.dwSysintr, sizeof(UINT32), NULL))
{
RETAILMSG( FALSE, (TEXT("DEBUG: Serial3 SYSINTR : %d\r\n"), (PBYTE)&ddi.dwSysintr));
RegSetValueEx(DEVLOAD_SYSINTR_VALNAME,REG_DWORD,(PBYTE)&ddi.dwSysintr, sizeof(UINT32));
}
else
{
return FALSE;
}
// TXD3(GPB3), RXD3(GPB2)
m_pIOPregs->GPBCON &= ~(0xf<<8 | 0xf<<12);
m_pIOPregs->GPBCON |= (0x2<<8 | 0x2<<12);
m_pIOPregs->GPBPUD &= ~(0x3<<4 | 0x3<<6);
return CPdd6410Uart::Init();
}
return FALSE;
}
virtual BOOL PowerOff()
{
CSerialPDD::PowerOff();
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE &= ~PCLK_UART3; // UART3
m_pSysconRegs->SCLK_GATE &= ~SCLK_UART; // UART0~3
}
return TRUE;
}
virtual BOOL PowerOn()
{
if(m_pSysconRegs)
{
m_pSysconRegs->PCLK_GATE |= PCLK_UART3; // UART3
m_pSysconRegs->SCLK_GATE |= SCLK_UART; // UART0~3
}
CSerialPDD::PowerOn();
return TRUE;
}
virtual ULONG GetModemStatus()
{
return (CPdd6410Uart::GetModemStatus() | MS_CTS_ON);
}
virtual void SetDefaultConfiguration()
{
// Default Value. Can be altered.
m_CommPorp.wPacketLength = 0xffff;
m_CommPorp.wPacketVersion = 0xffff;
m_CommPorp.dwServiceMask = SP_SERIALCOMM;
m_CommPorp.dwReserved1 = 0;
m_CommPorp.dwMaxTxQueue = 16;
m_CommPorp.dwMaxRxQueue = 16;
m_CommPorp.dwMaxBaud = BAUD_115200;
m_CommPorp.dwProvSubType = PST_RS232;
m_CommPorp.dwProvCapabilities =
PCF_DTRDSR | PCF_RLSD | PCF_RTSCTS |
PCF_SETXCHAR |
PCF_INTTIMEOUTS |
PCF_PARITY_CHECK |
PCF_SPECIALCHARS |
PCF_TOTALTIMEOUTS |
PCF_XONXOFF;
m_CommPorp.dwSettableBaud =
BAUD_075 | BAUD_110 | BAUD_150 | BAUD_300 | BAUD_600 |
BAUD_1200 | BAUD_1800 | BAUD_2400 | BAUD_4800 |
BAUD_7200 | BAUD_9600 | BAUD_14400 |
BAUD_19200 | BAUD_38400 | BAUD_56K | BAUD_128K |
BAUD_115200 | BAUD_57600 | BAUD_USER;
m_CommPorp.dwSettableParams =
SP_BAUD | SP_DATABITS | SP_HANDSHAKING | SP_PARITY |
SP_PARITY_CHECK | SP_RLSD | SP_STOPBITS;
m_CommPorp.wSettableData =
DATABITS_5 | DATABITS_6 | DATABITS_7 | DATABITS_8;
m_CommPorp.wSettableStopParity =
STOPBITS_10 | STOPBITS_20 |
PARITY_NONE | PARITY_ODD | PARITY_EVEN | PARITY_SPACE |
PARITY_MARK;
// Setup m_DCB.
// Set Detault Parameter.
SetOutputMode(FALSE, TRUE ); // No IR.
// For DCB. The PDD only need to take care BaudRate, ByteSize Parity & StopBit
m_DCB.DCBlength = sizeof(DCB);
SetBaudRate(m_DCB.BaudRate = 9600,FALSE);
SetByteSize(m_DCB.ByteSize = 8);
SetParity(m_DCB.Parity = NOPARITY);
SetStopBits(m_DCB.StopBits = ONESTOPBIT);
}
/// change GPIO between RXD3 and Input
#ifndef BSP_NOIRDA3
// This function is needed when we use IrDA2.
// If use IrDA. When data is transmitted, data cannot be received.
virtual void Rx_Pause(BOOL bSet)
{
if(bSet)
{ ///< from RXD3 to Input
m_pIOPregs->GPBCON = (m_pIOPregs->GPBCON & ~(0xf<<8)) | 0x0<<8;
}
else
{ ///< from Input to RXD3
m_pIOPregs->GPBCON = (m_pIOPregs->GPBCON & ~(0xf<<8)) | 0x2<<8;
}
}
#endif
volatile S3C6410_GPIO_REG * m_pIOPregs;
volatile S3C6410_SYSCON_REG * m_pSysconRegs;
};
CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
{
CSerialPDD * pSerialPDD = NULL;
RETAILMSG( TRUE, (TEXT("DEBUG: CreateSerialObject %d\r\n"), DeviceArrayIndex));
switch (DeviceArrayIndex)
{
case 0: ///< UART0
pSerialPDD = new CPdd6410Serial0(lpActivePath,pMdd, pHwObj);
break;
case 1: ///< UART1
pSerialPDD = new CPdd6410Serial1(lpActivePath,pMdd, pHwObj);
break;
case 2: ///< UART2(IrDA)
pSerialPDD = new CPdd6410Serial2(lpActivePath, pMdd, pHwObj);
break;
case 3: ///< UART3(IrDA)
pSerialPDD = new CPdd6410Serial3(lpActivePath, pMdd, pHwObj);
break;
}
if (pSerialPDD && !pSerialPDD->Init())
{
delete pSerialPDD;
pSerialPDD = NULL;
}
return pSerialPDD;
}
void DeleteSerialObject(CSerialPDD * pSerialPDD)
{
if (pSerialPDD)
{
delete pSerialPDD;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -