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

📄 pdsocket.h

📁 Windows CE 6.0 BSP for VOIPAC Board (PXA270) Version 2b.
💻 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.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:  

Abstract:

    Platform dependent PCMCIA initialization functions

Notes: 
--*/
#ifndef __PDSOCKET_H_
#define __PDSOCKET_H_

#include "CRegEdit.h"
#include "CRefCon.h"
#include "CMthread.h"
#include <socksv2.h>
#include <PcmciaCardLib.h>
#include <PcmciaCardLibEx.h>
#include <bsp.h>

extern "C"
{
#include <xllp_pccardsocket.h>
}

#define MAX_NUM_SLOTS     2

#define PCCARD_POWERON    1
#define PCCARD_POWEROFF   2

// Bulverde power entry values.
#define PCMCIA_VPP_TRISTATE      0x00

#define PCMCIA0_VCC3V_VPP0V      0x4
#define PCMCIA0_VCC5V_VPP5V      0xA
#define PCMCIA0_VCC3V_VPP3V      0x7
#define PCMCIA0_VCC5V_VPP12V   0x9
#define PCMCIA0_VCC3V_VPP12V   0x5
#define PCMCIA0_VCC3V_VPP5V      0x6
#define PCMCIA0_VCC0V_VPP0V      0x0
#define PCMCIA0_VCC5V_VPP0V      0x8
 
#define PCMCIA1_VCC3V_VPP0V      0x4
#define PCMCIA1_VCC5V_VPP5V      0xA
#define PCMCIA1_VCC3V_VPP3V      0x7
#define PCMCIA1_VCC5V_VPP12V   0x9
#define PCMCIA1_VCC3V_VPP12V   0x5
#define PCMCIA1_VCC3V_VPP5V      0x6
#define PCMCIA1_VCC0V_VPP0V      0x0
#define PCMCIA1_VCC5V_VPP0V      0x8

#define P2_BAD_VCC                 0xFF
#define P2_BAD_VPP                 0xFE


// Define rate that we poll at after RESET waiting for PC card to
// assert RDY.  Keep in mind that this only approximates the
// actual interval, as Sleep() may not be accurate.
#define PCCARD_READY_POLL_INTERVAL  10
#define PCCARD_MAX_READY_WAIT_TIME  2000

//
// Power Timings (ms)
//
#define POWER_ON_TIME                        310
#define POWER_OFF_TIME                       100


// possible power option registry values
#define REG_POWER_KEEP_DRIVER 1
#define REG_POWER_KEEP_POWER 2


//
// Socket Force Event Register 0x10 (CB)
//

#define PCCARD_INSERTED     0
#define PCCARD_NOT_INSERTED 1

#define PCCARD_NOT_READY 0
#define PCCARD_READY    1

#define NUM_POWER_ENTRIES 3


class CCardBusResource;
class CPcmciaBusBridge;

typedef struct _PDCARD_SOCKET_STATE
{
    UINT8   fSocketCaps;          // @field Socket capabilities
    UINT8   fInterruptEvents;     // @field Status change interrupt mask.  The initial state of this field
                                  //        indicates which events can cause a status change interrupt.
    UINT8   fNotifyEvents;        // @field Latched socket state
    UINT8   fControlCaps;         // @field Control capabilities
    UINT8   fInterfaceType;       // @field Memory-only or memory and I/O
    UINT8   fIREQRouting;         // @field Enable/disable IREQ
    UINT8   fVcc;                 // @field Vcc power entry index and status
    UINT8   uVpp1;                // @field Vpp1 power entry index
    UINT8   uVpp2;                // @field Vpp2 power entry index
} PDCARD_SOCKET_STATE, * PPDCARD_SOCKET_STATE;


//#define NUM_SLOTS 1

// Initialisation of the BULVERDE Memory Controller registers to
// setup Expansion Memory Timings for Common,Attribute & I/O memory  accesses.
//

#define CUSTOM_XLLP_MCIO0_SET  (0x3FU << 0)
#define CUSTOM_XLLP_MCIO0_ASST (0x36U << 7)
#define CUSTOM_XLLP_MCIO0_HOLD (0x35U << 14)

#define CUSTOM_XLLP_MCIO1_SET  (0x3FU << 0)
#define CUSTOM_XLLP_MCIO1_ASST (0x36U << 7)
#define CUSTOM_XLLP_MCIO1_HOLD (0x35U << 14)


static XLLP_CARDTIMING_T  m_strPCCardExpMemTiming = {
    (XLLP_MCMEM0_SET | XLLP_MCMEM0_ASST | XLLP_MCMEM0_HOLD), 
    (XLLP_MCMEM1_SET | XLLP_MCMEM1_ASST | XLLP_MCMEM1_HOLD),

    (XLLP_MCATT0_SET | XLLP_MCATT0_ASST | XLLP_MCATT0_HOLD),
    (XLLP_MCATT1_SET | XLLP_MCATT1_ASST | XLLP_MCATT1_HOLD),

    (CUSTOM_XLLP_MCIO0_SET  | CUSTOM_XLLP_MCIO0_ASST  | CUSTOM_XLLP_MCIO0_HOLD),
    (CUSTOM_XLLP_MCIO1_SET  | CUSTOM_XLLP_MCIO1_ASST  | CUSTOM_XLLP_MCIO1_HOLD)
};


// Initialization of the XLLP PC Card Socket State structure.
static XLLP_PCCARD_SOCKET_STATE_T m_strPCCardSocketState = {0, 0, 0, 0,
                                                            0, 0, 0, 0};


class CPcmciaCardSocket : public CPCMCIASocketBase<CStaticMemoryWindow<CPcmciaCardSocket>, CStaticIOWindow<CPcmciaCardSocket>, CStaticWindowBridgeContainer<CPcmciaBusBridge>, CPcmciaBusBridge>
{
public:

    CPcmciaCardSocket(CPcmciaBusBridge* pBridge, UINT16 nSlotNumber);
    ~CPcmciaCardSocket();

    BOOL CPcmciaCardSocket::MapDeviceRegisters(CPcmciaBusBridge* pBridge);

    virtual void    SocketEventHandle( DWORD dwStatesChange, DWORD dwStates ); // Event Handle from Interrupt.

    virtual STATUS  CardGetSocket( PSS_SOCKET_STATE pState );
    virtual STATUS  CardSetSocket( PSS_SOCKET_STATE pState );
    virtual STATUS  CardPowerHandler(UINT8 nVcc);
    virtual STATUS  CardResetSocket();

    virtual STATUS CardInquireSocket(PSS_SOCKET_INFO pSocketInfo)
    {
        if( pSocketInfo )
        {
            *pSocketInfo = m_PcmciaSocketInfo;
            return CERR_SUCCESS;
        }
        else
        {
            return CERR_BAD_ARGS;
        }
    }

    virtual void    PowerMgr(BOOL bPowerDown);
    virtual BOOL    Resuming();

    HANDLE GetSocketHandle() { return((HANDLE) m_dwSocketIndex); }

    virtual STATUS  GetPowerEntry( PDWORD pdwNumOfEnery,
                                   PSS_POWER_ENTRY pPowerEntry );
    virtual STATUS CardAccessMemory( PSS_MEMORY_ACCESS /*pMemoryAccess*/ )
    {
        DEBUGCHK( FALSE );
        return CERR_UNSUPPORTED_SERVICE;
    }

    // For Power Manager.
    BYTE                            m_bBackupExcaPwrCtrlReg;
    BOOL                            m_bResuming;
    void                            PowerMgrCallback( BOOL bPowerOff );
    void                            PowerOnProcedure( UINT8 fVcc, UINT8 fVpp );
    void                            PowerCycleEvent();

    SS_SOCKET_STATE                 m_SockState;
    SS_SOCKET_INFO                  m_PcmciaSocketInfo;
    static const SS_SOCKET_STATE    ms_SocketInitState;
    static const SS_SOCKET_INFO     ms_SocketInitInfo;

     static const SS_POWER_ENTRY m_rgPowerEntries[NUM_POWER_ENTRIES];

     static DWORD    m_dwSocketLastIndex;

private:    

    CPcmciaBusBridge                *m_pBridge;

//    volatile MAINSTONEII_BLR_REGS   *m_pBLRegs;
    volatile BULVERDE_GPIO_REG      *m_pGPIORegs;
    volatile BULVERDE_MEMCTRL_REG   *m_pMemCtrlRegs;
    volatile BULVERDE_OST_REG       *m_pOSTRegs;
    XLLP_PCCARDSOCKET_T             m_strPCCardSocketHandle;
    XLLP_PCCARDSOCKET_T             *m_pstrPCCardSocketHandle;

    DWORD           m_dwSocketIndex;
};


class CPcmciaBusBridge : public CPCCardBusBridgeBase,
                         public CRefObject,
                         public CLockObject,
                         public CMiniThread
{
public:
    CPcmciaBusBridge( LPCTSTR RegPath );
    ~CPcmciaBusBridge( void );
    BOOL    Init();
    

    BOOL    SetupWakeupSource( BOOL bSet );
    BOOL    NeedPowerResuming();
    BOOL    NeedReinitAfterPowerDown() { return FALSE; }
    BOOL    GetRegPowerOption( PDWORD pOption );

    void    PowerCycleEvent(UINT16 nSlotNumber);
    void    ForceEjectEvent(UINT16 nSlotNumber);

    void    CallBackToCardService( UINT16 nSocket,
                                   HANDLE hSocket,
                                   PSS_SOCKET_STATE pSocketState );
    DWORD   RequestSocketNumber( PSS_SOCKET_SERVICE pSocketService );

    DWORD GetFunctionIrq(void) { return m_dwClientIrq; }

    DWORD GetBridgeCSCIrq(void) { return m_dwCSCSysIntr; }

    void                            PowerMgr( BOOL bPowerDown );

    UINT16   GetSlotNumber(void)   { return m_SlotNumber;   }
    UINT16   GetSocketNumber(void) { return m_SocketNumber; }

public:

    volatile BULVERDE_GPIO_REG      *m_pGPIORegs;
    volatile BULVERDE_MEMCTRL_REG   *m_pMemCtrlRegs;
    volatile BULVERDE_OST_REG       *m_pOSTRegs;
//    volatile MAINSTONEII_BLR_REGS   *m_pBLRegs;
    XLLP_PCCARDSOCKET_T             m_strPCCardSocketHandle;
    XLLP_PCCARDSOCKET_T             *m_pstrPCCardSocketHandle;

private:
    UINT                            m_uPriority;  // IST thread priority.


    void                            InsertPcmciaCardSocket(CPcmciaCardSocket* pSocket);
    void                            RemovePcmciaCardSocket(void);
    virtual DWORD                   ThreadRun();

    DWORD                           m_dwClientIrq;  // Client/function IRQ.
    DWORD                           m_dwCSCSysIntr; // Card status change SYSINTR.
    DWORD                           m_dwCSCIrq;     // Card status change IRQ>
    HANDLE                          m_hISTEvent;   
    BOOL                            m_bTerminated;
    BOOL                            m_bResumeFlag;

    BOOL                            m_fPollingMode;
    DWORD                           m_dwPollTimeout;

    BOOL                            m_rgfPowerCycleEvent;
    BOOL                            m_rgForceEject;

    CPcmciaCardSocket*              m_prgCardSocket;
    UINT16                          m_SlotNumber;       // Physical slot number (read from registry).
    UINT16                          m_SocketNumber;     // "Logical" socket index number.

    static const SS_SOCKET_SERVICE  MAINSTONEIISocketServiceStatic;

    // Private Function
    BOOL                            InstallIsr();
    BOOL                            InitCardBusBridge( void );
    BOOL                            MapDeviceRegisters( void );
    BOOL                            UnMapDeviceRegisters( void );
    BOOL                            InitializeBridgeHW( void );
    BOOL                            InitializeBridgeGPIOs( void );
    DWORD                           GetRegistryConfig( void );
    BOOL                            GetSocketNumberFromCS( BOOL bGet );

};

CPcmciaCardSocket* CreatePCMCIASocket(CPcmciaBusBridge* pBridge, UINT16 nSocketNumber);
CPcmciaCardSocket* GetSocket(HANDLE hSocket);

#endif

⌨️ 快捷键说明

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