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

📄 gum_serial.cpp

📁 老外的一个开源项目
💻 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 + -