mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Code cleanup.
This commit is contained in:
@@ -42,14 +42,14 @@ namespace DiscImageChef.Decoders.MMC
|
||||
[SuppressMessage("ReSharper", "UnassignedField.Global")]
|
||||
public class CID
|
||||
{
|
||||
public byte Manufacturer;
|
||||
public byte DeviceType;
|
||||
public byte ApplicationID;
|
||||
public byte Manufacturer;
|
||||
public byte DeviceType;
|
||||
public byte ApplicationID;
|
||||
public string ProductName;
|
||||
public byte ProductRevision;
|
||||
public uint ProductSerialNumber;
|
||||
public byte ManufacturingDate;
|
||||
public byte CRC;
|
||||
public byte ProductRevision;
|
||||
public uint ProductSerialNumber;
|
||||
public byte ManufacturingDate;
|
||||
public byte CRC;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
@@ -81,12 +81,12 @@ namespace DiscImageChef.Decoders.MMC
|
||||
|
||||
CID cid = new CID
|
||||
{
|
||||
Manufacturer = response[0],
|
||||
DeviceType = (byte)(response[1] & 0x03),
|
||||
ProductRevision = response[9],
|
||||
Manufacturer = response[0],
|
||||
DeviceType = (byte)(response[1] & 0x03),
|
||||
ProductRevision = response[9],
|
||||
ProductSerialNumber = BitConverter.ToUInt32(response, 10),
|
||||
ManufacturingDate = response[14],
|
||||
CRC = (byte)((response[15] & 0xFE) >> 1)
|
||||
ManufacturingDate = response[14],
|
||||
CRC = (byte)((response[15] & 0xFE) >> 1)
|
||||
};
|
||||
byte[] tmp = new byte[6];
|
||||
Array.Copy(response, 3, tmp, 0, 6);
|
||||
|
||||
@@ -42,39 +42,39 @@ namespace DiscImageChef.Decoders.MMC
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
||||
public class CSD
|
||||
{
|
||||
public byte Structure;
|
||||
public byte Version;
|
||||
public byte TAAC;
|
||||
public byte NSAC;
|
||||
public byte Speed;
|
||||
public byte Structure;
|
||||
public byte Version;
|
||||
public byte TAAC;
|
||||
public byte NSAC;
|
||||
public byte Speed;
|
||||
public ushort Classes;
|
||||
public byte ReadBlockLength;
|
||||
public bool ReadsPartialBlocks;
|
||||
public bool WriteMisalignment;
|
||||
public bool ReadMisalignment;
|
||||
public bool DSRImplemented;
|
||||
public byte ReadBlockLength;
|
||||
public bool ReadsPartialBlocks;
|
||||
public bool WriteMisalignment;
|
||||
public bool ReadMisalignment;
|
||||
public bool DSRImplemented;
|
||||
public ushort Size;
|
||||
public byte ReadCurrentAtVddMin;
|
||||
public byte ReadCurrentAtVddMax;
|
||||
public byte WriteCurrentAtVddMin;
|
||||
public byte WriteCurrentAtVddMax;
|
||||
public byte SizeMultiplier;
|
||||
public byte EraseGroupSize;
|
||||
public byte EraseGroupSizeMultiplier;
|
||||
public byte WriteProtectGroupSize;
|
||||
public bool WriteProtectGroupEnable;
|
||||
public byte DefaultECC;
|
||||
public byte WriteSpeedFactor;
|
||||
public byte WriteBlockLength;
|
||||
public bool WritesPartialBlocks;
|
||||
public bool ContentProtection;
|
||||
public bool FileFormatGroup;
|
||||
public bool Copy;
|
||||
public bool PermanentWriteProtect;
|
||||
public bool TemporaryWriteProtect;
|
||||
public byte FileFormat;
|
||||
public byte ECC;
|
||||
public byte CRC;
|
||||
public byte ReadCurrentAtVddMin;
|
||||
public byte ReadCurrentAtVddMax;
|
||||
public byte WriteCurrentAtVddMin;
|
||||
public byte WriteCurrentAtVddMax;
|
||||
public byte SizeMultiplier;
|
||||
public byte EraseGroupSize;
|
||||
public byte EraseGroupSizeMultiplier;
|
||||
public byte WriteProtectGroupSize;
|
||||
public bool WriteProtectGroupEnable;
|
||||
public byte DefaultECC;
|
||||
public byte WriteSpeedFactor;
|
||||
public byte WriteBlockLength;
|
||||
public bool WritesPartialBlocks;
|
||||
public bool ContentProtection;
|
||||
public bool FileFormatGroup;
|
||||
public bool Copy;
|
||||
public bool PermanentWriteProtect;
|
||||
public bool TemporaryWriteProtect;
|
||||
public byte FileFormat;
|
||||
public byte ECC;
|
||||
public byte CRC;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
@@ -106,39 +106,40 @@ namespace DiscImageChef.Decoders.MMC
|
||||
|
||||
return new CSD
|
||||
{
|
||||
Structure = (byte)((response[0] & 0xC0) >> 6),
|
||||
Version = (byte)((response[0] & 0x3C) >> 2),
|
||||
TAAC = response[1],
|
||||
NSAC = response[2],
|
||||
Speed = response[3],
|
||||
Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)),
|
||||
ReadBlockLength = (byte)(response[5] & 0x0F),
|
||||
ReadsPartialBlocks = (response[6] & 0x80) == 0x80,
|
||||
WriteMisalignment = (response[6] & 0x40) == 0x40,
|
||||
ReadMisalignment = (response[6] & 0x20) == 0x20,
|
||||
DSRImplemented = (response[6] & 0x10) == 0x10,
|
||||
Size = (ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)),
|
||||
ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3),
|
||||
ReadCurrentAtVddMax = (byte)(response[8] & 0x07),
|
||||
WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5),
|
||||
WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2),
|
||||
SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)),
|
||||
EraseGroupSize = (byte)((response[10] & 0x7C) >> 2),
|
||||
Structure = (byte)((response[0] & 0xC0) >> 6),
|
||||
Version = (byte)((response[0] & 0x3C) >> 2),
|
||||
TAAC = response[1],
|
||||
NSAC = response[2],
|
||||
Speed = response[3],
|
||||
Classes = (ushort)((response[4] << 4) + ((response[5] & 0xF0) >> 4)),
|
||||
ReadBlockLength = (byte)(response[5] & 0x0F),
|
||||
ReadsPartialBlocks = (response[6] & 0x80) == 0x80,
|
||||
WriteMisalignment = (response[6] & 0x40) == 0x40,
|
||||
ReadMisalignment = (response[6] & 0x20) == 0x20,
|
||||
DSRImplemented = (response[6] & 0x10) == 0x10,
|
||||
Size =
|
||||
(ushort)(((response[6] & 0x03) << 10) + (response[7] << 2) + ((response[8] & 0xC0) >> 6)),
|
||||
ReadCurrentAtVddMin = (byte)((response[8] & 0x38) >> 3),
|
||||
ReadCurrentAtVddMax = (byte)(response[8] & 0x07),
|
||||
WriteCurrentAtVddMin = (byte)((response[9] & 0xE0) >> 5),
|
||||
WriteCurrentAtVddMax = (byte)((response[9] & 0x1C) >> 2),
|
||||
SizeMultiplier = (byte)(((response[9] & 0x03) << 1) + ((response[10] & 0x80) >> 7)),
|
||||
EraseGroupSize = (byte)((response[10] & 0x7C) >> 2),
|
||||
EraseGroupSizeMultiplier = (byte)(((response[10] & 0x03) << 3) + ((response[11] & 0xE0) >> 5)),
|
||||
WriteProtectGroupSize = (byte)(response[11] & 0x1F),
|
||||
WriteProtectGroupEnable = (response[12] & 0x80) == 0x80,
|
||||
DefaultECC = (byte)((response[12] & 0x60) >> 5),
|
||||
WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2),
|
||||
WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)),
|
||||
WritesPartialBlocks = (response[13] & 0x20) == 0x20,
|
||||
ContentProtection = (response[13] & 0x01) == 0x01,
|
||||
FileFormatGroup = (response[14] & 0x80) == 0x80,
|
||||
Copy = (response[14] & 0x40) == 0x40,
|
||||
PermanentWriteProtect = (response[14] & 0x20) == 0x20,
|
||||
TemporaryWriteProtect = (response[14] & 0x10) == 0x10,
|
||||
FileFormat = (byte)((response[14] & 0x0C) >> 2),
|
||||
ECC = (byte)(response[14] & 0x03),
|
||||
CRC = (byte)((response[15] & 0xFE) >> 1)
|
||||
WriteProtectGroupSize = (byte)(response[11] & 0x1F),
|
||||
WriteProtectGroupEnable = (response[12] & 0x80) == 0x80,
|
||||
DefaultECC = (byte)((response[12] & 0x60) >> 5),
|
||||
WriteSpeedFactor = (byte)((response[12] & 0x1C) >> 2),
|
||||
WriteBlockLength = (byte)(((response[12] & 0x03) << 2) + ((response[13] & 0xC0) >> 6)),
|
||||
WritesPartialBlocks = (response[13] & 0x20) == 0x20,
|
||||
ContentProtection = (response[13] & 0x01) == 0x01,
|
||||
FileFormatGroup = (response[14] & 0x80) == 0x80,
|
||||
Copy = (response[14] & 0x40) == 0x40,
|
||||
PermanentWriteProtect = (response[14] & 0x20) == 0x20,
|
||||
TemporaryWriteProtect = (response[14] & 0x10) == 0x10,
|
||||
FileFormat = (byte)((response[14] & 0x0C) >> 2),
|
||||
ECC = (byte)(response[14] & 0x03),
|
||||
CRC = (byte)((response[15] & 0xFE) >> 1)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -148,7 +149,7 @@ namespace DiscImageChef.Decoders.MMC
|
||||
|
||||
double unitFactor = 0;
|
||||
double multiplier = 0;
|
||||
string unit = "";
|
||||
string unit = "";
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine("MultiMediaCard Device Specific Data Register:");
|
||||
@@ -171,35 +172,35 @@ namespace DiscImageChef.Decoders.MMC
|
||||
switch(csd.TAAC & 0x07)
|
||||
{
|
||||
case 0:
|
||||
unit = "ns";
|
||||
unit = "ns";
|
||||
unitFactor = 1;
|
||||
break;
|
||||
case 1:
|
||||
unit = "ns";
|
||||
unit = "ns";
|
||||
unitFactor = 10;
|
||||
break;
|
||||
case 2:
|
||||
unit = "ns";
|
||||
unit = "ns";
|
||||
unitFactor = 100;
|
||||
break;
|
||||
case 3:
|
||||
unit = "μs";
|
||||
unit = "μs";
|
||||
unitFactor = 1;
|
||||
break;
|
||||
case 4:
|
||||
unit = "μs";
|
||||
unit = "μs";
|
||||
unitFactor = 10;
|
||||
break;
|
||||
case 5:
|
||||
unit = "μs";
|
||||
unit = "μs";
|
||||
unitFactor = 100;
|
||||
break;
|
||||
case 6:
|
||||
unit = "ms";
|
||||
unit = "ms";
|
||||
unitFactor = 1;
|
||||
break;
|
||||
case 7:
|
||||
unit = "ms";
|
||||
unit = "ms";
|
||||
unitFactor = 10;
|
||||
break;
|
||||
}
|
||||
@@ -277,7 +278,7 @@ namespace DiscImageChef.Decoders.MMC
|
||||
unitFactor = 100;
|
||||
break;
|
||||
default:
|
||||
unit = "unknown";
|
||||
unit = "unknown";
|
||||
unitFactor = 0;
|
||||
break;
|
||||
}
|
||||
@@ -338,7 +339,9 @@ namespace DiscImageChef.Decoders.MMC
|
||||
sb.AppendFormat("\tDevice's clock frequency: {0}{1}", result, unit).AppendLine();
|
||||
|
||||
unit = "";
|
||||
for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1) if((csd.Classes & mask) == mask) unit += $" {cl}";
|
||||
for(int cl = 0, mask = 1; cl <= 11; cl++, mask <<= 1)
|
||||
if((csd.Classes & mask) == mask)
|
||||
unit += $" {cl}";
|
||||
|
||||
sb.AppendFormat("\tDevice support command classes {0}", unit).AppendLine();
|
||||
if(csd.ReadBlockLength == 15) sb.AppendLine("\tRead block length size is defined in extended CSD");
|
||||
@@ -358,7 +361,7 @@ namespace DiscImageChef.Decoders.MMC
|
||||
sb.AppendFormat("\tDevice has {0} blocks", (int)result).AppendLine();
|
||||
|
||||
result = (csd.Size + 1) * Math.Pow(2, csd.SizeMultiplier + 2) * Math.Pow(2, csd.ReadBlockLength);
|
||||
if(result > 1073741824) sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine();
|
||||
if(result > 1073741824) sb.AppendFormat("\tDevice has {0} GiB", result / 1073741824.0).AppendLine();
|
||||
else if(result > 1048576) sb.AppendFormat("\tDevice has {0} MiB", result / 1048576.0).AppendLine();
|
||||
else if(result > 1024) sb.AppendFormat("\tDevice has {0} KiB", result / 1024.0).AppendLine();
|
||||
else sb.AppendFormat("\tDevice has {0} bytes", result).AppendLine();
|
||||
@@ -478,7 +481,7 @@ namespace DiscImageChef.Decoders.MMC
|
||||
// TODO: Check specification
|
||||
unitFactor = Convert.ToDouble(csd.EraseGroupSize);
|
||||
multiplier = Convert.ToDouble(csd.EraseGroupSizeMultiplier);
|
||||
result = (unitFactor + 1) * (multiplier + 1);
|
||||
result = (unitFactor + 1) * (multiplier + 1);
|
||||
sb.AppendFormat("\tDevice can erase a minimum of {0} blocks at a time", (int)result).AppendLine();
|
||||
|
||||
if(csd.WriteProtectGroupEnable)
|
||||
|
||||
@@ -44,7 +44,8 @@ namespace DiscImageChef.Decoders.MMC
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public class ExtendedCSD
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] Reserved0;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
|
||||
public byte[] Reserved0;
|
||||
public byte ExtendedSecurityCommandsError;
|
||||
public byte SupportedCommandSets;
|
||||
public byte HPIFeatures;
|
||||
@@ -62,144 +63,152 @@ namespace DiscImageChef.Decoders.MMC
|
||||
public byte OperationCodesTimeout;
|
||||
public uint FFUArgument;
|
||||
public byte BarrierSupport;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)] public byte[] Reserved1;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 177)]
|
||||
public byte[] Reserved1;
|
||||
public byte CMDQueuingSupport;
|
||||
public byte CMDQueuingDepth;
|
||||
public uint NumberofFWSectorsCorrectlyProgrammed;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] VendorHealthReport;
|
||||
public byte DeviceLifeEstimationTypeB;
|
||||
public byte DeviceLifeEstimationTypeA;
|
||||
public byte PreEOLInformation;
|
||||
public byte OptimalReadSize;
|
||||
public byte OptimalWriteSize;
|
||||
public byte OptimalTrimUnitSize;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
|
||||
public byte[] VendorHealthReport;
|
||||
public byte DeviceLifeEstimationTypeB;
|
||||
public byte DeviceLifeEstimationTypeA;
|
||||
public byte PreEOLInformation;
|
||||
public byte OptimalReadSize;
|
||||
public byte OptimalWriteSize;
|
||||
public byte OptimalTrimUnitSize;
|
||||
public ushort DeviceVersion;
|
||||
public ulong FirmwareVersion;
|
||||
public byte PowerClassDDR200;
|
||||
public uint CacheSize;
|
||||
public byte GenericCMD6Timeout;
|
||||
public byte PowerOffNotificationTimeout;
|
||||
public byte BackgroundOperationsStatus;
|
||||
public uint CorrectlyProgrammedSectors;
|
||||
public byte InitializationTimeAfterPartition;
|
||||
public byte CacheFlushingPolicy;
|
||||
public byte PowerClassDDR52;
|
||||
public byte PowerClassDDR52_195;
|
||||
public byte PowerClassDDR200_195;
|
||||
public byte PowerClassDDR200_130;
|
||||
public byte MinimumWritePerformanceDDR52;
|
||||
public byte MinimumReadPerformanceDDR52;
|
||||
public byte Reserved2;
|
||||
public byte TRIMMultiplier;
|
||||
public byte SecureFeatureSupport;
|
||||
public byte SecureEraseMultiplier;
|
||||
public byte SecureTRIMMultiplier;
|
||||
public byte BootInformation;
|
||||
public byte Reserved3;
|
||||
public byte BootPartitionSize;
|
||||
public byte AccessSize;
|
||||
public byte HighCapacityEraseUnitSize;
|
||||
public byte HighCapacityEraseTimeout;
|
||||
public byte ReliableWriteSectorCount;
|
||||
public byte HighCapacityWriteProtectGroupSize;
|
||||
public byte SleepCurrentVcc;
|
||||
public byte SleepCurrentVccq;
|
||||
public byte ProductionStateAwarenessTimeout;
|
||||
public byte SleepAwakeTimeout;
|
||||
public byte SleepNotificationTimeout;
|
||||
public uint SectorCount;
|
||||
public byte SecureWriteProtectInformation;
|
||||
public byte MinimumWritePerformance52;
|
||||
public byte MinimumReadPerformance52;
|
||||
public byte MinimumWritePerformance26;
|
||||
public byte MinimumReadPerformance26;
|
||||
public byte MinimumWritePerformance26_4;
|
||||
public byte MinimumReadPerformance26_4;
|
||||
public byte Reserved4;
|
||||
public byte PowerClass26;
|
||||
public byte PowerClass52;
|
||||
public byte PowerClass26_195;
|
||||
public byte PowerClass52_195;
|
||||
public byte PartitionSwitchingTime;
|
||||
public byte OutOfInterruptBusyTiming;
|
||||
public byte DriverStrength;
|
||||
public byte DeviceType;
|
||||
public byte Reserved5;
|
||||
public byte Structure;
|
||||
public byte Reserved6;
|
||||
public byte Revision;
|
||||
public byte CommandSet;
|
||||
public byte Reserved7;
|
||||
public byte CommandSetRevision;
|
||||
public byte Reserved8;
|
||||
public byte PowerClass;
|
||||
public byte Reserved9;
|
||||
public byte HighSpeedInterfaceTiming;
|
||||
public byte StrobeSupport;
|
||||
public byte BusWidth;
|
||||
public byte Reserved10;
|
||||
public byte ErasedMemoryContent;
|
||||
public byte Reserved11;
|
||||
public byte PartitionConfiguration;
|
||||
public byte BootConfigProtection;
|
||||
public byte BootBusConditions;
|
||||
public byte Reserved12;
|
||||
public byte HighDensityEraseGroupDefinition;
|
||||
public byte BootWriteProtectionStatus;
|
||||
public byte BootAreaWriteProtectionRegister;
|
||||
public byte Reserved13;
|
||||
public byte UserAreaWriteProtectionRegister;
|
||||
public byte Reserved14;
|
||||
public byte FirmwareConfiguration;
|
||||
public byte RPMBSize;
|
||||
public byte WriteReliabilitySettingRegister;
|
||||
public byte WriteReliabilityParameterRegister;
|
||||
public byte StartSanitizeOperation;
|
||||
public byte ManuallyStartBackgroundOperations;
|
||||
public byte EnableBackgroundOperationsHandshake;
|
||||
public byte HWResetFunction;
|
||||
public byte HPIManagement;
|
||||
public byte PartitioningSupport;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] MaxEnhancedAreaSize;
|
||||
public ulong FirmwareVersion;
|
||||
public byte PowerClassDDR200;
|
||||
public uint CacheSize;
|
||||
public byte GenericCMD6Timeout;
|
||||
public byte PowerOffNotificationTimeout;
|
||||
public byte BackgroundOperationsStatus;
|
||||
public uint CorrectlyProgrammedSectors;
|
||||
public byte InitializationTimeAfterPartition;
|
||||
public byte CacheFlushingPolicy;
|
||||
public byte PowerClassDDR52;
|
||||
public byte PowerClassDDR52_195;
|
||||
public byte PowerClassDDR200_195;
|
||||
public byte PowerClassDDR200_130;
|
||||
public byte MinimumWritePerformanceDDR52;
|
||||
public byte MinimumReadPerformanceDDR52;
|
||||
public byte Reserved2;
|
||||
public byte TRIMMultiplier;
|
||||
public byte SecureFeatureSupport;
|
||||
public byte SecureEraseMultiplier;
|
||||
public byte SecureTRIMMultiplier;
|
||||
public byte BootInformation;
|
||||
public byte Reserved3;
|
||||
public byte BootPartitionSize;
|
||||
public byte AccessSize;
|
||||
public byte HighCapacityEraseUnitSize;
|
||||
public byte HighCapacityEraseTimeout;
|
||||
public byte ReliableWriteSectorCount;
|
||||
public byte HighCapacityWriteProtectGroupSize;
|
||||
public byte SleepCurrentVcc;
|
||||
public byte SleepCurrentVccq;
|
||||
public byte ProductionStateAwarenessTimeout;
|
||||
public byte SleepAwakeTimeout;
|
||||
public byte SleepNotificationTimeout;
|
||||
public uint SectorCount;
|
||||
public byte SecureWriteProtectInformation;
|
||||
public byte MinimumWritePerformance52;
|
||||
public byte MinimumReadPerformance52;
|
||||
public byte MinimumWritePerformance26;
|
||||
public byte MinimumReadPerformance26;
|
||||
public byte MinimumWritePerformance26_4;
|
||||
public byte MinimumReadPerformance26_4;
|
||||
public byte Reserved4;
|
||||
public byte PowerClass26;
|
||||
public byte PowerClass52;
|
||||
public byte PowerClass26_195;
|
||||
public byte PowerClass52_195;
|
||||
public byte PartitionSwitchingTime;
|
||||
public byte OutOfInterruptBusyTiming;
|
||||
public byte DriverStrength;
|
||||
public byte DeviceType;
|
||||
public byte Reserved5;
|
||||
public byte Structure;
|
||||
public byte Reserved6;
|
||||
public byte Revision;
|
||||
public byte CommandSet;
|
||||
public byte Reserved7;
|
||||
public byte CommandSetRevision;
|
||||
public byte Reserved8;
|
||||
public byte PowerClass;
|
||||
public byte Reserved9;
|
||||
public byte HighSpeedInterfaceTiming;
|
||||
public byte StrobeSupport;
|
||||
public byte BusWidth;
|
||||
public byte Reserved10;
|
||||
public byte ErasedMemoryContent;
|
||||
public byte Reserved11;
|
||||
public byte PartitionConfiguration;
|
||||
public byte BootConfigProtection;
|
||||
public byte BootBusConditions;
|
||||
public byte Reserved12;
|
||||
public byte HighDensityEraseGroupDefinition;
|
||||
public byte BootWriteProtectionStatus;
|
||||
public byte BootAreaWriteProtectionRegister;
|
||||
public byte Reserved13;
|
||||
public byte UserAreaWriteProtectionRegister;
|
||||
public byte Reserved14;
|
||||
public byte FirmwareConfiguration;
|
||||
public byte RPMBSize;
|
||||
public byte WriteReliabilitySettingRegister;
|
||||
public byte WriteReliabilityParameterRegister;
|
||||
public byte StartSanitizeOperation;
|
||||
public byte ManuallyStartBackgroundOperations;
|
||||
public byte EnableBackgroundOperationsHandshake;
|
||||
public byte HWResetFunction;
|
||||
public byte HPIManagement;
|
||||
public byte PartitioningSupport;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] MaxEnhancedAreaSize;
|
||||
public byte PartitionsAttribute;
|
||||
public byte PartitioningSetting;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] GeneralPurposePartitionSize;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] EnhancedUserDataAreaSize;
|
||||
public uint EnhancedUserDataStartAddress;
|
||||
public byte Reserved15;
|
||||
public byte BadBlockManagementMode;
|
||||
public byte ProductionStateAwareness;
|
||||
public byte PackageCaseTemperatureControl;
|
||||
public byte PeriodicWakeUp;
|
||||
public byte SupportsProgramCxDInDDR;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
|
||||
public byte[] GeneralPurposePartitionSize;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
|
||||
public byte[] EnhancedUserDataAreaSize;
|
||||
public uint EnhancedUserDataStartAddress;
|
||||
public byte Reserved15;
|
||||
public byte BadBlockManagementMode;
|
||||
public byte ProductionStateAwareness;
|
||||
public byte PackageCaseTemperatureControl;
|
||||
public byte PeriodicWakeUp;
|
||||
public byte SupportsProgramCxDInDDR;
|
||||
public ushort Reserved16;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] VendorSpecific;
|
||||
public byte NativeSectorSize;
|
||||
public byte SectorSizeEmulation;
|
||||
public byte SectorSize;
|
||||
public byte InitializationTimeout;
|
||||
public byte Class6CommandsControl;
|
||||
public byte AddressedGroupToBeReleased;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
|
||||
public byte[] VendorSpecific;
|
||||
public byte NativeSectorSize;
|
||||
public byte SectorSizeEmulation;
|
||||
public byte SectorSize;
|
||||
public byte InitializationTimeout;
|
||||
public byte Class6CommandsControl;
|
||||
public byte AddressedGroupToBeReleased;
|
||||
public ushort ExceptionEventsControl;
|
||||
public ushort ExceptionEventsStatus;
|
||||
public ushort ExtendedPartitionsAttribute;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] ContextConfiguration;
|
||||
public byte PackedCommandStatus;
|
||||
public byte PackedCommandFailureIndex;
|
||||
public byte PowerOffNotification;
|
||||
public byte CacheControl;
|
||||
public byte CacheFlushing;
|
||||
public byte BarrierControl;
|
||||
public byte ModeConfig;
|
||||
public byte ModeOperationCodes;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
|
||||
public byte[] ContextConfiguration;
|
||||
public byte PackedCommandStatus;
|
||||
public byte PackedCommandFailureIndex;
|
||||
public byte PowerOffNotification;
|
||||
public byte CacheControl;
|
||||
public byte CacheFlushing;
|
||||
public byte BarrierControl;
|
||||
public byte ModeConfig;
|
||||
public byte ModeOperationCodes;
|
||||
public ushort Reserved17;
|
||||
public byte FFUStatus;
|
||||
public uint PreLoadingDataSize;
|
||||
public uint MaxPreLoadingDataSize;
|
||||
public byte ProductStateAwarenessEnablement;
|
||||
public byte SecureRemovalType;
|
||||
public byte CommandQueueModeEnable;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)] public byte[] Reserved18;
|
||||
public byte FFUStatus;
|
||||
public uint PreLoadingDataSize;
|
||||
public uint MaxPreLoadingDataSize;
|
||||
public byte ProductStateAwarenessEnablement;
|
||||
public byte SecureRemovalType;
|
||||
public byte CommandQueueModeEnable;
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 15)]
|
||||
public byte[] Reserved18;
|
||||
}
|
||||
|
||||
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
||||
@@ -213,8 +222,8 @@ namespace DiscImageChef.Decoders.MMC
|
||||
|
||||
if(response.Length != 512) return null;
|
||||
|
||||
GCHandle handle = GCHandle.Alloc(response, GCHandleType.Pinned);
|
||||
ExtendedCSD csd = (ExtendedCSD)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ExtendedCSD));
|
||||
GCHandle handle = GCHandle.Alloc(response, GCHandleType.Pinned);
|
||||
ExtendedCSD csd = (ExtendedCSD)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ExtendedCSD));
|
||||
handle.Free();
|
||||
|
||||
return csd;
|
||||
@@ -364,8 +373,8 @@ namespace DiscImageChef.Decoders.MMC
|
||||
|
||||
if(csd.PowerOffNotificationTimeout > 0)
|
||||
sb
|
||||
.AppendFormat("\tDevice takes a maximum of {0} by default to power off from a SWITCH command notification",
|
||||
csd.PowerOffNotificationTimeout * 10).AppendLine();
|
||||
.AppendFormat("\tDevice takes a maximum of {0} by default to power off from a SWITCH command notification",
|
||||
csd.PowerOffNotificationTimeout * 10).AppendLine();
|
||||
|
||||
switch(csd.BackgroundOperationsStatus & 0x03)
|
||||
{
|
||||
|
||||
@@ -72,25 +72,25 @@ namespace DiscImageChef.Decoders.MMC
|
||||
{
|
||||
return new OCR
|
||||
{
|
||||
PowerUp = (response & 0x80000000) == 0x80000000,
|
||||
PowerUp = (response & 0x80000000) == 0x80000000,
|
||||
AccessMode = (byte)((response & 0x60000000) >> 29),
|
||||
ThreeFive = (response & 0x00800000) == 0x00800000,
|
||||
ThreeFour = (response & 0x00400000) == 0x00400000,
|
||||
ThreeFive = (response & 0x00800000) == 0x00800000,
|
||||
ThreeFour = (response & 0x00400000) == 0x00400000,
|
||||
ThreeThree = (response & 0x00200000) == 0x00200000,
|
||||
ThreeTwo = (response & 0x00100000) == 0x00100000,
|
||||
ThreeOne = (response & 0x00080000) == 0x00080000,
|
||||
ThreeZero = (response & 0x00040000) == 0x00040000,
|
||||
TwoNine = (response & 0x00020000) == 0x00020000,
|
||||
TwoEight = (response & 0x00010000) == 0x00010000,
|
||||
TwoSeven = (response & 0x00008000) == 0x00008000,
|
||||
TwoSix = (response & 0x00004000) == 0x00004000,
|
||||
TwoFive = (response & 0x00002000) == 0x00002000,
|
||||
TwoFour = (response & 0x00001000) == 0x00001000,
|
||||
TwoThree = (response & 0x00000800) == 0x00000800,
|
||||
TwoTwo = (response & 0x00000400) == 0x00000400,
|
||||
TwoOne = (response & 0x00000200) == 0x00000200,
|
||||
TwoZero = (response & 0x00000100) == 0x00000100,
|
||||
OneSix = (response & 0x00000080) == 0x00000080
|
||||
ThreeTwo = (response & 0x00100000) == 0x00100000,
|
||||
ThreeOne = (response & 0x00080000) == 0x00080000,
|
||||
ThreeZero = (response & 0x00040000) == 0x00040000,
|
||||
TwoNine = (response & 0x00020000) == 0x00020000,
|
||||
TwoEight = (response & 0x00010000) == 0x00010000,
|
||||
TwoSeven = (response & 0x00008000) == 0x00008000,
|
||||
TwoSix = (response & 0x00004000) == 0x00004000,
|
||||
TwoFive = (response & 0x00002000) == 0x00002000,
|
||||
TwoFour = (response & 0x00001000) == 0x00001000,
|
||||
TwoThree = (response & 0x00000800) == 0x00000800,
|
||||
TwoTwo = (response & 0x00000400) == 0x00000400,
|
||||
TwoOne = (response & 0x00000200) == 0x00000200,
|
||||
TwoZero = (response & 0x00000100) == 0x00000100,
|
||||
OneSix = (response & 0x00000080) == 0x00000080
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ namespace DiscImageChef.Decoders.MMC
|
||||
switch(mmcVendorId)
|
||||
{
|
||||
case 0x15: return "Samsung";
|
||||
default: return $"Unknown manufacturer ID 0x{mmcVendorId:X2}";
|
||||
default: return $"Unknown manufacturer ID 0x{mmcVendorId:X2}";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user