#ifndef _ATAPUBLIC_H
#define _ATAPUBLIC_H
typedef struct ATAIdentify
{
UInt16 generalConfiguration;
UInt16 logicalCylinders;
UInt16 reserved_1[1];
UInt16 logicalHeads;
UInt16 reserved_2[2];
UInt16 logicalSectorsPerTrack;
UInt16 reserved_3[3];
char serialNumber[20];
UInt16 reserved_4[3];
char firmwareRevision[8];
char modelNumber[40];
UInt16 multipleModeSectors;
UInt16 reserved_5[1];
UInt16 capabilities1;
UInt16 capabilities2;
UInt16 pioMode;
UInt16 reserved_6[1];
UInt16 validFields;
UInt16 currentLogicalCylinders;
UInt16 currentLogicalHeads;
UInt16 currentLogicalSectorsPerTrack;
UInt16 currentAddressableSectors[2];
UInt16 currentMultipleModeSectors;
UInt16 userAddressableSectors[2];
UInt16 reserved_7[1];
UInt16 dmaModes;
UInt16 advancedPIOModes;
UInt16 minDMACycleTime;
UInt16 recDMACycleTime;
UInt16 minPIOCycleTimeNoIORDY;
UInt16 minPIOCyclcTimeIORDY;
UInt16 reserved_8[2];
UInt16 busReleaseLatency;
UInt16 serviceLatency;
UInt16 reserved_9[2];
UInt16 queueDepth;
UInt16 reserved_10[4];
UInt16 versionMajor;
UInt16 versionMinor;
UInt16 commandSetsSupported1;
UInt16 commandSetsSupported2;
UInt16 commandSetsSupported3;
UInt16 commandSetsEnabled1;
UInt16 commandSetsEnabled2;
UInt16 commandSetsDefault;
UInt16 ultraDMAModes;
UInt16 securityEraseTime;
UInt16 securityEnhancedEraseTime;
UInt16 currentAdvPowerMgtValue;
UInt16 reserved_11[35];
UInt16 removableMediaSupported;
UInt16 securityStatus;
UInt16 reserved_12[127];
} ATAIdentify;
typedef struct ATAPIInquiry
{
unsigned char devType;
unsigned char devTypeMod;
unsigned char version;
unsigned char format;
unsigned char length;
unsigned char reserved5;
unsigned char reserved6;
unsigned char flags;
unsigned char vendorName[8];
unsigned char productName[16];
unsigned char productRevision[4];
unsigned char vendorSpecific[20];
unsigned char moreReserved[40];
} ATAInquiry;
enum
{
kATAPIDevTypeQualifierConnected = 0x00,
kATAPIDevTypeQualifierNotConnected = 0x20,
kATAPIDevTypeQualifierReserved = 0x40,
kATAPIDevTypeQualifierMissing = 0x60,
kATAPIDevTypeQualifierVendorSpecific = 0x80,
kATAPIDevTypeQualifierMask = 0xE0,
};
enum ATAPIDevFlags
{
kATAPIDevCapRelAdr = 0x80,
kATAPIDevCapWBus32 = 0x40,
kATAPIDevCapWBus16 = 0x20,
kATAPIDevCapSync = 0x10,
kATAPIDevCapLinked = 0x08,
kATAPIDevCapCmdQue = 0x02,
kATAPIDevCapSftRe = 0x01,
};
typedef struct ATAPISenseData
{
unsigned char errorCode;
unsigned char segmentNumber;
unsigned char senseKey;
unsigned char info[4];
unsigned char additionalSenseLength;
unsigned char reservedForCopy[4];
unsigned char additionalSenseCode;
unsigned char additionalSenseQualifier;
unsigned char fruCode;
unsigned char senseKeySpecific[2];
unsigned char additional[101];
} ATASenseData;
enum ATAErrorCode
{
kATAPISenseHasLBN = 0x80,
kATAPISenseInfoValid = 0x70,
kATAPISenseInfoMask = 0x70,
kATAPISenseCurrentErr = 0x70,
kATAPISenseDeferredErr = 0x71,
};
enum ATAPISenseKeyMasks
{
kATAPISenseKeyMask = 0x0F,
kATAPISenseILI = 0x20,
kATAPISenseEOM = 0x40,
kATAPISenseFileMark = 0x80,
};
enum ATAPISenseKeys
{
kATAPISenseNone = 0x00,
kATAPISenseRecoveredErr = 0x01,
kATAPISenseNotReady = 0x02,
kATAPISenseMediumErr = 0x03,
kATAPISenseHardwareErr = 0x04,
kATAPISenseIllegalReq = 0x05,
kATAPISenseUnitAtn = 0x06,
kATAPISenseDataProtect = 0x07,
kATAPISenseBlankCheck = 0x08,
kATAPISenseVendorSpecific = 0x09,
kATAPISenseCopyAborted = 0x0a,
kATAPISenseAbortedCmd = 0x0b,
kATAPISenseEqual = 0x0c,
kATAPISenseVolumeOverflow = 0x0d,
kATAPISenseMiscompare = 0x0e,
};
enum ATAPIStatus
{
kATAPIStatusGood = 0x00,
kATAPIStatusCheckCondition = 0x02,
kATAPIStatusConditionMet = 0x04,
kATAPIStatusBusy = 0x08,
kATAPIStatusIntermediate = 0x10,
kATAPIStatusIntermediateMet = 0x0a,
kATAPIStatusReservationConfict = 0x18,
kATAPIStatusCommandTerminated = 0x22,
kATAPIStatusQueueFull = 0x28,
};
enum ATAPIDevTypes
{
kATAPIDevTypeDirect = 0,
kATAPIDevTypeSequential,
kATAPIDevTypePrinter,
kATAPIDevTypeProcessor,
kATAPIDevTypeWorm,
kATAPIDevTypeCDROM,
kATAPIDevTypeScanner,
kATAPIDevTypeOptical,
kATAPIDevTypeChanger,
kATAPIDevTypeComm,
kATAPIDevTypeGraphicArts0A,
kATAPIDevTypeGraphicArts0B,
kATAPIDevTypeFirstReserved,
kATAPIDevTypeUnknownOrMissing = 0x1F,
kATAPIDevTypeMask = 0x1F,
};
enum ATAPICmds
{
kATAPICmdChangeDefinition = 0x40,
kATAPICmdCompare = 0x39,
kATAPICmdCopy = 0x18,
kATAPICmdCopyAndVerify = 0x3a,
kATAPICmdInquiry = 0x12,
kATAPICmdLogSelect = 0x4c,
kATAPICmdLogSense = 0x4d,
kATAPICmdModeSelect12 = 0x55,
kATAPICmdModeSelect6 = 0x15,
kATAPICmdModeSense12 = 0x5a,
kATAPICmdModeSense6 = 0x1a,
kATAPICmdReadBuffer = 0x3c,
kATAPICmdRecvDiagResult = 0x1c,
kATAPICmdRequestSense = 0x03,
kATAPICmdSendDiagnostic = 0x1d,
kATAPICmdTestUnitReady = 0x00,
kATAPICmdWriteBuffer = 0x3b,
kATAPICmdFormatUnit = 0x04,
kATAPICmdLockUnlockCache = 0x36,
kATAPICmdPrefetch = 0x34,
kATAPICmdPreventAllowRemoval = 0x1e,
kATAPICmdRead6 = 0x08,
kATAPICmdRead10 = 0x28,
kATAPICmdReadCapacity = 0x25,
kATAPICmdReadDefectData = 0x37,
kATAPICmdReadLong = 0x3e,
kATAPICmdReassignBlocks = 0x07,
kATAPICmdRelease = 0x17,
kATAPICmdReserve = 0x16,
kATAPICmdRezeroUnit = 0x01,
kATAPICmdSearchDataEql = 0x31,
kATAPICmdSearchDataHigh = 0x30,
kATAPICmdSearchDataLow = 0x32,
kATAPICmdSeek6 = 0x0b,
kATAPICmdSeek10 = 0x2b,
kATAPICmdSetLimits = 0x33,
kATAPICmdStartStopUnit = 0x1b,
kATAPICmdSynchronizeCache = 0x35,
kATAPICmdVerify = 0x2f,
kATAPICmdWrite6 = 0x0a,
kATAPICmdWrite10 = 0x2a,
kATAPICmdWriteAndVerify = 0x2e,
kATAPICmdWriteLong = 0x3f,
kATAPICmdWriteSame = 0x41,
kATAPICmdRewind = 0x01,
kATAPICmdWriteFilemarks = 0x10,
kATAPICmdSpace = 0x11,
kATAPICmdLoadUnload = 0x1B,
kATAPICmdReadCDTableOfContents = 0x43,
};
enum ATARegs
{
kATARegData = 0x00,
kATARegFeatures = 0x01,
kATARegSectorCount = 0x02,
kATARegSectorNumber = 0x03,
kATARegCylinderLow = 0x04,
kATARegCylinderHigh = 0x05,
kATARegDriveHead = 0x06,
kATARegCommand = 0x07,
kATARegError = 0x01,
kATARegStatus = 0x07,
kATARegDeviceControl = 0x08,
kATARegAltStatus = 0x08,
kATARegATAPIData = 0x00,
kATARegATAPIFeatures = 0x01,
kATARegATAPIIntReason = 0x02,
kATARegATAPIByteCountLow = 0x04,
kATARegATAPIByteCountHigh = 0x05,
kATARegATAPIDeviceSelect = 0x06,
kATARegATAPICommand = 0x07,
kATARegATAPIError = 0x01,
kATARegATAPIStatus = 0x07,
kATARegATAPIDeviceControl = 0x08,
kATARegATAPIAlternateStatus = 0x08,
kMaxATARegs = 12,
};
enum ATASectorCountQDMA
{
kATATagBit = 0x08,
};
enum ATAPIIntReason
{
kATAPIIntReasonCD = 0x01,
kATAPIIntReasonIO = 0x02,
kATAPIIntReasonREL = 0x04,
kATAPIIntReasonTagBit = 0x08,
kATAPIIntReasonTagMask = 0xf8,
};
enum ATACommand
{
kATAModeCHS = 0xa0,
kATAModeLBA = 0xe0,
kATACommandSetFeatures = 0xef,
kATACommandIdentify = 0xec,
kATACommandReadSector = 0x20,
kATACommandService = 0xa2,
kATACommandATAPIReset = 0x08,
kATACommandATAPIPacket = 0xa0,
kATACommandATAPIIdentify = 0xa1,
};
enum ATAFeatures
{
kATAFeatureTransferMode = 0x03,
kATATransferModePIODefault = 0x00, kATATransferModePIOwFC = 0x08,
kATATransferModeDMA = 0x20,
kATATransferModeUltraDMA33 = 0x40,
kATATransferModeMask = 0x07,
};
enum ATAStatus
{
kATAStatusERR = 0x01,
kATAStatusIDX = 0x02,
kATAStatusECC = 0x04,
kATAStatusDRQ = 0x08,
kATAStatusSC = 0x10,
kATAStatusDF = 0x20,
kATAStatusDRDY = 0x40,
kATAStatusBSY = 0x80,
kATAStatusSERV = 0x10,
kATAStatusREL = 0x20,
kATAPIStatusCHK = 0x01,
kATAPIStatusDRQ = 0x08,
kATAPIStatusSERV = 0x10,
kATAPIStatusDMRD = 0x20,
kATAPIStatusDRDY = 0x40,
kATAPIStatusBSY = 0x80,
};
enum ATAError
{
kATAErrorNM = 0x02,
kATAErrorABRT = 0x04,
kATAErrorMCR = 0x08,
kATAErrorIDNF = 0x10,
kATAErrorMC = 0x20,
kATAErrorWP = 0x40,
kATAPIErrorILI = 0x01,
kATAPIErrorEOM = 0x02,
kATAPIErrorABRT = 0x04,
kATAPIErrorSenseKeyBit = 0x10,
kATAPIErrorSenseKeyMask = 0xf0,
};
enum ATADeviceControl
{
kATADevControlnIEN = 0x02,
kATADevControlSRST = 0x04,
};
enum ATASignatures
{
kATASignatureSectorCount = 0x01,
kATASignatureSectorNumber = 0x01,
kATASignatureCylinderLow = 0x00,
kATASignatureCylinderHigh = 0x00,
kATAPISignatureCylinderLow = 0x14,
kATAPISignatureCylinderHigh = 0xeb,
};
#endif