📄 sdhc.h
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
// Copyright (c) 2002 BSQUARE Corporation. All rights reserved.
// DO NOT REMOVE --- BEGIN EXTERNALLY DEVELOPED SOURCE CODE ID 40973--- DO NOT REMOVE
#ifndef _SDHC_H_
#define _SDHC_H_
#include <windows.h>
#include <ceddk.h>
#include <devload.h>
#include <pm.h>
#include <ddkreg.h>
#include <creg.hxx>
#include <nkintr.h>
#include "SDCardDDK.h"
#include <SDHCD.h>
#include "SDHCRegs.h"
#include "SDHCSlot.h"
//#define NEW_POWER_MANAGEMENT // This statement is also defined in the Sdcardddk.h
#ifdef NEW_POWER_MANAGEMENT
#include "pmplatform.h" // to support PM hsjang 070822
#endif
// Configuration information for a slot.
typedef struct SDHC_SLOT_INFO {
volatile UCHAR *pucRegisters;
DWORD dwExtraInfo;
} *PSDHC_SLOT_INFO;
typedef class CSDHCBase *PCSDHCBase;
typedef PCSDHCBase (WINAPI *LPSDHC_CREATION_PROC) ();
typedef VOID (WINAPI *LPSDHC_DESTRUCTION_PROC) (PCSDHCBase);
// Base standard host controller class.
typedef class CSDHCBase {
public:
// Constructor - only initializes the member data. True initialization
// occurs in Init().
CSDHCBase();
virtual ~CSDHCBase();
// Perform basic initialization including initializing the hardware
// so that the capabilities register can be read.
virtual BOOL Init(LPCTSTR pszActiveKey);
// Second stage of hardware initialization. Start the IST and turn on
// interrupts. Should be called from SDHCInitialize.
virtual SD_API_STATUS Start();
// Closes the IST and disables interrupts. Should be called from
// SDHCDeinitialize.
virtual SD_API_STATUS Stop();
// Called by SDHCCancelIoHandler.
virtual BOOLEAN CancelIoHandler(DWORD dwSlot, PSD_BUS_REQUEST pRequest) {
// We should never get here because all requests are non-cancelable.
// The hardware supports timeouts so it is impossible for the
// controller to get stuck.
DEBUGCHK(FALSE);
return TRUE;
}
// Called by SDHCBusRequestHandler.
virtual SD_API_STATUS BusRequestHandler(DWORD dwSlot, PSD_BUS_REQUEST pRequest) {
SD_API_STATUS status;
Validate();
// Acquire the device lock to protect from device removal
Lock();
status = GetSlot(dwSlot)->BusRequestHandler(pRequest);
Unlock();
return status;
}
// Called by SDHCSlotOptionHandler.
virtual SD_API_STATUS SlotOptionHandler(DWORD dwSlot,
SD_SLOT_OPTION_CODE sdOption, PVOID pData, DWORD cbData);
// Called by SHC_IOControl. Does nothing by default.
#ifdef NEW_POWER_MANAGEMENT
virtual DWORD IOControl(DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn,
PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);
#else
virtual DWORD IOControl(DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn,
PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
return ERROR_INVALID_PARAMETER;
}
#endif
// Called by SHC_PowerDown.
virtual VOID PowerDown();
// Called by SHC_PowerUp.
virtual VOID PowerUp();
// Called by SHC_PreDeinit in order to release threads before destroying
// our objects. Calls SDHCDDeregisterHostController if necessary.
virtual VOID PreDeinit();
// Called by SHC_Deinit to get the destructor function.
virtual LPSDHC_DESTRUCTION_PROC GetDestructionProc() = 0;
// Prototypes for bus callbacks
static BOOLEAN SDHCCancelIoHandler(PSDCARD_HC_CONTEXT pHCContext,
DWORD dwSlot, PSD_BUS_REQUEST pRequest);
static SD_API_STATUS SDHCBusRequestHandler(PSDCARD_HC_CONTEXT pHCContext,
DWORD dwSlot, PSD_BUS_REQUEST pRequest);
static SD_API_STATUS SDHCSlotOptionHandler(PSDCARD_HC_CONTEXT pHCContext,
DWORD dwSlot, SD_SLOT_OPTION_CODE Option, PVOID pData,
ULONG OptionSize);
static SD_API_STATUS SDHCDeinitialize(PSDCARD_HC_CONTEXT pHCContext);
static SD_API_STATUS SDHCInitialize(PSDCARD_HC_CONTEXT pHCContext);
// Called by SHC_Init to create the proper subclass object.f
static PCSDHCBase CreateSDHCControllerObject(LPCTSTR pszActiveKey);
protected:
// Allocate the slot objects. Override this method to use a slot
// subclass.
virtual PCSDHCSlotBase AllocateSlotObjects(DWORD cSlots) {
return new CSDHCSlotBase[cSlots];
}
// Get the physical device information from the registry and
// initialize the host controller hardware. Called by Init().
virtual BOOL InitializeHardware();
// Deinitialize all resources from InitializeHardware(). Called
// by ~CSDHCBase().
virtual BOOL DeinitializeHardware();
// Static stub that calls IST().
static DWORD WINAPI ISTStub(LPVOID lpParameter) {
PCSDHCBase pController = (PCSDHCBase) lpParameter;
return pController->IST();
}
// The controller's interrupt routine. Terminates when
// m_fDriverShutdown becomes TRUE.
virtual DWORD IST();
// Interrupt handler for every slot on the controller.
// Calls HandleInterrupt() for each slot
// that needs servicing.
virtual VOID HandleInterrupt();
// Determine the number of slots on this controller.
// Returns 0 if there was a problem.
virtual DWORD DetermineSlotCount();
// Return the index of the slot zero's window.
virtual DWORD DetermineFirstSlotWindow(PDDKWINDOWINFO pwini);
// Look at all the slots to see which power state is needed
// at the controller level.
virtual CEDEVICE_POWER_STATE DetermineRequiredControllerPowerState();
// Set the power state for the entire controller.
virtual SD_API_STATUS SetControllerPowerState(CEDEVICE_POWER_STATE cpsNew);
// Get the pointer to the slot.
virtual PCSDHCSlotBase GetSlot(DWORD dwSlot) {
PREFAST_DEBUGCHK(m_pSlots);
DEBUGCHK(dwSlot < m_cSlots);
return &m_pSlots[dwSlot];
}
// Take and release the host controller critical section.
virtual VOID Lock() { SDHCDAcquireHCLock(m_pHCDContext); }
virtual VOID Unlock() { SDHCDReleaseHCLock(m_pHCDContext); }
#ifdef DEBUG
static const LPCTSTR sc_rgpszOptions[SDHCDSlotOptionCount];
// Validate the member data.
virtual VOID Validate();
// Validate the slot count.
virtual VOID ValidateSlotCount() {
DEBUGCHK( (m_cSlots != 0) && (m_cSlots <= SDHC_MAX_SLOTS) );
}
#else
// These routines do nothing in non-debug builds.
inline VOID Validate() {}
inline VOID ValidateSlotCount() {}
#endif
CReg m_regDevice; // device key
HANDLE m_hBusAccess; // bus parent
DWORD m_cSlots; // number of slots on controller
PCSDHCSlotBase m_pSlots; // dynamic array of slot objects
PSDHC_SLOT_INFO m_pSlotInfos; // dynamic arry of info on each slot
PSDCARD_HC_CONTEXT m_pHCDContext; // the host controller context
INTERFACE_TYPE m_interfaceType; // interface of the controller
DWORD m_dwBusNumber; // bus number of the controller
HANDLE m_hISRHandler; // handle to the ISR
DWORD m_dwSysIntr; // system interrupt
DWORD m_dwPriority; // IST priority
HANDLE m_hevInterrupt; // controller interrupt event
HANDLE m_htIST; // controller interrupt thread
CEDEVICE_POWER_STATE m_cpsCurrent; // current power state
BOOL m_fDriverShutdown; // driver is terminating
BOOL m_fHardwareInitialized : 1; // InitializeHardware() succeeded
BOOL m_fRegisteredWithBusDriver : 1; // SDHCDRegisterHostController() succeeded
BOOL m_fInterruptInitialized : 1; // InterruptInitialize() succeeded
#ifdef NEW_POWER_MANAGEMENT
CEDEVICE_POWER_STATE m_Dx; // for power manager hsjang 070822
#endif
}*PCSDHCBase;
// Called by SHC_Init to create the instance of CSDHCBase. Define to
// create your subclass.
extern "C" PCSDHCBase CreateSDHCControllerObject();
// Called by SHC_Deinit to free the instance of CSDHCBase. Define to
// free your subclass.
extern "C" VOID DestroySDHCControllerObject(PCSDHCBase pSDHC);
#define SDHC_INTERRUPT_ZONE SDCARD_ZONE_0
#define SDHC_SEND_ZONE SDCARD_ZONE_1
#define SDHC_RESPONSE_ZONE SDCARD_ZONE_2
#define SDHC_RECEIVE_ZONE SDCARD_ZONE_3
#define SDHC_CLOCK_ZONE SDCARD_ZONE_4
#define SDHC_TRANSMIT_ZONE SDCARD_ZONE_5
#define SDHC_INTERRUPT_ZONE_ON ZONE_ENABLE_0
#define SDHC_SEND_ZONE_ON ZONE_ENABLE_1
#define SDHC_RESPONSE_ZONE_ON ZONE_ENABLE_2
#define SDHC_RECEIVE_ZONE_ON ZONE_ENABLE_3
#define SDHC_CLOCK_ZONE_ON ZONE_ENABLE_4
#define SDHC_TRANSMIT_ZONE_ON ZONE_ENABLE_5
#define SDHC_CARD_CONTROLLER_PRIORITY 100
#define SDHC_PRIORITY_KEY _T("Priority256")
#define SDHC_CREATION_PROC_KEY _T("ObjectCreationProc")
#define INVALID_BUS_NUMBER 0xFFFFFFFF
#define GET_PCONTROLLER_FROM_HCD(pHCDContext) \
GetExtensionFromHCDContext(PCSDHCBase, pHCDContext)
#endif // _SDHC_H_
// DO NOT REMOVE --- END EXTERNALLY DEVELOPED SOURCE CODE ID --- DO NOT REMOVE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -