Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion AsmTool/AsmDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace AsmTool
public class AsmDevice {
const uint PID_2142 = 0x2142;
const uint PID_3142 = 0x3142;
const uint PID_3242 = 0x3242;

const uint FIRMWARE_SIZE = 131072; //128k ROM

Expand All @@ -39,7 +40,7 @@ public AsmDevice(IAsmIO io) {
this.prb = new Prober(io);

Console.WriteLine("Scanning for ASMedia ICs...");
if (!prb.FindByProduct(PID_2142, out pcidev) && !prb.FindByProduct(PID_3142, out pcidev))
if (!prb.FindByProduct(PID_3242, out pcidev) && !prb.FindByProduct(PID_2142, out pcidev) && !prb.FindByProduct(PID_3142, out pcidev))
throw new Exception($"No ASMedia device detected!");

Console.WriteLine("Found ASMedia IC!");
Expand Down
25 changes: 21 additions & 4 deletions AsmTool/AsmFirmware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ namespace AsmTool
{
public enum AsmFirmwareChipType : byte {
Asm2142 = 0x50,
Asm3142 = 0x70
Asm3142 = 0x70,
Asm3242 = 0x83
}

public class AsmFirmware : IDisposable
Expand All @@ -28,6 +29,7 @@ public class AsmFirmware : IDisposable

private const string MAGIC_GEN1 = "2114A_RCFG";
private const string MAGIC_GEN2 = "2214A_RCFG";
private const string MAGIC_GEN2x2 = "2324A_RCFG";

private Span<byte> Span {
get {
Expand All @@ -48,7 +50,7 @@ private void UpdateChecksum() {
}

public void SetChipType(AsmFirmwareChipType type) {
Span[0xBC] = (byte)type;
Span[GetFirmwareVersionOffset() + 3] = (byte)type;
UpdateChecksum();
}

Expand All @@ -62,8 +64,21 @@ private int GetSignatureType() {
}
}

private int GetFirmwareVersionOffset() {
string magic = ReadStringSignature();
switch(magic) {
case MAGIC_GEN1:
case MAGIC_GEN2:
return 0xB9;
case MAGIC_GEN2x2:
return 0xC9;
default:
throw new InvalidDataException($"Unexpected magic \"{magic}\"");
}
}

private byte[] GetFirmwareVersion() {
var fwVer = stream.PerformAt(0xB9, () => {
var fwVer = stream.PerformAt(GetFirmwareVersionOffset(), () => {
return stream.ReadBytes(6);
});
return fwVer;
Expand All @@ -74,6 +89,7 @@ private AsmFirmwareChipType GetFirmwareChipType() {
switch (fwVer[3]) {
case 0x50: return AsmFirmwareChipType.Asm2142;
case 0x70: return AsmFirmwareChipType.Asm3142;
case 0x83: return AsmFirmwareChipType.Asm3242;
default: throw new InvalidDataException($"Unknown chip id {fwVer[3]:X2}");
}
}
Expand All @@ -92,7 +108,7 @@ private string GetFirmwareVersionString() {
}

private string GetFirmwareName() {
var fwChipName = stream.PerformAt(0xB9 + 7, () => {
var fwChipName = stream.PerformAt(GetFirmwareVersionOffset() + 7, () => {
return stream.ReadCString(Encoding.ASCII);
});
return fwChipName;
Expand Down Expand Up @@ -221,6 +237,7 @@ public void PrintInfo(AsmDevice dev, TextWriter os) {
var fwChipName = fwChipType switch {
AsmFirmwareChipType.Asm2142 => "ASM2142",
AsmFirmwareChipType.Asm3142 => "ASM3142",
AsmFirmwareChipType.Asm3242 => "ASM3242",
_ => "Unknown"
};
os.WriteLine($"Footer: " + ReadFooterSignature());
Expand Down