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

📄 pdd.h

📁 Exar 公司 M1170 芯片 (i2c 转 串口)的 驱动
💻 H
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//------------------------------------------------------------------------------
//
//  File:  pdd.h
//
#ifndef __PDD_H
#define __PDD_H

#define XR20M1170_I2C_ADDR             0x35
#define XR20M1170_ADDR_SIZE            0x7

#define TRUNC(a)                        ((unsigned int)(a))
#define ROUND(a)                        ((unsigned int)(a+0.5))

#define BIT0                            0x1
#define BIT1                            0x2
#define BIT2                            0x4
#define BIT3                            0x8
#define BIT4                            0x10
#define BIT5                            0x20
#define BIT6                            0x40
#define BIT7                            0x80

#define XR20M1170REG_RHR            0
#define XR20M1170REG_THR            1
#define XR20M1170REG_DLL            2
#define XR20M1170REG_DLM            3
#define XR20M1170REG_DLD            4
#define XR20M1170REG_IER            5
#define XR20M1170REG_ISR            6
#define XR20M1170REG_FCR            7
#define XR20M1170REG_LCR            8
#define XR20M1170REG_MCR            9
#define XR20M1170REG_LSR            10
#define XR20M1170REG_MSR            11
#define XR20M1170REG_SPR            12
#define XR20M1170REG_TCR            13
#define XR20M1170REG_TLR            14
#define XR20M1170REG_TXLVL          15
#define XR20M1170REG_RXLVL          16
#define XR20M1170REG_IODIR          17
#define XR20M1170REG_IOSTATE        18
#define XR20M1170REG_IOINTENA       19
#define XR20M1170REG_IOCONTROL      20
#define XR20M1170REG_EFCR           21
#define XR20M1170REG_EFR            22
#define XR20M1170REG_XON1           23
#define XR20M1170REG_XON2           24
#define XR20M1170REG_XOFF1          25
#define XR20M1170REG_XOFF2          26


static VOID* HWInit(ULONG, VOID*, HWOBJ*);
static BOOL  HWPostInit(VOID*);
static BOOL  HWDeinit(VOID*);
static BOOL  HWOpen(VOID*);
static ULONG HWClose(VOID*);
static INTERRUPT_TYPE HWGetInterruptType(VOID*);
static ULONG HWRxIntrHandler(VOID*, UCHAR*, ULONG*);
static VOID  HWTxIntrHandler(VOID*, UCHAR*, ULONG*);
static VOID  HWModemIntrHandler(VOID*);
static VOID  HWLineIntrHandler(VOID*);
static ULONG HWGetRxBufferSize(VOID*);
static BOOL  HWPowerOff(VOID*);
static BOOL  HWPowerOn(VOID*);
static VOID  HWClearDTR(VOID*);
static VOID  HWSetDTR(VOID*);
static VOID  HWClearRTS(VOID*);
static VOID  HWSetRTS(VOID*);
static BOOL  HWEnableIR(VOID*, ULONG);
static BOOL  HWDisableIR(VOID*);
static VOID  HWClearBreak(VOID*);
static VOID  HWSetBreak(VOID*);
static VOID  HWReset(VOID*);
static VOID  HWGetModemStatus(VOID*, ULONG*);
static BOOL  HWXmitComChar(VOID*, UCHAR);
static ULONG HWGetStatus(VOID*, COMSTAT*);
static VOID  HWGetCommProperties(VOID*, COMMPROP*);
static VOID  HWPurgeComm(VOID*, DWORD);
static BOOL  HWSetDCB(VOID*, DCB*);
static ULONG HWSetCommTimeouts(VOID*, COMMTIMEOUTS*);
static BOOL  HWIOCtl(VOID *, DWORD, UCHAR *, DWORD, UCHAR *, DWORD , DWORD *);

//------------------------------------------------------------------------------

typedef struct {

    //DWORD memBase[2];                   // Physical address of UART port
    //DWORD memLen[2];                    // Size of registry array
    DWORD gpio_power;
    DWORD gpio_irq;
    DWORD gpio_download;
    DWORD gpio_reset;
    DWORD index;                        // Device index

    BOOL  hwMode;                       // Hardware handshake mode
    DWORD rxBufferSize;                 // MDD RX buffer size

    //DWORD wakeUpChar;                   // WakeUp character
    //DWORD hwTimeout;                    // Hardware timeout

    OMAP730_CONFIG_REGS *pConfigRegs;   // Mapped VA of config module
    ULONG sysIntr;                      // Assigned SYSINTR

    HANDLE hI2c;                  // Parent bus handler
    HANDLE hGPIO;                       // GPIO bus handler

    CEDEVICE_POWER_STATE currentDX;     // Actual hardware power state
    CEDEVICE_POWER_STATE externalDX;    // External power state
    CRITICAL_SECTION powerCS;           // Guard access to power change

    ULONG frequency;                    // UART module input frequency

    PVOID pMdd;                         // MDD context

    BOOL  open;                         // Is device open?
    DCB   dcb;                          // Serial port DCB

    ULONG commErrors;                   // How many errors occured
    ULONG overrunCount;                 // How many chars was missed

    BOOL  autoRTS;                      // Is auto RTS enabled?
    //BOOL  wakeUpMode;                   // Are we in special wakeup mode?
    //BOOL  wakeUpSignaled;               // Was wakeup mode signaled already?

    UCHAR intrMask;                     // Actual interrupt mask

    BOOL  addTxIntr;                    // Should we add software TX interrupt?
    BOOL  flowOffCTS;                   // Is CTS down?
    BOOL  flowOffDSR;                   // Is DSR down?

    CRITICAL_SECTION hwCS;              // Guard access to HW registers
    CRITICAL_SECTION txCS;              // Guard HWXmitComChar
    HANDLE txEvent;                     // Signal TX interrupt for HWXmitComChar

    COMMTIMEOUTS commTimeouts;          // Communication Timeouts

} UARTPDD;


typedef enum
{
    I2C_ERROR,
    I2C_OK
} I2CERROR;


//------------------------------------------------------------------------------

static HW_VTBL g_pddVTbl = {
    HWInit,
    HWPostInit,
    HWDeinit,
    HWOpen,
    HWClose,
    HWGetInterruptType,
    HWRxIntrHandler,
    HWTxIntrHandler,
    HWModemIntrHandler,
    HWLineIntrHandler,
    HWGetRxBufferSize,
    HWPowerOff,
    HWPowerOn,
    HWClearDTR,
    HWSetDTR,
    HWClearRTS,
    HWSetRTS,
    HWEnableIR,
    HWDisableIR,
    HWClearBreak,
    HWSetBreak,
    HWXmitComChar,
    HWGetStatus,
    HWReset,
    HWGetModemStatus,
    HWGetCommProperties,
    HWPurgeComm,
    HWSetDCB,
    HWSetCommTimeouts,
    HWIOCtl
};

static void RegSetBit(UARTPDD *pPdd, UCHAR regaddr, UCHAR bit);
static void RegClrBit(UARTPDD *pPdd, UCHAR regaddr, UCHAR bit);
static UCHAR RegRead(UARTPDD *pPdd, UCHAR regaddr);
VOID RegWrite(UARTPDD *pPdd, UCHAR regaddr, UCHAR data);
static void EnterConstraint(UARTPDD *pPdd, UCHAR regaddr, UCHAR *plcr_reg, UCHAR *pefr_reg, UCHAR *pmcr_reg);
static void ExitConstraint(UARTPDD *pPdd, UCHAR regaddr, UCHAR lcr_reg, UCHAR efr_reg, UCHAR mcr_reg);
static UCHAR I2c_ReadReg(UARTPDD *pPdd, UCHAR reg);
static BOOL I2c_WriteReg(UARTPDD *pPdd, UCHAR regaddr, UCHAR data);
//static BOOL RegPrintAll(UARTPDD *pPdd);

static void gps_poweron(UARTPDD *pPdd, UCHAR on);
static void gps_1170_reset(UARTPDD *pPdd);
static void gps_download(UARTPDD *pPdd, UCHAR on);
static void HWStartup(UARTPDD *pPdd);

#define IOCTL_XR20M1170_GPS_DOWNLOADBOOT CTL_CODE(FILE_DEVICE_SERIAL_PORT, 144,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_XR20M1170_GPS_NORMALBOOT   CTL_CODE(FILE_DEVICE_SERIAL_PORT, 145,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_XR20M1170_ENABLE_LOOPBACK      CTL_CODE(FILE_DEVICE_SERIAL_PORT, 146,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_XR20M1170_DISABLE_LOOPBACK     CTL_CODE(FILE_DEVICE_SERIAL_PORT, 147,METHOD_BUFFERED,FILE_ANY_ACCESS)

#endif // __PDD_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -