wince 3串口模拟器

今日做一个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即可.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值