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

📄 ser_smdk6410.cpp

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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  &= ~(1<<3);		// UART2;	
			m_pSysconRegs->SCLK_GATE  &= ~(1<<5);		// UART0~3
		}
		if (m_pIOPregs!=NULL)
		{
			DrvLib_UnmapIoSpace((PVOID)m_pIOPregs);
		}
		if (m_pSysconRegs!=NULL)
		{
			DrvLib_UnmapIoSpace((PVOID)m_pSysconRegs);
		}
	}
	virtual BOOL Init()
	{
		PHYSICAL_ADDRESS	ioPhysicalBase = { S3C6410_BASE_REG_PA_GPIO, 0};
		ULONG				inIoSpace = 0;
		if (TranslateBusAddr(m_hParent,Internal,0, ioPhysicalBase,&inIoSpace,&ioPhysicalBase))
		{
			// Map it if it is Memeory Mapped IO.
			m_pIOPregs =(S3C6410_GPIO_REG *) DrvLib_MapIoSpace(ioPhysicalBase.LowPart, sizeof(S3C6410_GPIO_REG),FALSE);
		}
		ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_SYSCON;
		ioPhysicalBase.HighPart = 0;
		if (TranslateBusAddr(m_hParent,Internal,0, ioPhysicalBase,&inIoSpace,&ioPhysicalBase))
		{
			m_pSysconRegs = (S3C6410_SYSCON_REG *) DrvLib_MapIoSpace(ioPhysicalBase.LowPart,sizeof(S3C6410_SYSCON_REG),FALSE);
		}
		if(m_pSysconRegs)
		{		
			m_pSysconRegs->PCLK_GATE  |= (1<<3);		// UART2
			m_pSysconRegs->SCLK_GATE  |= (1<<5);		// UART0~3	
		}
		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( TRUE, (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  &= ~(1<<3);		// UART2;	
			m_pSysconRegs->SCLK_GATE  &= ~(1<<5);		// UART0~3
		}
		return TRUE;
	}
	virtual BOOL    PowerOn()
	{
		if(m_pSysconRegs)
		{		
			m_pSysconRegs->PCLK_GATE  |= (1<<3);		// UART2
			m_pSysconRegs->SCLK_GATE  |= (1<<5);		// 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  &= ~(1<<4);		// UART3
			m_pSysconRegs->SCLK_GATE  &= ~(1<<5);		// UART0~3
		}
		if (m_pIOPregs!=NULL)
		{
			DrvLib_UnmapIoSpace((PVOID)m_pIOPregs);
		}
		if (m_pSysconRegs!=NULL)
		{
			DrvLib_UnmapIoSpace((PVOID)m_pSysconRegs);
		}
	}
	virtual BOOL Init()
	{
		PHYSICAL_ADDRESS	ioPhysicalBase = { S3C6410_BASE_REG_PA_GPIO, 0};
		ULONG				inIoSpace = 0;
		if (TranslateBusAddr(m_hParent,Internal,0, ioPhysicalBase,&inIoSpace,&ioPhysicalBase))
		{
			// Map it if it is Memeory Mapped IO.
			m_pIOPregs =(S3C6410_GPIO_REG *) DrvLib_MapIoSpace(ioPhysicalBase.LowPart, sizeof(S3C6410_GPIO_REG),FALSE);
		}
		ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_SYSCON;
		ioPhysicalBase.HighPart = 0;
		if (TranslateBusAddr(m_hParent,Internal,0, ioPhysicalBase,&inIoSpace,&ioPhysicalBase))
		{
			m_pSysconRegs = (S3C6410_SYSCON_REG *) DrvLib_MapIoSpace(ioPhysicalBase.LowPart,sizeof(S3C6410_SYSCON_REG),FALSE);
		}
		if(m_pSysconRegs)
		{		
			m_pSysconRegs->PCLK_GATE  |= (1<<4);		// UART3
			m_pSysconRegs->SCLK_GATE  |= (1<<5);		// UART0~3	
		}
		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( TRUE, (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  &= ~(1<<4);		// UART3
			m_pSysconRegs->SCLK_GATE  &= ~(1<<5);		// UART0~3
		}
		return TRUE;
	}
	virtual BOOL    PowerOn()
	{
		if(m_pSysconRegs)
		{		
			m_pSysconRegs->PCLK_GATE  |= (1<<4);		// UART3
			m_pSysconRegs->SCLK_GATE  |= (1<<5);		// 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 + -