atapidev.h
来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C头文件 代码 · 共 302 行
H
302 行
/*
Copyright(c) 1998,1999 SIC/Hitachi,Ltd.
Module Name:
atapidev.h
Revision History:
4th August 1999 Released
*/
#include "windows.h"
#include "sh4.h"
#include "cc.h"
#include "platform.h"
#ifndef _ATADISK_H_
#define _ATADISK_H_
#ifdef __cplusplus
extern "C" {
#endif
#define DISK_IO_TIME_OUT 10000
#define REQUEST_TIME_OUT 30000
#define BYTES_PER_SECTOR 512
//
// Device states - To guard against races during trasitions to and from
// standby mode, a disk starts in the STATE_INITING state. Upon entering
// standby mode, a disk goes into the STATE_DEAD state and can no longer
// be used. Coming out of standby mode, the pcmcia system will force a card
// removal and this driver will get unloaded. Between the time the device has
// left standby mode and the card removal notice gets generated, the disk
// should not be used at all, since as the driver is unloading it unmaps the
// ATA registers in pcmcia I/O space.
//
#define STATE_INITING 1
#define STATE_CLOSED 2
#define STATE_OPENED 3
#define STATE_DEAD 4 // Power down
#define STATE_REMOVED 5 // Power down
//
// When we're resetting the controller, we have to go through some states
// as various operations finish (that is, interrupt). Here's the states
// in order.
//
#define RESET_NOT_RESETTING 0
#define RESET_FIRST_DRIVE_SET 1
#define RESET_FIRST_DRIVE_RECALIBRATED 2
#define RESET_SECOND_DRIVE_SET 3
#define RESET_SECOND_DRIVE_RECALIBRATED 4
//
// DISK_INFO.di_flags bit definitions
//
#define DISK_INFO_FLAG_CDROM 0x00000010 // device type has/CD-ROM medium exist
// ATAPI commands set - When we control ATAPI devices, we use these commands.
//
#define ATPCOM_SOFTRESET 0x08 // SoftReset
#define ATPCOM_ATAPIPAKET 0xa0 // ATAPIPaket
#define ATPCOM_IDENTFYDEVICE 0xa1 // Identfy Paket Device
#define ATPCOM_SETFEATURE 0xef // SetFeature
#define ATPCOM_READCAPACITY 0x25 // READ CD-ROM CAPACITY Command
#define ATPCOM_SEEK 0x2b // SEEK Command
//
// ATAPI packet commands set for CD-ROM
//
#define ATAPI_TESTUNITREADY 0x0000
#define ATAPI_REQUESTSENSE 0x0003
#define ATAPI_READG12 0x00a8
#define ATAPI_STARTSTOPUNIT 0x001b
#define ATAPI_SETCDROMSPEED 0x00bb
#define ATAPI_MODESENSE 0x005a
#define ATAPI_SEEK 0x002b
//
// ATAPI commands set a constant.
//
#define ATAPI_DEVICESELECT 0xa0 // Device Select (DRIVE 0 master)
#define ATAPI_SLEEP 0x64 // SLEEP TIME 100
//
// ATAPI process status
//
#define ATAPI_ATAPROC 0x01 // ATAPI ATA command send
#define ATAPI_READPROC 0x02 // ATAPI READ process
#define ATAPI_ENDPROC 0x03 // CD-ROM DATA read finished
#define ATAPI_CAPPROC 0x04 // CD-ROM CAPACTY DATA read
//
// ATAPI register mask.
//
#define ATPMASK_BUSY 0x80 // STATUS REGISTER BSYbit
#define ATPMASK_BUSYDREQ 0x88 // STATUS REGISTER BSY,DREQbit
#define ATPMASK_BUSYDRDY 0xc0 // STATUS REGISTER BSY,DRDYbit
#define ATPMASK_CHEK 0x01 // STATUS REGISTER CHEKbit
#define ATPMASK_DREQ 0x08 // STATUS REGISTER DREQbit
#define ATPMASK_IRRN 0x03 // INTERRUPT REASON REGISTER DATA END select
//
// These defines must match the ATAPI_* defines
//
#define ATAPI_ERROR 1
#define ATAPI_WARNING 2
#define ATAPI_FUNCTION 4
#define ATAPI_INIT 8
#define ATAPI_IO 16
#define ATAPI_IST 32
//
// INTERRUPPUT REQUEST REGISTER
//
/*****************************************************************************
* Modification for Aspen by Maneesh Gupta
*
* Base address of Interrupt registers is changed.
****************************************************************************/
#if (SH_PLATFORM==PLATFORM_ASPEN)
# define ATAPI_INTSIZE 0x1000
# define ATAPI_INTADDRESS 0xa4040000
#elif (SH_PLATFORM==PLATFORM_BIGSUR)
# define ATAPI_INTSIZE 0x1000
# define ATAPI_INTADDRESS 0xB1FDF000
#endif
/*****************************************************************************
* End of Modification for Aspen by Maneesh Gupta
****************************************************************************/
//
// Structure to keep track of a disk
//
typedef struct _DISK {
struct _DISK * d_next;
volatile PUCHAR d_pATAReg;
volatile PUCHAR d_pATARegAlt;
CRITICAL_SECTION d_DiskCardCrit;// guard access to global state and card
DWORD d_DiskCardState;
UCHAR d_DiskStatus; // ATA status register at interrupt time
HANDLE d_ReadEvent;
DISK_INFO d_DiskInfo; // for DISK_IOCTL_GET/SETINFOs
BOOL d_fLBAMode; // TRUE => logical block addressing supported
BOOL d_f16Bit;
DWORD d_OpenCount; // open ref count
PUSHORT d_AlignBuf; // 16 bit aligned sector buffer
LPWSTR d_ActivePath; // Active key registry path
} DISK, * PDISK;
//
// Structure to CD-ROM read parameter
//
typedef struct _CD_REQ{
DWORD MSF_min;
DWORD MSF_sec;
DWORD MSF_frame;
DWORD length;
DWORD reserved;
} CD_REQ, *PCD_REQ;
typedef struct {
DWORD count;
USHORT loop;
USHORT flag;
USHORT err;
USHORT intrsn;
} CDROM_STATE;
struct BustDataS{
USHORT d0;
USHORT d1;
USHORT d2;
USHORT d3;
USHORT d4;
USHORT d5;
USHORT d6;
USHORT d7;
USHORT d8;
USHORT d9;
USHORT da;
USHORT db;
USHORT dc;
USHORT dd;
USHORT de;
USHORT df;
};
union LongShort{
DWORD lword;
struct{
USHORT low;
USHORT hi;
} word;
};
union CharShort{
USHORT word;
struct{
CHAR low;
CHAR hi;
} byte;
};
//
// Global Variables
//
extern DWORD v_MemGran; // memory granularity (usually 1)
extern CRITICAL_SECTION v_ATAPICrit; // guard access to disk structure list
extern PDISK v_DiskList;
extern REGISTERCLIENT v_pfnCardRegisterClient;
extern DEREGISTERCLIENT v_pfnCardDeregisterClient;
extern GETFIRSTTUPLE v_pfnCardGetFirstTuple;
extern GETNEXTTUPLE v_pfnCardGetNextTuple;
extern GETTUPLEDATA v_pfnCardGetTupleData;
extern GETPARSEDTUPLE v_pfnCardGetParsedTuple;
extern REQUESTWINDOW v_pfnCardRequestWindow;
extern RELEASEWINDOW v_pfnCardReleaseWindow;
extern MAPWINDOW v_pfnCardMapWindow;
extern REQUESTCONFIG v_pfnCardRequestConfiguration;
extern RELEASECONFIG v_pfnCardReleaseConfiguration;
extern REQUESTIRQ v_pfnCardRequestIRQ;
extern RELEASEIRQ v_pfnCardReleaseIRQ;
extern REQUESTSOCKETMASK v_pfnCardRequestSocketMask;
extern RELEASESOCKETMASK v_pfnCardReleaseSocketMask;
extern GETSTATUS v_pfnCardGetStatus;
extern CDROM_STATE CD_ROM_STA;
volatile PWORD ATAPI_DATW;
volatile PBYTE ATAPI_AERR;
volatile PBYTE ATAPI_IRRN;
volatile PBYTE ATAPI_RSVE;
volatile PBYTE ATAPI_BCTL;
volatile PBYTE ATAPI_BCTH;
volatile PBYTE ATAPI_DSEL;
volatile PBYTE ATAPI_STAT;
volatile PBYTE ATAPI_ASTA;
volatile PBYTE ATAPI_COMD;
volatile PBYTE ATAPI_FETR;
volatile PBYTE ATAPI_DCTR;
volatile PWORD ATAPI_WORK;
#if (SH_PLATFORM == PLATFORM_ASPEN)
volatile PWORD ATAPI_INT;
volatile PWORD ATAPI_INTM;
#elif (SH_PLATFORM == PLATFORM_BIGSUR)
volatile PBYTE ATAPI_INT;
volatile PBYTE ATAPI_INTM;
#endif
USHORT Kdata[512]; //Error Code write area
WORD ATAPI_errcode;
WORD SenseKey;
WORD SenseCode;
//
// Global functions
//
extern VOID CloseDisk(PDISK pDisk);
extern DWORD DoDiskIO(PDISK pDisk, DWORD Opcode, PSG_REQ pSG);
extern DWORD GetDiskInfo(PDISK pDisk, PDISK_INFO pInfo);
extern DWORD SetDiskInfo(PDISK pDisk, PDISK_INFO pInfo);
extern DWORD InitDisk(PDISK pDisk, LPTSTR ActiveKey);
extern BOOL IsValidDisk(PDISK pDisk);
extern DWORD GetDiskStateError(DWORD DiskState);
extern WORD GetATAPError(void);
//
// Macros
//
#define IOREG(pDisk, RegName) (pDisk->d_pATAReg[RegName])
#define ALT_REG(pDisk, RegName) (pDisk->d_pATARegAlt[RegName])
#ifdef DEBUG
//
// Debug zones
//
#define ZONE_ERROR DEBUGZONE(0)
#define ZONE_WARNING DEBUGZONE(1)
#define ZONE_FUNCTION DEBUGZONE(2)
#define ZONE_INIT DEBUGZONE(3)
#define ZONE_PCMCIA DEBUGZONE(4)
#define ZONE_IO DEBUGZONE(5)
#endif // DEBUG
#ifdef __cplusplus
}
#endif
#endif // _ATADISK_H_
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?