2020-12-08 23:55:35 +00:00
|
|
|
using Aaru.Helpers;
|
2021-02-28 14:53:32 +00:00
|
|
|
using FluentAssertions.Execution;
|
2020-12-08 23:55:35 +00:00
|
|
|
using NUnit.Framework;
|
|
|
|
|
|
|
|
|
|
// ReSharper disable InconsistentNaming
|
|
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
namespace Aaru.Tests.Devices.MultiMediaCard;
|
|
|
|
|
|
|
|
|
|
[TestFixture]
|
|
|
|
|
public class CSD
|
2020-12-08 23:55:35 +00:00
|
|
|
{
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly string[] cards =
|
2020-12-08 23:55:35 +00:00
|
|
|
{
|
2022-03-06 13:29:38 +00:00
|
|
|
"mmc_6600_32mb", "mmc_pretec_32mb", "mmc_takems_256mb"
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly string[] csds =
|
|
|
|
|
{
|
|
|
|
|
"8c26012a0f5901e9f6d983e392404001", "8c0e012a0ff981e9f6d981e18a400001", "905e002a1f5983d3edb683ff96400001"
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] structure_versions =
|
|
|
|
|
{
|
|
|
|
|
2, 2, 2
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] spec_versions =
|
|
|
|
|
{
|
|
|
|
|
3, 3, 4
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] taacs =
|
|
|
|
|
{
|
|
|
|
|
38, 14, 94
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] nsacs =
|
|
|
|
|
{
|
|
|
|
|
1, 1, 0
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] speeds =
|
|
|
|
|
{
|
|
|
|
|
42, 42, 42
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly ushort[] classes =
|
|
|
|
|
{
|
|
|
|
|
245, 255, 501
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] read_block_lengths =
|
|
|
|
|
{
|
|
|
|
|
9, 9, 9
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] read_partial_blocks =
|
|
|
|
|
{
|
|
|
|
|
false, true, true
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] write_misaligned_block =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] read_misaligned_block =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] dsr_implemented =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly uint[] card_sizes =
|
|
|
|
|
{
|
|
|
|
|
1959, 1959, 3919
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] min_read_current =
|
|
|
|
|
{
|
|
|
|
|
6, 6, 5
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] max_read_current =
|
|
|
|
|
{
|
|
|
|
|
6, 6, 5
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] min_write_current =
|
|
|
|
|
{
|
|
|
|
|
6, 6, 5
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] max_write_current =
|
|
|
|
|
{
|
|
|
|
|
6, 6, 5
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] size_multiplier =
|
|
|
|
|
{
|
|
|
|
|
3, 3, 5
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] sector_sizes =
|
|
|
|
|
{
|
|
|
|
|
0, 0, 0
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] erase_sector_sizes =
|
|
|
|
|
{
|
|
|
|
|
31, 15, 31
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] write_protect_group_size =
|
|
|
|
|
{
|
|
|
|
|
3, 1, 31
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] write_protect_group_enable =
|
|
|
|
|
{
|
|
|
|
|
true, true, true
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] default_eccs =
|
|
|
|
|
{
|
|
|
|
|
0, 0, 0
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] r2w_factors =
|
|
|
|
|
{
|
|
|
|
|
4, 2, 5
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] write_block_lengths =
|
|
|
|
|
{
|
|
|
|
|
9, 9, 9
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] write_partial_blocks =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] file_format_group =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] copy =
|
|
|
|
|
{
|
|
|
|
|
true, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] permanent_write_protect =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly bool[] temporary_write_protect =
|
|
|
|
|
{
|
|
|
|
|
false, false, false
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] file_format =
|
|
|
|
|
{
|
|
|
|
|
0, 0, 0
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
readonly byte[] ecc =
|
|
|
|
|
{
|
|
|
|
|
0, 0, 0
|
|
|
|
|
};
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
[Test]
|
|
|
|
|
public void Test()
|
|
|
|
|
{
|
|
|
|
|
for(int i = 0; i < cards.Length; i++)
|
2020-12-08 23:55:35 +00:00
|
|
|
{
|
2022-03-06 13:29:38 +00:00
|
|
|
using(new AssertionScope())
|
2020-12-08 23:55:35 +00:00
|
|
|
{
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.Multiple(() =>
|
2021-02-28 14:53:32 +00:00
|
|
|
{
|
2022-03-06 13:29:38 +00:00
|
|
|
int count = Marshal.ConvertFromHexAscii(csds[i], out byte[] response);
|
|
|
|
|
Assert.AreEqual(16, count, $"Size - {cards[i]}");
|
|
|
|
|
Decoders.MMC.CSD csd = Decoders.MMC.Decoders.DecodeCSD(response);
|
|
|
|
|
Assert.IsNotNull(csd, $"Decoded - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(structure_versions[i], csd.Structure, $"Structure version - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(spec_versions[i], csd.Version, $"Specification version - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(taacs[i], csd.TAAC, $"TAAC - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(nsacs[i], csd.NSAC, $"NSAC - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(speeds[i], csd.Speed, $"Transfer speed - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(classes[i], csd.Classes, $"Classes - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(read_block_lengths[i], csd.ReadBlockLength, $"Read block length - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(read_partial_blocks[i], csd.ReadsPartialBlocks,
|
|
|
|
|
$"Reads partial blocks - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(write_misaligned_block[i], csd.WriteMisalignment,
|
|
|
|
|
$"Writes misaligned blocks - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(read_misaligned_block[i], csd.ReadMisalignment,
|
|
|
|
|
$"Reads misaligned blocks - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(dsr_implemented[i], csd.DSRImplemented, $"DSR implemented - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(card_sizes[i], csd.Size, $"Card size - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(min_read_current[i], csd.ReadCurrentAtVddMin,
|
|
|
|
|
$"Reading current at minimum Vdd - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(max_read_current[i], csd.ReadCurrentAtVddMax,
|
|
|
|
|
$"Reading current at maximum Vdd - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(min_write_current[i], csd.WriteCurrentAtVddMin,
|
|
|
|
|
$"Writing current at minimum Vdd - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(max_write_current[i], csd.WriteCurrentAtVddMax,
|
|
|
|
|
$"Writing current at maximum Vdd - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(size_multiplier[i], csd.SizeMultiplier, $"Card size multiplier - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(sector_sizes[i], csd.EraseGroupSize, $"Erase sector size - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(erase_sector_sizes[i], csd.EraseGroupSizeMultiplier,
|
|
|
|
|
$"Erase group size - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(write_protect_group_size[i], csd.WriteProtectGroupSize,
|
|
|
|
|
$"Write protect group size - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(write_protect_group_enable[i], csd.WriteProtectGroupEnable,
|
|
|
|
|
$"Write protect group enable - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(default_eccs[i], csd.DefaultECC, $"Default ECC - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(r2w_factors[i], csd.WriteSpeedFactor, $"Read to write factor - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(write_block_lengths[i], csd.WriteBlockLength,
|
|
|
|
|
$"write block length - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(write_partial_blocks[i], csd.WritesPartialBlocks,
|
|
|
|
|
$"Writes partial blocks - {cards[i]}");
|
2020-12-08 23:55:35 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(file_format_group[i], csd.FileFormatGroup, $"File format group - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(copy[i], csd.Copy, $"Copy - {cards[i]}");
|
2021-02-28 14:53:32 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(permanent_write_protect[i], csd.PermanentWriteProtect,
|
|
|
|
|
$"Permanent write protect - {cards[i]}");
|
2021-02-28 14:53:32 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(temporary_write_protect[i], csd.TemporaryWriteProtect,
|
|
|
|
|
$"Temporary write protect - {cards[i]}");
|
2021-02-28 14:53:32 +00:00
|
|
|
|
2022-03-06 13:29:38 +00:00
|
|
|
Assert.AreEqual(file_format[i], csd.FileFormat, $"File format - {cards[i]}");
|
|
|
|
|
Assert.AreEqual(ecc[i], csd.ECC, $"ECC - {cards[i]}");
|
|
|
|
|
});
|
2020-12-08 23:55:35 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|