今日做一个PDA系统需要3个串口,编程时需要模拟3个串口使用,
而使用以前的方法默认得到的模拟器只有一个串口,因此需要修改修改方法如下:
/WINCE500/PLATFORM/Deviceemulator/Src/Drivers/Serial/ser_smdk2410.cpp文件添加
class CPdd2410Serial2 : public CPdd2410Uart {
public:
CPdd2410Serial2(LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CPdd2410Uart(lpActivePath, pMdd, pHwObj)
{
m_pIOPregs = NULL;
}
~CPdd2410Serial2() {
if (m_pIOPregs!=NULL)
MmUnmapIoSpace((PVOID)m_pIOPregs,0);
}
virtual BOOL Init() {
PHYSICAL_ADDRESS ioPhysicalBase = { S3C2410X_BASE_REG_PA_IOPORT, 0};
ULONG inIoSpace = 0;
if (TranslateBusAddr(m_hParent,Internal,0, ioPhysicalBase,&inIoSpace,&ioPhysicalBase)) {
// Map it if it is Memeory Mapped IO.
m_pIOPregs =(S3C2410X_IOPORT_REG *) MmMapIoSpace(ioPhysicalBase, sizeof(S3C2410X_IOPORT_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))
{
RegSetValueEx(DEVLOAD_SYSINTR_VALNAME,REG_DWORD,(PBYTE)&ddi.dwSysintr, sizeof(UINT32));
}
else
return FALSE;
return CPdd2410Uart::Init();
}
return FALSE;
};
virtual void SetDefaultConfiguration() {
m_pIOPregs->GPHCON &= ~(0x3<<8 | 0x3<<10 /*| 0x3<<12 | 0x3<<14*/); // clear uart 1 - rx, tx
m_pIOPregs->GPHCON |= (0x2<<8 | 0x2<<10 /*| 0x1<<12 | 0x0<<14*/);
m_pIOPregs->GPHCON |= (0x2<<0 | 0x2<<2 );
m_pIOPregs->GPHUP |= 0x03;
// m_pIOPregs->GPHCON &= ~(0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx
// m_pIOPregs->GPHCON |= (0x2<<12 | 0x2<<14);
// m_pIOPregs->GPHUP |= 0xc0;
CPdd2410Uart::SetDefaultConfiguration();
}
virtual ULONG GetModemStatus() {
return (CPdd2410Uart::GetModemStatus() | MS_CTS_ON);
}
volatile S3C2410X_IOPORT_REG * m_pIOPregs;
};
class CPdd2410Serial3 : public CPdd2410Uart {
public:
CPdd2410Serial3(LPTSTR lpActivePath, PVOID pMdd, PHWOBJ pHwObj)
: CPdd2410Uart(lpActivePath, pMdd, pHwObj)
{
m_pIOPregs = NULL;
}
~CPdd2410Serial3() {
if (m_pIOPregs!=NULL)
MmUnmapIoSpace((PVOID)m_pIOPregs,0);
}
virtual BOOL Init() {
PHYSICAL_ADDRESS ioPhysicalBase = { S3C2410X_BASE_REG_PA_IOPORT, 0};
ULONG inIoSpace = 0;
if (TranslateBusAddr(m_hParent,Internal,0, ioPhysicalBase,&inIoSpace,&ioPhysicalBase)) {
// Map it if it is Memeory Mapped IO.
m_pIOPregs =(S3C2410X_IOPORT_REG *) MmMapIoSpace(ioPhysicalBase, sizeof(S3C2410X_IOPORT_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))
{
RegSetValueEx(DEVLOAD_SYSINTR_VALNAME,REG_DWORD,(PBYTE)&ddi.dwSysintr, sizeof(UINT32));
}
else
return FALSE;
return CPdd2410Uart::Init();
}
return FALSE;
};
virtual void SetDefaultConfiguration() {
// m_pIOPregs->GPHCON &= ~(0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx
// m_pIOPregs->GPHCON |= (0x2<<12 | 0x2<<14);
// m_pIOPregs->GPHUP |= 0xc0;
m_pIOPregs->GPHCON &= ~( 0x3<<12 | 0x3<<14); // clear uart 2 - rx, tx
m_pIOPregs->GPHCON |= ( 0x2<<12 | 0x2<<14);
m_pIOPregs->GPHCON |= (0x2<<0 | 0x2<<2 );
m_pIOPregs->GPHUP &= ~0xc0;
CPdd2410Uart::SetDefaultConfiguration();
}
virtual ULONG GetModemStatus() {
return (CPdd2410Uart::GetModemStatus() | MS_CTS_ON);
}
volatile S3C2410X_IOPORT_REG * m_pIOPregs;
};
修改函数
CSerialPDD * CreateSerialObject(LPTSTR lpActivePath, PVOID pMdd,PHWOBJ pHwObj, DWORD DeviceArrayIndex)
{
CSerialPDD * pSerialPDD = NULL;
switch (DeviceArrayIndex) {
case 0:
pSerialPDD = new CPdd2410Serial1(lpActivePath,pMdd, pHwObj);
break;
case 1:
pSerialPDD = new CPdd2410Serial2(lpActivePath,pMdd, pHwObj);
break;
case 2:
pSerialPDD = new CPdd2410Serial3(lpActivePath,pMdd, pHwObj);
break;
}
if (pSerialPDD && !pSerialPDD->Init()) {
delete pSerialPDD;
pSerialPDD = NULL;
}
return pSerialPDD;
}
并修改
platform.reg中指定的串口设置文件
"/WINCE500/PLATFORM/Deviceemulator/src/drivers/serial/ser_smdk2410.reg
添加
;=============== UART0 (physical COM1 connector P1) (Serial) ===============
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial]
"DeviceArrayIndex"=dword:0
"Irq"=dword:1c
"MemBase"=dword:50000000
"MemLen"=dword:2C
"InterruptBitsShift"=dword:0 ; UART 0 Interrupt Sub Register shift bit.
"ISTTimeouts"=dword:200 ; every 512 ticks checking Modem status.
"Prefix"="COM"
"Dll"="serial_smdk2410.dll"
"Order"=dword:0
"Priority"=dword:0
"Port"="COM1:"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM1:"
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;=============== UART1 (physical COM2 connector P2) (Serial) ===============
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial1]
"DeviceArrayIndex"=dword:1
"Irq"=dword:17
"MemBase"=dword:50004000
"MemLen"=dword:2C
"InterruptBitsShift"=dword:3 ; UART 1 Interrupt Sub Register shift bit.
"ISTTimeouts"=dword:200 ; every 512 ticks checking Modem status.
"Prefix"="COM"
"Index"=dword:2
"Dll"="serial_smdk2410.dll"
"Order"=dword:4
"Priority"=dword:0
"Port"="COM2:"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM2:"
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
;=============== UART2 (physical COM3 connector P2) (Serial) ===============
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial2]
"DeviceArrayIndex"=dword:2
"Irq"=dword:f
"MemBase"=dword:50008000
"MemLen"=dword:2C
"InterruptBitsShift"=dword:6 ; UART 2 Interrupt Sub Register shift bit.
"ISTTimeouts"=dword:200 ; every 512 ticks checking Modem status.
"Prefix"="COM"
"Index"=dword:3
"Dll"="serial_smdk2410.dll"
"Order"=dword:4
"Priority"=dword:0
"Port"="COM3:"
"DeviceType"=dword:0
"FriendlyName"="Serial Cable on COM3";
"Tsp"="unimodem.dll"
"IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
"DevConfig"=hex: 10,00, 00,00, 05,00,00,00, 10,01,00,00, 00,4B,00,00, 00,00, 08, 00, 00, 00,00,00,00
注意中断IRQ号要与2410的设置对上(因为微软的这个模拟器是以2410为基础做的)
/WINCE500/PUBLIC/COMMON/OAK/CSP/ARM/SAMSUNG/S3C2410X/INC/s3c2410x_intr.h
中的
#define IRQ_EINT0 0 // Arbiter 0
#define IRQ_EINT1 1
#define IRQ_EINT2 2
#define IRQ_EINT3 3
#define IRQ_EINT4_7 4 // Arbiter 1
#define IRQ_EINT8_23 5
#define IRQ_RESERVED1 6
#define IRQ_BAT_FLT 7
#define IRQ_TICK 8
#define IRQ_WDT 9
#define IRQ_TIMER0 10 // Arbiter 2
#define IRQ_TIMER1 11
#define IRQ_TIMER2 12
#define IRQ_TIMER3 13
#define IRQ_TIMER4 14
#define IRQ_UART2 15
#define IRQ_LCD 16 // Arbiter 3
#define IRQ_DMA0 17
#define IRQ_DMA1 18
#define IRQ_DMA2 19
#define IRQ_DMA3 20
#define IRQ_SDI 21
#define IRQ_SPI0 22 // Arbiter 4
#define IRQ_UART1 23
#define IRQ_RESERVED2 24
#define IRQ_USBD 25
#define IRQ_USBH 26
#define IRQ_IIC 27
#define IRQ_UART0 28 // Arbiter 5
#define IRQ_SPI1 29
#define IRQ_RTC 30
#define IRQ_ADC 31
#define IRQ_EINT4 32
#define IRQ_EINT5 33
#define IRQ_EINT6 34
#define IRQ_EINT7 35
#define IRQ_EINT8 36
#define IRQ_EINT9 37
#define IRQ_EINT10 38
#define IRQ_EINT11 39
#define IRQ_EINT12 40
#define IRQ_EINT13 41
#define IRQ_EINT14 42
#define IRQ_EINT15 43
#define IRQ_EINT16 44
#define IRQ_EINT17 45
#define IRQ_EINT18 46
#define IRQ_EINT19 47
#define IRQ_EINT20 48
#define IRQ_EINT21 49
#define IRQ_EINT22 50
#define IRQ_EINT23 51
对应上.完成以上在编译一边NK后再生成SDK即可.