📄 atapipci.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.
//
#ifndef _ATAPIPCI_H_
#define _ATAPIPCI_H_
#define MAX_ATA_CNTRL 8
#define MAX_ATA_PORT (MAX_ATA_CNTRL*2)
#define MAX_ATA_DEV (MAX_ATA_PORT*2)
#define MAX_ATA_DEVICES 16
#define BM_STATUS_SIMPLEX 0x80
#define BM_STATUS_D1_DMA 0x40
#define BM_STATUS_D0_DMA 0x20
#define BM_STATUS_INTR 0x04
#define BM_STATUS_ERROR 0x02
#define BM_STATUS_ACTIVE 0x01
typedef struct {
LPBYTE pDstAddress;
LPBYTE pSrcAddress;
DWORD dwSize;
} SGCopyTable, *PSGCopyTable;
typedef struct {
DWORD dwVirtualAddress;
DWORD dwPhysicalAddress;
DWORD dwFlags;
DWORD dwSize;
} MEMTable, *PMEMTable;
typedef struct {
DWORD physAddr;
USHORT size;
USHORT EOTpad;
} DMATable, *PDMATable;
class CController
{
public:
DWORD m_dwFlag;
DWORD m_dwNum;
DWORD m_dwIrq;
DWORD m_dwSysIntr;
DWORD m_dwRegBase;
DWORD m_dwRegAlt;
DWORD m_dwBMR;
DWORD m_dwBMRStatic;
DWORD m_dwBus;
DWORD m_dwSlot;
DWORD m_dwFunction;
public:
CController() :
m_dwFlag(0),
m_dwNum(0),
m_dwIrq(0),
m_dwRegBase(0),
m_dwRegAlt(0),
m_dwBMR(0),
m_dwBus(0),
m_dwSlot(0),
m_dwFunction(0),
m_dwSysIntr(0),
m_dwBMRStatic(0)
{}
~CController()
{
DEBUGMSG( ZONE_INIT, (TEXT("ATAPIPCI:Controller %08X being destroyed!!!\r\n"), this));
if (m_dwRegBase)
MmUnmapIoSpace((LPVOID)m_dwRegBase, ATA_REG_LENGTH);
if (m_dwRegAlt)
MmUnmapIoSpace((LPVOID)m_dwRegAlt, ATA_REG_LENGTH);
if (m_dwBMR)
MmUnmapIoSpace((LPVOID)m_dwBMR, 16);
}
};
class CPort
{
public:
CRITICAL_SECTION m_csPort;
DWORD m_dwFlag;
DWORD m_dwRegBase;
DWORD m_dwRegAlt;
DWORD m_dwBMR;
DWORD m_dwBMRStatic;
DWORD m_dwSysIntr;
DWORD m_dwIrq;
HANDLE m_hIRQEvent;
HANDLE m_hThread;
HANDLE m_pDisk[2];
CController *m_pCNTRL;
public:
CPort() :
m_dwFlag(0),
m_dwRegBase(0),
m_dwRegAlt(0),
m_dwBMR(0),
m_dwSysIntr(0),
m_hIRQEvent(NULL),
m_hThread(NULL),
m_pCNTRL(NULL),
m_dwIrq(0)
{
DEBUGMSG( ZONE_INIT, (TEXT("ATAPIPCI:Port %08X being created!!!\r\n"), this));
m_pDisk[0] = NULL;
m_pDisk[1] = NULL;
InitializeCriticalSection( &m_csPort);
}
~CPort()
{
DEBUGMSG( ZONE_DEINIT, (TEXT("ATAPIPCI:Port %08X being destroyed !!!\r\n"), this));
#ifdef DEBUG
PrintInfo();
#endif
DeleteCriticalSection( &m_csPort);
if (m_hIRQEvent)
CloseHandle( m_hIRQEvent);
if (m_hThread)
CloseHandle( m_hThread);
if (m_dwSysIntr)
InterruptDisable( m_dwSysIntr);
}
inline void TakeCS() { EnterCriticalSection( &m_csPort); }
inline void ReleaseCS() {LeaveCriticalSection( &m_csPort); }
#ifdef DEBUG
void PrintInfo() {
DEBUGMSG( ZONE_INIT, (TEXT("dwRegBase = %08X\r\n"), m_dwRegBase));
DEBUGMSG( ZONE_INIT, (TEXT("dwRegAlt = %08X\r\n"), m_dwRegAlt));
DEBUGMSG( ZONE_INIT, (TEXT("dwBMR = %08X\r\n"), m_dwBMR));
DEBUGMSG( ZONE_INIT, (TEXT("dwSysIntr = %08X\r\n"), m_dwSysIntr));
DEBUGMSG( ZONE_INIT, (TEXT("dwIrq = %08X\r\n"), m_dwIrq));
DEBUGMSG( ZONE_INIT, (TEXT("dwBMRStatic = %08X\r\n"), m_dwBMRStatic));
}
#endif
};
#define MIN_PHYS_PAGES 4
#define ALIGN_VALUE 4
typedef struct _PhysTable
{
LPBYTE pVirtualAddress;
LPBYTE pPhysicalAddress;
} PhysTable, *PPhysTable;
class CPCIDisk : public CDisk
{
public:
static LONG m_lDeviceCount;
CPort *m_pPort;
public: //DMA Stuff
LPBYTE m_pStartMemory;
PDMATable m_pPRD;
PPhysTable m_pPhysList;
PSGCopyTable m_pSGCopy;
PDWORD m_pPFNs;
DWORD m_dwSGCount;
DWORD m_pPRDPhys;
DWORD m_dwPhysCount;
DWORD m_dwPRDSize;
LPBYTE m_pBMCommand;
public:
CPCIDisk(HKEY hKey) :
CDisk(hKey),
m_pStartMemory(NULL),
m_pPort(NULL),
m_pPhysList(NULL),
m_pSGCopy(NULL),
m_pPFNs(NULL),
m_pPRDPhys(0),
m_pPRD(NULL),
m_dwPhysCount(0),
m_dwSGCount(0),
m_dwPRDSize(0),
m_pBMCommand(NULL)
{
InterlockedIncrement( &m_lDeviceCount);
DEBUGMSG( ZONE_INIT | ZONE_PCI, (TEXT("ATAPIPCI:CPCIDisk DeviceCount = %ld\r\n"), m_lDeviceCount));
}
virtual ~CPCIDisk();
virtual BOOL Init(HKEY hActiveKey);
virtual void TakeCS()
{
m_pPort->TakeCS();
}
virtual void ReleaseCS()
{
m_pPort->ReleaseCS();
}
void FreeDMABuffers();
void CopyDiskInfoFromPort();
virtual BOOL WaitForInterrupt(DWORD dwTimeOut);
virtual void EnableInterrupt();
virtual BOOL ConfigPort();
public:
virtual BOOL SetupDMA( PSG_BUF pSgBuf, DWORD dwSgCount, BOOL fRead);
virtual BOOL BeginDMA(BOOL fRead);
virtual BOOL EndDMA();
virtual BOOL AbortDMA();
virtual BOOL CompleteDMA(PSG_BUF pSgBuf, DWORD dwSgCount, BOOL fRead);
public: // BM inline functions
inline void WriteBMCommand(BYTE bCommand)
{
ATA_WRITE_BYTE( m_pBMCommand, bCommand);
}
inline BYTE ReadBMStatus()
{
return ATA_READ_BYTE(m_pBMCommand+2);
}
inline void WriteBMTable(DWORD dwPhys)
{
ATA_WRITE_DWORD( (LPDWORD)(m_pBMCommand+4), dwPhys);
}
inline void WriteBMStatus(BYTE bStatus)
{
ATA_WRITE_BYTE( m_pBMCommand+2, bStatus);
}
private:
BOOL CPCIDisk::TranslateAddress (PDWORD pdwAddr);
BOOL DoesDeviceAlreadyExist() { return FALSE; } // TODO:
};
#endif //_ATAPIPCI_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -