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

📄 ser_smdk6410.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            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);        
    }

    
    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  &= ~PCLK_UART2;        // UART2;    
            m_pSysconRegs->SCLK_GATE  &= ~SCLK_UART;        // UART0~3
        }
        if (m_pIOPregs!=NULL)
        {
            MmUnmapIoSpace((PVOID)m_pIOPregs, sizeof(S3C6410_GPIO_REG));
        }
        if (m_pSysconRegs!=NULL)
        {
            MmUnmapIoSpace((PVOID)m_pSysconRegs, sizeof(S3C6410_SYSCON_REG));
        }
    }
    virtual BOOL Init()
    {
        PHYSICAL_ADDRESS    ioPhysicalBase = {0,0};

        ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_SYSCON;
        ioPhysicalBase.HighPart = 0;
        m_pSysconRegs = (S3C6410_SYSCON_REG *) MmMapIoSpace(ioPhysicalBase,sizeof(S3C6410_SYSCON_REG),FALSE);

        if(m_pSysconRegs)
        {        
            m_pSysconRegs->PCLK_GATE  |= PCLK_UART2;        // UART2
            m_pSysconRegs->SCLK_GATE  |= SCLK_UART;        // UART0~3    
        }
        else
        {
            return FALSE;
        }        

        ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
        ioPhysicalBase.HighPart = 0;
        m_pIOPregs = (S3C6410_GPIO_REG *) MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_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))
            {   
                RETAILMSG( FALSE, (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  &= ~PCLK_UART2;        // UART2;    
            m_pSysconRegs->SCLK_GATE  &= ~SCLK_UART;        // UART0~3
        }
        return TRUE;
    }
    virtual BOOL    PowerOn()
    {
        if(m_pSysconRegs)
        {        
            m_pSysconRegs->PCLK_GATE  |= PCLK_UART2;        // UART2
            m_pSysconRegs->SCLK_GATE  |= SCLK_UART;        // 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  &= ~PCLK_UART3;        // UART3
            m_pSysconRegs->SCLK_GATE  &= ~SCLK_UART;        // UART0~3
        }
        if (m_pIOPregs!=NULL)
        {
            MmUnmapIoSpace((PVOID)m_pIOPregs, sizeof(S3C6410_GPIO_REG));
        }
        if (m_pSysconRegs!=NULL)
        {
            MmUnmapIoSpace((PVOID)m_pSysconRegs, sizeof(S3C6410_SYSCON_REG));
        }
    }
    virtual BOOL Init()
    {
        PHYSICAL_ADDRESS    ioPhysicalBase = {0,0};

        ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_SYSCON;
        ioPhysicalBase.HighPart = 0;
        m_pSysconRegs = (S3C6410_SYSCON_REG *) MmMapIoSpace(ioPhysicalBase,sizeof(S3C6410_SYSCON_REG),FALSE);

        if(m_pSysconRegs)
        {        
            m_pSysconRegs->PCLK_GATE  |= PCLK_UART3;        // UART3
            m_pSysconRegs->SCLK_GATE  |= SCLK_UART;        // UART0~3    
        }
        else
        {
            return FALSE;
        }

        ioPhysicalBase.LowPart = S3C6410_BASE_REG_PA_GPIO;
        ioPhysicalBase.HighPart = 0;
        m_pIOPregs = (S3C6410_GPIO_REG *) MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_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))
            {   
                RETAILMSG( FALSE, (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  &= ~PCLK_UART3;        // UART3
            m_pSysconRegs->SCLK_GATE  &= ~SCLK_UART;        // UART0~3
        }
        return TRUE;
    }
    virtual BOOL    PowerOn()
    {
        if(m_pSysconRegs)
        {        
            m_pSysconRegs->PCLK_GATE  |= PCLK_UART3;        // UART3
            m_pSysconRegs->SCLK_GATE  |= SCLK_UART;        // 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 + -