📄 gum_serial.cpp
字号:
// Copyright (c) David Vescovi. All rights reserved.
// Part of Project DrumStix
// Windows Embedded Developers Interest Group (WE-DIG) community project.
// http://www.we-dig.org
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
// File: gum_serial.cpp
//
// Gumstix BSP Serial Driver.
//
//------------------------------------------------------------------------------
#include <windows.h>
#include <types.h>
#include <ceddk.h>
#include <ddkreg.h>
#include <serhw.h>
#include <hw16550.h>
#include <Serdbg.h>
#include "bsp.h"
#include "xsc16550.h"
// FFUART
class CPdd16550FFUART : public CXSCPdd16550 {
public:
CPdd16550FFUART (LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CXSCPdd16550 (lpActivePath,pMdd, pHwObj) { };
virtual BOOL Init()
{
if (CXSCPdd16550::Init())
{
ConfigurePinout();
return TRUE;
}
else
return FALSE;
}
virtual void SerialRegisterRestore()
{
ConfigurePinout();
CPdd16550::SerialRegisterRestore();
}
virtual ULONG GetModemStatus()
{
m_HardwareLock.Lock();
ULONG ulReturn =0 ;
ULONG Events = 0;
UINT8 ubModemStatus = m_pReg16550->Read_MSR();
m_HardwareLock.Unlock();
// Event Notification.
if (ubModemStatus & SERIAL_MSR_DCTS)
Events |= EV_CTS;
if ( ubModemStatus & SERIAL_MSR_DDSR )
Events |= EV_DSR;
if ( ubModemStatus & SERIAL_MSR_TERI )
Events |= EV_RING;
if ( ubModemStatus & SERIAL_MSR_DDCD )
Events |= EV_RLSD;
// Report Modem Status;
// FFUART does not have handshake or modem signals
// (they are used for other things on Gumstix)
// if ( ubModemStatus & SERIAL_MSR_CTS )
ulReturn |= MS_CTS_ON;
// if ( ubModemStatus & SERIAL_MSR_DSR )
ulReturn |= MS_DSR_ON;
if ( ubModemStatus & SERIAL_MSR_RI )
ulReturn |= MS_RING_ON;
// if ( ubModemStatus & SERIAL_MSR_DCD )
ulReturn |= MS_RLSD_ON;
if (Events!=0)
EventCallback(Events,ulReturn);
return ulReturn;
}
private:
BOOL ConfigurePinout()
{
return TRUE;
}
};
// BTUART PORT
class CPdd16550BTUART : public CXSCPdd16550 {
public:
CPdd16550BTUART (LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CXSCPdd16550 (lpActivePath,pMdd, pHwObj) { };
virtual BOOL Init()
{
if (CXSCPdd16550::Init())
{
ConfigurePinout();
RETAILMSG(1,(L"+COM_BT_Init\r\n"));
return TRUE;
}
else
return FALSE;
}
virtual void SerialRegisterRestore()
{
ConfigurePinout();
CPdd16550::SerialRegisterRestore();
}
virtual ULONG GetModemStatus()
{
m_HardwareLock.Lock();
ULONG ulReturn =0 ;
ULONG Events = 0;
UINT8 ubModemStatus = m_pReg16550->Read_MSR();
m_HardwareLock.Unlock();
// Event Notification.
if (ubModemStatus & SERIAL_MSR_DCTS)
Events |= EV_CTS;
if ( ubModemStatus & SERIAL_MSR_DDSR )
Events |= EV_DSR;
if ( ubModemStatus & SERIAL_MSR_TERI )
Events |= EV_RING;
if ( ubModemStatus & SERIAL_MSR_DDCD )
Events |= EV_RLSD;
// Report Modem Status;
// BTUART does not have modem signals
if ( ubModemStatus & SERIAL_MSR_CTS )
ulReturn |= MS_CTS_ON;
// if ( ubModemStatus & SERIAL_MSR_DSR )
ulReturn |= MS_DSR_ON;
if ( ubModemStatus & SERIAL_MSR_RI )
ulReturn |= MS_RING_ON;
// if ( ubModemStatus & SERIAL_MSR_DCD )
ulReturn |= MS_RLSD_ON;
if (Events!=0)
EventCallback(Events,ulReturn);
return ulReturn;
}
private:
BOOL ConfigurePinout()
{
return TRUE;
}
};
// STUART PORT
class CPdd16550STUART : public CXSCPdd16550 {
public:
CPdd16550STUART (LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CXSCPdd16550 (lpActivePath,pMdd, pHwObj) { };
virtual BOOL Init()
{
if (CXSCPdd16550::Init())
{
ConfigurePinout();
RETAILMSG(1,(L"+COM_ST_Init\r\n"));
return TRUE;
}
else
return FALSE;
}
virtual void SerialRegisterRestore()
{
ConfigurePinout();
CPdd16550::SerialRegisterRestore();
}
virtual ULONG GetModemStatus()
{
m_HardwareLock.Lock();
ULONG ulReturn =0 ;
ULONG Events = 0;
UINT8 ubModemStatus = m_pReg16550->Read_MSR();
m_HardwareLock.Unlock();
// Event Notification.
if (ubModemStatus & SERIAL_MSR_DCTS)
Events |= EV_CTS;
if ( ubModemStatus & SERIAL_MSR_DDSR )
Events |= EV_DSR;
if ( ubModemStatus & SERIAL_MSR_TERI )
Events |= EV_RING;
if ( ubModemStatus & SERIAL_MSR_DDCD )
Events |= EV_RLSD;
// Report Modem Status;
// STUART does not have handshake or modem signals
// if ( ubModemStatus & SERIAL_MSR_CTS )
ulReturn |= MS_CTS_ON;
// if ( ubModemStatus & SERIAL_MSR_DSR )
ulReturn |= MS_DSR_ON;
if ( ubModemStatus & SERIAL_MSR_RI )
ulReturn |= MS_RING_ON;
// if ( ubModemStatus & SERIAL_MSR_DCD )
ulReturn |= MS_RLSD_ON;
if (Events!=0)
EventCallback(Events,ulReturn);
return ulReturn;
}
private:
BOOL ConfigurePinout()
{
return TRUE;
}
};
// HWUART PORT
class CPdd16550HWUART : public CXSCPdd16550 {
public:
CPdd16550HWUART (LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CXSCPdd16550 (lpActivePath,pMdd, pHwObj) { };
virtual BOOL Init()
{
if (CXSCPdd16550::Init())
{
ConfigurePinout();
RETAILMSG(1,(L"+COM_HW_Init\r\n"));
return TRUE;
}
else
return FALSE;
}
virtual void SerialRegisterRestore()
{
ConfigurePinout();
CPdd16550::SerialRegisterRestore();
}
virtual ULONG GetModemStatus()
{
m_HardwareLock.Lock();
ULONG ulReturn =0 ;
ULONG Events = 0;
UINT8 ubModemStatus = m_pReg16550->Read_MSR();
m_HardwareLock.Unlock();
// Event Notification.
if (ubModemStatus & SERIAL_MSR_DCTS)
Events |= EV_CTS;
if ( ubModemStatus & SERIAL_MSR_DDSR )
Events |= EV_DSR;
if ( ubModemStatus & SERIAL_MSR_TERI )
Events |= EV_RING;
if ( ubModemStatus & SERIAL_MSR_DDCD )
Events |= EV_RLSD;
// Report Modem Status;
// HWUART does not have modem signals
if ( ubModemStatus & SERIAL_MSR_CTS )
ulReturn |= MS_CTS_ON;
// if ( ubModemStatus & SERIAL_MSR_DSR )
ulReturn |= MS_DSR_ON;
if ( ubModemStatus & SERIAL_MSR_RI )
ulReturn |= MS_RING_ON;
// if ( ubModemStatus & SERIAL_MSR_DCD )
ulReturn |= MS_RLSD_ON;
if (Events!=0)
EventCallback(Events,ulReturn);
return ulReturn;
}
private:
BOOL ConfigurePinout()
{
return TRUE;
}
};
CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
{
DWORD dwHardwareConfig;
DWORD dwBytesReturned;
CSerialPDD * pSerialPDD = NULL;
switch (DeviceArrayIndex ) {
case 0:default:
pSerialPDD = new CPdd16550(lpActivePath,pMdd, pHwObj);
break;
case 0x80:
if (!KernelIoControl(IOCTL_HAL_HARDWARE_CNFG, NULL,
0, &dwHardwareConfig, sizeof(DWORD), &dwBytesReturned))
{
DEBUGMSG(ZONE_ERROR, (_T("IOCTL_HAL_HARDWARE_CNFG failed!\r\n")));
break;
}
if (!(dwHardwareConfig & GUMCFG_FFUART))
{
DEBUGMSG(ZONE_INIT, (_T("COM_FF: Hardware configuration does not support this driver!\r\n")));
break;
}
pSerialPDD = new CPdd16550FFUART (lpActivePath,pMdd, pHwObj);
break;
case 0x81:
if (!KernelIoControl(IOCTL_HAL_HARDWARE_CNFG, NULL,
0, &dwHardwareConfig, sizeof(DWORD), &dwBytesReturned))
{
DEBUGMSG(ZONE_ERROR, (_T("IOCTL_HAL_HARDWARE_CNFG failed!\r\n")));
break;
}
if (!(dwHardwareConfig & GUMCFG_BT2))
{
DEBUGMSG(ZONE_INIT, (_T("COM_BT: Hardware configuration does not support this driver!\r\n")));
break;
}
pSerialPDD = new CPdd16550BTUART(lpActivePath,pMdd, pHwObj);
break;
case 0x82:
if (!KernelIoControl(IOCTL_HAL_HARDWARE_CNFG, NULL,
0, &dwHardwareConfig, sizeof(DWORD), &dwBytesReturned))
{
DEBUGMSG(ZONE_ERROR, (_T("IOCTL_HAL_HARDWARE_CNFG failed!\r\n")));
break;
}
if (!(dwHardwareConfig & GUMCFG_STUART))
{
DEBUGMSG(ZONE_INIT, (_T("COM_ST: Hardware configuration does not support this driver!\r\n")));
break;
}
pSerialPDD = new CPdd16550STUART(lpActivePath,pMdd, pHwObj);
break;
case 0x83:
if (!KernelIoControl(IOCTL_HAL_HARDWARE_CNFG, NULL,
0, &dwHardwareConfig, sizeof(DWORD), &dwBytesReturned))
{
DEBUGMSG(ZONE_ERROR, (_T("IOCTL_HAL_HARDWARE_CNFG failed!\r\n")));
break;
}
if (!((dwHardwareConfig & GUMCFG_HWUART) || (dwHardwareConfig & GUMCFG_BT1)))
{
DEBUGMSG(ZONE_INIT, (_T("COM_HW: Hardware configuration does not support this driver!\r\n")));
break;
}
pSerialPDD = new CPdd16550HWUART(lpActivePath,pMdd, pHwObj);
break;
}
if (pSerialPDD && pSerialPDD->Init()!= TRUE) {
delete pSerialPDD;
pSerialPDD = NULL;
}
return pSerialPDD;
}
void DeleteSerialObject(CSerialPDD * pSerialPDD)
{
if (pSerialPDD)
delete pSerialPDD;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -