📄 pdsocket.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 + -