diff --git a/ATA.cs b/ATA.cs new file mode 100644 index 000000000..12d7cbc30 --- /dev/null +++ b/ATA.cs @@ -0,0 +1,1855 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ATA.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Component +// +// Revision : $Revision$ +// Last change by : $Author$ +// Date : $Date$ +// +// --[ Description ] ---------------------------------------------------------- +// +// Description +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright (C) 2011-2015 Claunia.com +// ****************************************************************************/ +// //$Id$ +using System; +using System.Runtime.InteropServices; + +namespace DiscImageChef.Decoders +{ + /// + /// Information from following standards: + /// T10-791D rev. 4c (ATA) + /// T10-948D rev. 4c (ATA-2) + /// T13-1153D rev. 18 (ATA/ATAPI-4) + /// T13-1321D rev. 3 (ATA/ATAPI-5) + /// T13-1410D rev. 3b (ATA/ATAPI-6) + /// T13-1532D rev. 4b (ATA/ATAPI-7) + /// T13-1699D rev. 3f (ATA8-ACS) + /// T13-1699D rev. 4a (ATA8-ACS) + /// T13-2015D rev. 2 (ACS-2) + /// T13-2161D rev. 5 (ACS-3) + /// CF+ & CF Specification rev. 1.4 (CFA) + /// + public static class ATA + { + [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=2)] + public struct IdentifyDevice + { + /// + /// Word 0 + /// General device configuration + /// On ATAPI devices: + /// Bits 12 to 8 indicate device type as SCSI defined + /// Bits 6 to 5: + /// 0 = Device shall set DRQ within 3 ms of receiving PACKET + /// 1 = Device shall assert INTRQ when DRQ is set to one + /// 2 = Device shall set DRQ within 50 µs of receiving PACKET + /// Bits 1 to 0: + /// 0 = 12 byte command packet + /// 1 = 16 byte command packet + /// CompactFlash is 0x848A (non magnetic, removable, not MFM, hardsector, and UltraFAST) + /// + public GeneralConfigurationBit GeneralConfiguration; + /// + /// Word 1 + /// Cylinders in default translation mode + /// Obsoleted in ATA/ATAPI-6 + /// + public ushort Cylinders; + /// + /// Word 2 + /// Specific configuration + /// + public SpecificConfigurationEnum SpecificConfiguration; + /// + /// Word 3 + /// Heads in default translation mode + /// Obsoleted in ATA/ATAPI-6 + /// + public ushort Heads; + /// + /// Word 4 + /// Unformatted bytes per track in default translation mode + /// Obsoleted in ATA-2 + /// + public ushort UnformattedBPT; + /// + /// Word 5 + /// Unformatted bytes per sector in default translation mode + /// Obsoleted in ATA-2 + /// + public ushort UnformattedBPS; + /// + /// Word 6 + /// Sectors per track in default translation mode + /// Obsoleted in ATA/ATAPI-6 + /// + public ushort SectorsPerTrack; + /// + /// Words 7 to 8 + /// CFA: Number of sectors per card + /// + public uint SectorsPerCard; + /// + /// Word 9 + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + public ushort VendorWord9; + /// + /// Words 10 to 19 + /// Device serial number, right justified, padded with spaces + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=20)] + public string SerialNumber; + /// + /// Word 20 + /// Manufacturer defined + /// Obsoleted in ATA-2 + /// 0x0001 = single ported single sector buffer + /// 0x0002 = dual ported multi sector buffer + /// 0x0003 = dual ported multi sector buffer with reading + /// + public ushort BufferType; + /// + /// Word 21 + /// Size of buffer in 512 byte increments + /// Obsoleted in ATA-2 + /// + public ushort BufferSize; + /// + /// Word 22 + /// Bytes of ECC available in READ/WRITE LONG commands + /// Obsoleted in ATA/ATAPI-4 + /// + public ushort EccBytes; + /// + /// Words 23 to 26 + /// Firmware revision, left justified, padded with spaces + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)] + public string FirmwareRevision; + /// + /// Words 27 to 46 + /// Model number, left justified, padded with spaces + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=40)] + public string Model; + /// + /// Word 47 bits 7 to 0 + /// Maximum number of sectors that can be transferred per + /// interrupt on read and write multiple commands + /// + public byte MultipleMaxSectors; + /// + /// Word 47 bits 15 to 8 + /// Vendor unique + /// ATA/ATAPI-4 says it must be 0x80 + /// + public byte VendorWord47; + /// + /// Word 48 + /// ATA-1: Set to 1 if it can perform doubleword I/O + /// ATA-2 to ATA/ATAPI-7: Reserved + /// ATA8-ACS: Trusted Computing feature set + /// + public TrustedComputingBit TrustedComputing; + /// + /// Word 49 + /// Capabilities + /// + public CapabilitiesBit Capabilities; + /// + /// Word 50 + /// Capabilities + /// + public CapabilitiesBit2 Capabilities2; + /// + /// Word 51 bits 7 to 0 + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + public byte VendorWord51; + /// + /// Word 51 bits 15 to 8 + /// Transfer timing mode in PIO + /// Obsoleted in ATA/ATAPI-4 + /// + public byte PIOTransferTimingMode; + /// + /// Word 52 bits 7 to 0 + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + public byte VendorWord52; + /// + /// Word 52 bits 15 to 8 + /// Transfer timing mode in DMA + /// Obsoleted in ATA/ATAPI-4 + /// + public byte DMATransferTimingMode; + /// + /// Word 53 bits 7 to 0 + /// Reports if words 54 to 58 are valid + /// + public ExtendedIdentifyBit ExtendedIdentify; + /// + /// Word 53 bits 15 to 8 + /// Free-fall Control Sensitivity + /// + public byte FreeFallSensitivity; + /// + /// Word 54 + /// Cylinders in current translation mode + /// Obsoleted in ATA/ATAPI-6 + /// + public ushort CurrentCylinders; + /// + /// Word 55 + /// Heads in current translation mode + /// Obsoleted in ATA/ATAPI-6 + /// + public ushort CurrentHeads; + /// + /// Word 56 + /// Sectors per track in current translation mode + /// Obsoleted in ATA/ATAPI-6 + /// + public ushort CurrentSectorsPerTrack; + /// + /// Words 57 to 58 + /// Total sectors currently user-addressable + /// Obsoleted in ATA/ATAPI-6 + /// + public uint CurrentSectors; + /// + /// Word 59 bits 7 to 0 + /// Number of sectors currently set to transfer on a READ/WRITE MULTIPLE command + /// + public byte MultipleSectorNumber; + /// + /// Word 59 bits 15 to 8 + /// Indicates if is valid + /// + public CapabilitiesBit3 CapabilitiesBit3; + /// + /// Words 60 to 61 + /// If drive supports LBA, how many sectors are addressable using LBA + /// + public uint LBASectors; + /// + /// Word 62 bits 7 to 0 + /// Single word DMA modes available + /// Obsoleted in ATA/ATAPI-4 + /// In ATAPI it's not obsolete, indicates UDMA mode (UDMA7 is instead MDMA0) + /// + public TransferMode DMASupported; + /// + /// Word 62 bits 15 to 8 + /// Single word DMA mode currently active + /// Obsoleted in ATA/ATAPI-4 + /// In ATAPI it's not obsolete, bits 0 and 1 indicate MDMA mode+1, + /// bit 10 indicates DMA is supported and bit 15 indicates DMADIR bit + /// in PACKET is required for DMA transfers + /// + public TransferMode DMAActive; + /// + /// Word 63 bits 7 to 0 + /// Multiword DMA modes available + /// + public TransferMode MDMASupported; + /// + /// Word 63 bits 15 to 8 + /// Multiword DMA mode currently active + /// + public TransferMode MDMAActive; + + /// + /// Word 64 bits 7 to 0 + /// Supported Advanced PIO transfer modes + /// + public TransferMode APIOSupported; + /// + /// Word 64 bits 15 to 8 + /// Reserved + /// + public byte ReservedWord64; + /// + /// Word 65 + /// Minimum MDMA transfer cycle time per word in nanoseconds + /// + public ushort MinMDMACycleTime; + /// + /// Word 66 + /// Recommended MDMA transfer cycle time per word in nanoseconds + /// + public ushort RecMDMACycleTime; + /// + /// Word 67 + /// Minimum PIO transfer cycle time without flow control in nanoseconds + /// + public ushort MinPIOCycleTimeNoFlow; + /// + /// Word 68 + /// Minimum PIO transfer cycle time with IORDY flow control in nanoseconds + /// + public ushort MinPIOCycleTimeFlow; + + /// + /// Word 69 + /// Additional supported + /// + public CommandSetBit5 CommandSet5; + /// + /// Word 70 + /// Reserved + /// + public ushort ReservedWord70; + /// + /// Word 71 + /// ATAPI: Typical time in ns from receipt of PACKET to release bus + /// + public ushort PacketBusRelease; + /// + /// Word 72 + /// ATAPI: Typical time in ns from receipt of SERVICE to clear BSY + /// + public ushort ServiceBusyClear; + /// + /// Word 73 + /// Reserved + /// + public ushort ReservedWord73; + /// + /// Word 74 + /// Reserved + /// + public ushort ReservedWord74; + + /// + /// Word 75 + /// Maximum Queue depth + /// + public ushort MaxQueueDepth; + + /// + /// Word 76 + /// Serial ATA Capabilities + /// + public SATACapabilitiesBit SATACapabilities; + /// + /// Word 77 + /// Serial ATA Additional Capabilities + /// + public SATACapabilitiesBit2 SATACapabilities2; + + /// + /// Word 78 + /// Supported Serial ATA features + /// + public SATAFeaturesBit SATAFeatures; + /// + /// Word 79 + /// Enabled Serial ATA features + /// + public SATAFeaturesBit EnabledSATAFeatures; + + /// + /// Word 80 + /// Major version of ATA/ATAPI standard supported + /// + public MajorVersionBit MajorVersion; + /// + /// Word 81 + /// Minimum version of ATA/ATAPI standard supported + /// + public ushort MinorVersion; + + /// + /// Word 82 + /// Supported command/feature sets + /// + public CommandSetBit CommandSet; + /// + /// Word 83 + /// Supported command/feature sets + /// + public CommandSetBit2 CommandSet2; + /// + /// Word 84 + /// Supported command/feature sets + /// + public CommandSetBit3 CommandSet3; + + /// + /// Word 85 + /// Enabled command/feature sets + /// + public CommandSetBit EnabledCommandSet; + /// + /// Word 86 + /// Enabled command/feature sets + /// + public CommandSetBit2 EnabledCommandSet2; + /// + /// Word 87 + /// Enabled command/feature sets + /// + public CommandSetBit3 EnabledCommandSet3; + + /// + /// Word 88 bits 7 to 0 + /// Supported Ultra DMA transfer modes + /// + public TransferMode UDMASupported; + /// + /// Word 88 bits 15 to 8 + /// Selected Ultra DMA transfer modes + /// + public TransferMode UDMASelected; + + /// + /// Word 89 + /// Time required for security erase completion + /// + public ushort SecurityEraseTime; + /// + /// Word 90 + /// Time required for enhanced security erase completion + /// + public ushort EnhancedSecurityEraseTime; + /// + /// Word 91 + /// Current advanced power management value + /// + public ushort CurrentAPM; + + /// + /// Word 92 + /// Master password revision code + /// + public ushort MasterPasswordRevisionCode; + /// + /// Word 93 + /// Hardware reset result + /// + public ushort HardwareResetResult; + + /// + /// Word 94 bits 7 to 0 + /// Current AAM value + /// + public byte CurrentAAM; + /// + /// Word 94 bits 15 to 8 + /// Vendor's recommended AAM value + /// + public byte RecommendedAAM; + + /// + /// Word 95 + /// Stream minimum request size + /// + public ushort StreamMinReqSize; + /// + /// Word 96 + /// Streaming transfer time in DMA + /// + public ushort StreamTransferTimeDma; + /// + /// Word 97 + /// Streaming access latency in DMA and PIO + /// + public ushort StreamAccessLatency; + /// + /// Words 98 to 99 + /// Streaming performance granularity + /// + public uint StreamPerformanceGranularity; + + /// + /// Words 100 to 103 + /// 48-bit LBA addressable sectors + /// + public ulong MaxLBA48; + + /// + /// Word 104 + /// Streaming transfer time in PIO + /// + public ushort StreamTransferTimePio; + + /// + /// Word 105 + /// Maximum number of 512-byte block per DATA SET MANAGEMENT command + /// + public ushort DataSetMgmtSize; + + /// + /// Word 106 + /// Bit 15 should be zero + /// Bit 14 should be one + /// Bit 13 set indicates device has multiple logical sectors per physical sector + /// Bit 12 set indicates logical sector has more than 256 words (512 bytes) + /// Bits 11 to 4 are reserved + /// Bits 3 to 0 indicate power of two of logical sectors per physical sector + /// + public ushort PhysLogSectorSize; + + /// + /// Word 107 + /// Interseek delay for ISO-7779 acoustic testing, in microseconds + /// + public ushort InterseekDelay; + + /// + /// Words 108 to 111 + /// World Wide Name + /// + public ulong WWN; + + /// + /// Words 112 to 115 + /// Reserved for WWN extension to 128 bit + /// + public ulong WWNExtension; + + /// + /// Word 116 + /// Reserved for technical report + /// + public ushort ReservedWord116; + + /// + /// Words 117 to 118 + /// Words per logical sector + /// + public uint LogicalSectorWords; + + /// + /// Word 119 + /// Supported command/feature sets + /// + public CommandSetBit4 CommandSet4; + /// + /// Word 120 + /// Supported command/feature sets + /// + public CommandSetBit4 EnabledCommandSet4; + + /// + /// Words 121 to 125 + /// Reserved + /// + [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)] + public ushort[] ReservedWords121; + + /// + /// Word 126 + /// ATAPI byte count limit + /// + public ushort ATAPIByteCount; + + /// + /// Word 127 + /// Removable Media Status Notification feature set support + /// Bits 15 to 2 are reserved + /// Bits 1 to 0 must be 0 for not supported or 1 for supported. 2 and 3 are reserved. + /// Obsoleted in ATA8-ACS + /// + public ushort RemovableStatusSet; + + /// + /// Word 128 + /// Security status + /// + public SecurityStatusBit SecurityStatus; + + /// + /// Words 129 to 159 + /// + [MarshalAs(UnmanagedType.ByValArray, SizeConst=31)] + public ushort[] ReservedWords129; + + /// + /// Word 160 + /// CFA power mode + /// Bit 15 must be set + /// Bit 13 indicates mode 1 is required for one or more commands + /// Bit 12 indicates mode 1 is disabled + /// Bits 11 to 0 indicates maximum current in mA + /// + public ushort CFAPowerMode; + + /// + /// Words 161 to 167 + /// Reserved for CFA + /// + [MarshalAs(UnmanagedType.ByValArray, SizeConst=7)] + public ushort[] ReservedCFA; + + /// + /// Word 168 + /// Bits 15 to 4, reserved + /// Bits 3 to 0, device nominal form factor + /// + public DeviceFormFactorEnum DeviceFormFactor; + /// + /// Word 169 + /// DATA SET MANAGEMENT support + /// + public DataSetMgmtBit DataSetMgmt; + /// + /// Words 170 to 173 + /// Additional product identifier + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)] + public string AdditionalPID; + + /// + /// Word 174 + /// Reserved + /// + public ushort ReservedWord174; + /// + /// Word 175 + /// Reserved + /// + public ushort ReservedWord175; + + /// + /// Words 176 to 195 + /// Current media serial number + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=40)] + public string MediaSerial; + /// + /// Words 196 to 205 + /// Current media manufacturer + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=20)] + public string MediaManufacturer; + + /// + /// Word 206 + /// SCT Command Transport features + /// + public SCTCommandTransportBit SCTCommandTransport; + + /// + /// Word 207 + /// Reserved for CE-ATA + /// + public ushort ReservedCEATAWord207; + /// + /// Word 208 + /// Reserved for CE-ATA + /// + public ushort ReservedCEATAWord208; + + /// + /// Word 209 + /// Alignment of logical block within a larger physical block + /// Bit 15 shall be cleared to zero + /// Bit 14 shall be set to one + /// Bits 13 to 0 indicate logical sector offset within the first physical sector + /// + public ushort LogicalAlignment; + + /// + /// Words 210 to 211 + /// Write/Read/Verify sector count mode 3 only + /// + public uint WRVSectorCountMode3; + /// + /// Words 212 to 213 + /// Write/Read/Verify sector count mode 2 only + /// + public uint WRVSectorCountMode2; + + /// + /// Word 214 + /// NV Cache capabilities + /// Bits 15 to 12 feature set version + /// Bits 11 to 18 power mode feature set version + /// Bits 7 to 5 reserved + /// Bit 4 feature set enabled + /// Bits 3 to 2 reserved + /// Bit 1 power mode feature set enabled + /// Bit 0 power mode feature set supported + /// + public ushort NVCacheCaps; + /// + /// Words 215 to 216 + /// NV Cache Size in Logical BLocks + /// + public uint NVCacheSize; + /// + /// Word 217 + /// Nominal media rotation rate + /// In ACS-1 meant NV Cache read speed in MB/s + /// + public ushort NominalRotationRate; + /// + /// Word 218 + /// NV Cache write speed in MB/s + /// Reserved since ACS-2 + /// + public ushort NVCacheWriteSpeed; + /// + /// Word 219 bits 7 to 0 + /// Estimated device spin up in seconds + /// + public byte NVEstimatedSpinUp; + /// + /// Word 219 bits 15 to 8 + /// NV Cache reserved + /// + public byte NVReserved; + + /// + /// Word 220 bits 7 to 0 + /// Write/Read/Verify feature set current mode + /// + public byte WRVMode; + /// + /// Word 220 bits 15 to 8 + /// Reserved + /// + public byte WRVReserved; + + /// + /// Word 221 + /// Reserved + /// + public ushort ReservedWord221; + + /// + /// Word 222 + /// Transport major revision number + /// Bits 15 to 12 indicate transport type. 0 parallel, 1 serial, 0xE PCIe. + /// Bits 11 to 0 indicate revision + /// + public ushort TransportMajorVersion; + /// + /// Word 223 + /// Transport minor revision number + /// + public ushort TransportMinorVersion; + + /// + /// Words 224 to 233 + /// Reserved for CE-ATA + /// + [MarshalAs(UnmanagedType.ByValArray, SizeConst=10)] + public ushort[] ReservedCEATA224; + + /// + /// Word 234 + /// Minimum number of 512 byte units per DOWNLOAD MICROCODE mode 3 + /// + public ushort MinDownloadMicroMode3; + /// + /// Word 235 + /// Maximum number of 512 byte units per DOWNLOAD MICROCODE mode 3 + /// + public ushort MaxDownloadMicroMode3; + + /// + /// Words 236 to 254 + /// + [MarshalAs(UnmanagedType.ByValArray, SizeConst=19)] + public ushort[] ReservedWords; + + /// + /// Word 255 bits 7 to 0 + /// Should be 0xA5 + /// + public byte Signature; + /// + /// Word 255 bits 15 to 8 + /// Checksum + /// + public byte Checksum; + } + + /// + /// General configuration flag bits. + /// + [Flags] + public enum GeneralConfigurationBit : ushort + { + /// + /// Set on ATAPI + /// + NonMagnetic = 0x8000, + /// + /// Format speed tolerance gap is required + /// Obsoleted in ATA-2 + /// + FormatGapReq = 0x4000, + /// + /// Track offset option is available + /// Obsoleted in ATA-2 + /// + TrackOffset = 0x2000, + /// + /// Data strobe offset option is available + /// Obsoleted in ATA-2 + /// + DataStrobeOffset = 0x1000, + /// + /// Rotational speed tolerance is higher than 0,5% + /// Obsoleted in ATA-2 + /// + RotationalSpeedTolerance = 0x0800, + /// + /// Disk transfer rate is > 10 Mb/s + /// Obsoleted in ATA-2 + /// + UltraFastIDE = 0x0400, + /// + /// Disk transfer rate is > 5 Mb/s but <= 10 Mb/s + /// Obsoleted in ATA-2 + /// + FastIDE = 0x0200, + /// + /// Disk transfer rate is <) 5 Mb/s + /// Obsoleted in ATA-2 + /// + SlowIDE = 0x0100, + /// + /// Drive uses removable media + /// + Removable = 0x0080, + /// + /// Drive is fixed + /// Obsoleted in ATA/ATAPI-6 + /// + Fixed = 0x0040, + /// + /// Spindle motor control is implemented + /// Obsoleted in ATA-2 + /// + SpindleControl = 0x0020, + /// + /// Head switch time is bigger than 15 µsec. + /// Obsoleted in ATA-2 + /// + HighHeadSwitch = 0x0010, + /// + /// Drive is not MFM encoded + /// Obsoleted in ATA-2 + /// + NotMFM = 0x0008, + /// + /// Drive is soft sectored + /// Obsoleted in ATA-2 + /// + SoftSector = 0x0004, + /// + /// Response incomplete + /// Since ATA/ATAPI-5 + /// + IncompleteResponse = 0x0004, + /// + /// Drive is hard sectored + /// Obsoleted in ATA-2 + /// + HardSector = 0x0002, + /// + /// Reserved + /// + Reserved = 0x0001 + } + + /// + /// Capabilities flag bits. + /// + [Flags] + public enum CapabilitiesBit : ushort + { + /// + /// ATAPI: Interleaved DMA supported + /// + InterleavedDMA = 0x8000, + /// + /// ATAPI: Command queueing supported + /// + CommandQueue = 0x4000, + /// + /// Standby timer values are standard + /// + StandardStanbyTimer = 0x2000, + /// + /// ATAPI: Overlap operation supported + /// + OverlapOperation = 0x2000, + /// + /// ATAPI: ATA software reset required + /// Obsoleted in ATA/ATAPI-4 + /// + RequiresATASoftReset = 0x1000, + /// + /// IORDY is supported + /// + IORDY = 0x0800, + /// + /// IORDY can be disabled + /// + CanDisableIORDY = 0x0400, + /// + /// LBA is supported + /// + LBASupport = 0x0200, + /// + /// DMA is supported + /// + DMASupport = 0x0100, + /// + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + VendorBit7 = 0x0080, + /// + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + VendorBit6 = 0x0040, + /// + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + VendorBit5 = 0x0020, + /// + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + VendorBit4 = 0x0010, + /// + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + VendorBit3 = 0x0008, + /// + /// Vendor unique + /// Obsoleted in ATA/ATAPI-4 + /// + VendorBit2 = 0x0004, + /// + /// Long Physical Alignment setting bit 1 + /// + PhysicalAlignment1 = 0x0002, + /// + /// Long Physical Alignment setting bit 0 + /// + PhysicalAlignment0 = 0x0001 + } + + /// + /// Extended identify flag bits. + /// + [Flags] + public enum ExtendedIdentifyBit : byte + { + /// + /// Reserved + /// + Reserved07 = 0x80, + /// + /// Reserved + /// + Reserved06 = 0x40, + /// + /// Reserved + /// + Reserved05 = 0x20, + /// + /// Reserved + /// + Reserved04 = 0x10, + /// + /// Reserved + /// + Reserved03 = 0x08, + /// + /// Identify word 88 is valid + /// + Word88Valud = 0x04, + /// + /// Identify words 64 to 70 are valid + /// + Words64to70Valid = 0x02, + /// + /// Identify words 54 to 58 are valid + /// + Words54to58Valid = 0x01 + } + + /// + /// More capabilities flag bits. + /// + [Flags] + public enum CapabilitiesBit2 : ushort + { + /// + /// MUST NOT be set + /// + MustBeCleared = 0x8000, + /// + /// MUST be set + /// + MustBeSet = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + Reserved08 = 0x0100, + Reserved07 = 0x0080, + Reserved06 = 0x0040, + Reserved05 = 0x0020, + Reserved04 = 0x0010, + Reserved03 = 0x0008, + Reserved02 = 0x0004, + Reserved01 = 0x0002, + /// + /// Indicates a device specific minimum standby timer value + /// + SpecificStandbyTimer = 0x0001, + } + + [Flags] + public enum TransferMode : byte + { + Mode7 = 0x80, + Mode6 = 0x40, + Mode5 = 0x20, + Mode4 = 0x10, + Mode3 = 0x08, + Mode2 = 0x04, + Mode1 = 0x02, + Mode0 = 0x01 + } + + /// + /// More capabilities flag bits. + /// + [Flags] + public enum CommandSetBit : ushort + { + /// + /// Already obsolete in ATA/ATAPI-4, may be from ATA-3? + /// + Obsolete15 = 0x8000, + /// + /// NOP is supported + /// + Nop = 0x4000, + /// + /// READ BUFFER is supported + /// + ReadBuffer = 0x2000, + /// + /// WRITE BUFFER is supported + /// + WriteBuffer = 0x1000, + /// + /// Already obsolete in ATA/ATAPI-4, may be from ATA-3? + /// + Obsolete11 = 0x0800, + /// + /// Host Protected Area is supported + /// + HPA = 0x0400, + /// + /// DEVICE RESET is supported + /// + DeviceReset = 0x0200, + /// + /// SERVICE interrupt is supported + /// + Service = 0x0100, + /// + /// Release is supported + /// + Release = 0x0080, + /// + /// Look-ahead is supported + /// + LookAhead = 0x0040, + /// + /// Write cache is supported + /// + WriteCache = 0x0020, + /// + /// PACKET command set is supported + /// + Packet = 0x0010, + /// + /// Power Management feature set is supported + /// + PowerManagement = 0x0008, + /// + /// Removable Media feature set is supported + /// + RemovableMedia = 0x0004, + /// + /// Security Mode feature set is supported + /// + SecurityMode = 0x0002, + /// + /// SMART feature set is supported + /// + SMART = 0x0001, + } + + /// + /// More capabilities flag bits. + /// + [Flags] + public enum CommandSetBit2 : ushort + { + /// + /// MUST NOT be set + /// + MustBeClear = 0x8000, + /// + /// MUST BE SET + /// + MustBeSet = 0x4000, + /// + /// FLUSH CACHE EXT supported + /// + FlushCacheExt = 0x2000, + /// + /// FLUSH CACHE supported + /// + FlushCache = 0x1000, + /// + /// Device Configuration Overlay feature set supported + /// + DCO = 0x0800, + /// + /// 48-bit LBA supported + /// + LBA48 = 0x0400, + /// + /// Automatic Acoustic Management supported + /// + AAM = 0x0200, + /// + /// SET MAX security extension supported + /// + SetMax = 0x0100, + /// + /// Address Offset Reserved Area Boot NCITS TR27:2001 + /// + AddressOffsetReservedAreaBoot = 0x0080, + /// + /// SET FEATURES required to spin-up + /// + SetFeaturesRequired = 0x0040, + /// + /// Power-Up in standby feature set supported + /// + PowerUpInStandby = 0x0020, + /// + /// Removable Media Status Notification feature set is supported + /// + RemovableNotification = 0x0010, + /// + /// Advanced Power Management feature set is supported + /// + APM = 0x0008, + /// + /// Compact Flash feature set is supported + /// + CompactFlash = 0x0004, + /// + /// READ DMA QUEUED and WRITE DMA QUEUED are supported + /// + RWQueuedDMA = 0x0002, + /// + /// DOWNLOAD MICROCODE is supported + /// + DownloadMicrocode = 0x0001, + } + + /// + /// More capabilities flag bits. + /// + [Flags] + public enum CommandSetBit3 : ushort + { + /// + /// MUST NOT be set + /// + MustBeClear = 0x8000, + /// + /// MUST BE SET + /// + MustBeSet = 0x4000, + /// + /// IDLE IMMEDIATE with UNLOAD FEATURE is supported + /// + IdleImmediate = 0x2000, + /// + /// Reserved for INCITS TR-37/2004 + /// + Reserved12 = 0x1000, + /// + /// Reserved for INCITS TR-37/2004 + /// + Reserved11 = 0x0800, + /// + /// URG bit is supported in WRITE STREAM DMA EXT and WRITE STREAM EXT + /// + WriteURG = 0x0400, + /// + /// URG bit is supported in READ STREAM DMA EXT and READ STREAM EXT + /// + ReadURG = 0x0200, + /// + /// 64-bit World Wide Name is supported + /// + WWN = 0x0100, + /// + /// WRITE DMA QUEUED FUA EXT is supported + /// + FUAWriteQ = 0x0080, + /// + /// WRITE DMA FUA EXT and WRITE MULTIPLE FUA EXT are supported + /// + FUAWrite = 0x0040, + /// + /// General Purpose Logging feature supported + /// + GPL = 0x0020, + /// + /// Sstreaming feature set is supported + /// + Streaming = 0x0010, + /// + /// Media Card Pass Through command set supported + /// + MCPT = 0x0008, + /// + /// Media serial number supported + /// + MediaSerial = 0x0004, + /// + /// SMART self-test supported + /// + SMARTSelfTest = 0x0002, + /// + /// SMART error logging supported + /// + SMARTLog = 0x0001, + } + + /// + /// More capabilities flag bits. + /// + [Flags] + public enum SecurityStatusBit : ushort + { + Reserved15 = 0x8000, + Reserved14 = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + /// + /// Maximum security level + /// + Maximum = 0x0100, + Reserved07 = 0x0080, + Reserved06 = 0x0040, + /// + /// Supports enhanced security erase + /// + Enhanced = 0x0020, + /// + /// Security count expired + /// + Expired = 0x0010, + /// + /// Security frozen + /// + Frozen = 0x0008, + /// + /// Security locked + /// + Locked = 0x0004, + /// + /// Security enabled + /// + Enabled = 0x0002, + /// + /// Security supported + /// + Supported = 0x0001, + } + + /// + /// Word 80 + /// Major version + /// + [Flags] + public enum MajorVersionBit : ushort + { + Reserved15 = 0x8000, + Reserved14 = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + /// + /// ACS-4 + /// + ACS4 = 0x0800, + /// + /// ACS-3 + /// + ACS3 = 0x0400, + /// + /// ACS-2 + /// + ACS2 = 0x0200, + /// + /// ATA8-ACS + /// + Ata8ACS = 0x0100, + /// + /// ATA/ATAPI-7 + /// + AtaAtapi7 = 0x0080, + /// + /// ATA/ATAPI-6 + /// + AtaAtapi6 = 0x0040, + /// + /// ATA/ATAPI-5 + /// + AtaAtapi5 = 0x0020, + /// + /// ATA/ATAPI-4 + /// + AtaAtapi4 = 0x0010, + /// + /// ATA-3 + /// + Ata3 = 0x0008, + /// + /// ATA-2 + /// + Ata2 = 0x0004, + /// + /// ATA-1 + /// + Ata1 = 0x0002, + Reserved00 = 0x0001, + } + + public enum SpecificConfigurationEnum : ushort + { + /// + /// Device requires SET FEATURES to spin up and + /// IDENTIFY DEVICE response is incomplete + /// + RequiresSetIncompleteResponse = 0x37C8, + /// + /// Device requires SET FEATURES to spin up and + /// IDENTIFY DEVICE response is complete + /// + RequiresSetCompleteResponse = 0x738C, + /// + /// Device does not requires SET FEATURES to spin up and + /// IDENTIFY DEVICE response is incomplete + /// + NotRequiresSetIncompleteResponse = 0x8C73, + /// + /// Device does not requires SET FEATURES to spin up and + /// IDENTIFY DEVICE response is complete + /// + NotRequiresSetCompleteResponse = 0xC837 + } + + [Flags] + public enum TrustedComputingBit : ushort + { + /// + /// MUST NOT be set + /// + Clear = 0x8000, + /// + /// MUST be set + /// + Set = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + Reserved08 = 0x0100, + Reserved07 = 0x0080, + Reserved06 = 0x0040, + Reserved05 = 0x0020, + Reserved04 = 0x0010, + Reserved03 = 0x0008, + Reserved02 = 0x0004, + Reserved01 = 0x0002, + /// + /// Trusted Computing feature set is supported + /// + TrustedComputing = 0x0001, + } + + /// + /// More capabilities flag bits. + /// + [Flags] + public enum CommandSetBit4 : ushort + { + /// + /// MUST NOT be set + /// + Clear = 0x8000, + /// + /// MUST be set + /// + Set = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + /// + /// DSN feature set is supported + /// + DSN = 0x0200, + /// + /// Accessible Max Address Configuration is supported + /// + AMAC = 0x0100, + /// + /// Extended Power Conditions is supported + /// + ExtPowerCond = 0x0080, + /// + /// Extended Status Reporting is supported + /// + ExtStatusReport = 0x0040, + /// + /// Free-fall Control feature set is supported + /// + FreeFallControl = 0x0020, + /// + /// Supports segmented feature in DOWNLOAD MICROCODE + /// + SegmentedDownloadMicrocode = 0x0010, + /// + /// READ/WRITE DMA EXT GPL are supported + /// + RWDmaExtGpl = 0x0008, + /// + /// WRITE UNCORRECTABLE is supported + /// + WriteUnc = 0x0004, + /// + /// Write/Read/Verify is supported + /// + WRV = 0x0002, + /// + /// Reserved for DT1825 + /// + DT1825 = 0x0001, + } + + [Flags] + public enum SCTCommandTransportBit : ushort + { + Vendor15 = 0x8000, + Vendor14 = 0x4000, + Vendor13 = 0x2000, + Vendor12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + Reserved08 = 0x0100, + Reserved07 = 0x0080, + Reserved06 = 0x0040, + /// + /// SCT Command Transport Data Tables supported + /// + DataTables = 0x0020, + /// + /// SCT Command Transport Features Control supported + /// + FeaturesControl = 0x0010, + /// + /// SCT Command Transport Error Recovery Control supported + /// + ErrorRecoveryControl = 0x0008, + /// + /// SCT Command Transport Write Same supported + /// + WriteSame = 0x0004, + /// + /// SCT Command Transport Long Sector Address supported + /// + LongSectorAccess = 0x0002, + /// + /// SCT Command Transport supported + /// + Supported = 0x0001, + } + + [Flags] + public enum SATACapabilitiesBit : ushort + { + /// + /// Supports READ LOG DMA EXT + /// + ReadLogDMAExt = 0x8000, + /// + /// Supports device automatic partial to slumber transitions + /// + DevSlumbTrans = 0x4000, + /// + /// Supports host automatic partial to slumber transitions + /// + HostSlumbTrans = 0x2000, + /// + /// Supports NCQ priroty + /// + NCQPriority = 0x1000, + /// + /// Supports unload while NCQ commands are outstanding + /// + UnloadNCQ = 0x0800, + /// + /// Supports PHY Event Counters + /// + PHYEventCounter = 0x0400, + /// + /// Supports receipt of host initiated power management requests + /// + PowerReceipt = 0x0200, + /// + /// Supports NCQ + /// + NCQ = 0x0100, + Reserved07 = 0x0080, + Reserved06 = 0x0040, + Reserved05 = 0x0020, + Reserved04 = 0x0010, + /// + /// Supports SATA Gen. 3 Signaling Speed (6.0Gb/s) + /// + Gen3Speed = 0x0008, + /// + /// Supports SATA Gen. 2 Signaling Speed (3.0Gb/s) + /// + Gen2Speed = 0x0004, + /// + /// Supports SATA Gen. 1 Signaling Speed (1.5Gb/s) + /// + Gen1Speed = 0x0002, + /// + /// MUST NOT be set + /// + Clear = 0x0001, + } + + [Flags] + public enum SATAFeaturesBit : ushort + { + Reserved15 = 0x8000, + Reserved14 = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + Reserved08 = 0x0100, + /// + /// Supports NCQ autosense + /// + NCQAutoSense = 0x0080, + /// + /// Automatic Partial to Slumber transitions are enabled + /// + EnabledSlumber = 0x0080, + /// + /// Supports Software Settings Preservation + /// + SettingsPreserve = 0x0040, + /// + /// Supports hardware feature control + /// + HardwareFeatureControl = 0x0020, + /// + /// ATAPI: Asynchronous notification + /// + AsyncNotification = 0x0020, + /// + /// Supports in-order data delivery + /// + InOrderData = 0x0010, + /// + /// Supports initiating power management + /// + InitPowerMgmt = 0x0008, + /// + /// Supports DMA Setup auto-activation + /// + DMASetup = 0x0004, + /// + /// Supports non-zero buffer offsets + /// + NonZeroBufferOffset = 0x0002, + /// + /// MUST NOT be set + /// + Clear = 0x0001, + } + + [Flags] + public enum CapabilitiesBit3 : byte + { + /// + /// BLOCK ERASE EXT supported + /// + BlockErase = 0x0080, + /// + /// OVERWRITE EXT supported + /// + Overwrite = 0x0040, + /// + /// CRYPTO SCRAMBLE EXT supported + /// + CyrptoScramble = 0x0020, + /// + /// Sanitize feature set is supported + /// + Sanitize = 0x0010, + /// + /// If unset, sanitize commands are specified by ACS-2 + /// + SanitizeCommands = 0x0008, + /// + /// SANITIZE ANTIFREEZE LOCK EXT is supported + /// + SanitizeAntifreeze = 0x0004, + Reserved01 = 0x0002, + /// + /// Multiple logical sector setting is valid + /// + MultipleValid = 0x0001, + } + + [Flags] + public enum CommandSetBit5 : ushort + { + /// + /// Supports CFast Specification + /// + CFast = 0x8000, + /// + /// Deterministic read after TRIM is supported + /// + DeterministicTrim = 0x4000, + /// + /// Long physical sector alignment error reporting control is supported + /// + LongPhysSectorAligError = 0x2000, + /// + /// DEVICE CONFIGURATION IDENTIFY DMA and DEVICE CONFIGURATION SET DMA are supported + /// + DeviceConfDma = 0x1000, + /// + /// READ BUFFER DMA is supported + /// + ReadBufferDma = 0x0800, + /// + /// WRITE BUFFER DMA is supported + /// + WriteBufferDma = 0x0400, + /// + /// SET PASSWORD DMA and SET UNLOCK DMA are supported + /// + SetMaxDma = 0x0200, + /// + /// DOWNLOAD MICROCODE DMA is supported + /// + DownloadMicroCodeDma = 0x0100, + /// + /// Reserved for IEEE-1667 + /// + IEEE1667 = 0x0080, + /// + /// Optional ATA 28-bit commands are supproted + /// + Ata28 = 0x0040, + /// + /// Read zero after TRIM is supported + /// + ReadZeroTrim = 0x0020, + /// + /// Device encrypts all user data + /// + Encrypted = 0x0010, + /// + /// Extended number of user addressable sectors is supported + /// + ExtSectors = 0x0008, + /// + /// All write cache is non-volatile + /// + AllCacheNV = 0x0004, + /// + /// Zoned capabilities bit 1 + /// + ZonedBit1 = 0x0002, + /// + /// Zoned capabilities bit 0 + /// + ZonedBit0 = 0x0001, + } + + public enum DeviceFormFactorEnum : ushort + { + /// + /// Size not reported + /// + NotReported = 0, + /// + /// 5.25" + /// + FiveAndQuarter = 1, + /// + /// 3.5" + /// + ThreeAndHalf = 2, + /// + /// 2.5" + /// + TwoAndHalf = 3, + /// + /// 1.8" + /// + OnePointEight = 4, + /// + /// Less than 1.8" + /// + LessThanOnePointEight = 5 + } + + [Flags] + public enum DataSetMgmtBit : ushort + { + Reserved15 = 0x8000, + Reserved14 = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + Reserved08 = 0x0100, + Reserved07 = 0x0080, + Reserved06 = 0x0040, + Reserved05 = 0x0020, + Reserved04 = 0x0010, + Reserved03 = 0x0008, + Reserved02 = 0x0004, + Reserved01 = 0x0002, + /// + /// TRIM is suported + /// + Trim = 0x0001, + } + + [Flags] + public enum SATACapabilitiesBit2 : ushort + { + Reserved15 = 0x8000, + Reserved14 = 0x4000, + Reserved13 = 0x2000, + Reserved12 = 0x1000, + Reserved11 = 0x0800, + Reserved10 = 0x0400, + Reserved09 = 0x0200, + Reserved08 = 0x0100, + Reserved07 = 0x0080, + /// + /// Supports RECEIVE FPDMA QUEUED and SEND FPDMA QUEUED + /// + FPDMAQ = 0x0040, + /// + /// Supports NCQ Queue Management + /// + NCQMgmt = 0x0020, + /// + /// ATAPI: Supports host environment detect + /// + HostEnvDetect = 0x0020, + /// + /// Supports NQC streaming + /// + NCQStream = 0x0010, + /// + /// ATAPI: Supports device attention on slimline connected devices + /// + DevAttSlimline = 0x0010, + /// + /// Coded value indicating current negotiated Serial ATA signal speed + /// + CurrentSpeedBit2 = 0x0008, + /// + /// Coded value indicating current negotiated Serial ATA signal speed + /// + CurrentSpeedBit1 = 0x0004, + /// + /// Coded value indicating current negotiated Serial ATA signal speed + /// + CurrentSpeedBit0 = 0x0002, + /// + /// MUST NOT be set + /// + Clear = 0x0001, + } + + public static IdentifyDevice? DecodeIdentifyDevice(byte[] IdentifyDeviceResponse) + { + if (IdentifyDeviceResponse.Length != 512) + return null; + + throw new NotImplementedException(); + } + } +} + diff --git a/ChangeLog b/ChangeLog index 63aa2caf5..eb3ba7aa9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2015-10-16 Natalia Portillo + + * ATA.cs: + * DiscImageChef.Decoders.csproj: + Added structure for ATA/ATAPI IDENTIFY [PACKET] DEVICE + response + 2015-10-13 Natalia Portillo * SCSI.cs: diff --git a/DiscImageChef.Decoders.csproj b/DiscImageChef.Decoders.csproj index cad6d951c..ec37be720 100644 --- a/DiscImageChef.Decoders.csproj +++ b/DiscImageChef.Decoders.csproj @@ -41,6 +41,7 @@ +