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

📄 atapipci.h

📁 这是运行在windows ce 4.2 版本下的关于硬盘加载的驱动程序
💻 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 + -