mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Implement Get SDHCI Registers remote packet.
This commit is contained in:
@@ -401,7 +401,6 @@ namespace DiscImageChef.Devices
|
||||
else
|
||||
{
|
||||
Type = remote.GetDeviceType();
|
||||
// TODO: Get SD/MMC registers if SD/MMC
|
||||
|
||||
switch (Type)
|
||||
{
|
||||
@@ -450,7 +449,6 @@ namespace DiscImageChef.Devices
|
||||
|
||||
#endregion SecureDigital / MultiMediaCard
|
||||
|
||||
|
||||
#region USB
|
||||
|
||||
switch (PlatformId)
|
||||
|
||||
@@ -517,7 +517,109 @@ namespace DiscImageChef.Devices.Remote
|
||||
|
||||
public bool GetSdhciRegisters(out byte[] csd, out byte[] cid, out byte[] ocr, out byte[] scr)
|
||||
{
|
||||
throw new NotImplementedException("Getting SDHCI registers not yet implemented...");
|
||||
csd = null;
|
||||
cid = null;
|
||||
ocr = null;
|
||||
scr = null;
|
||||
|
||||
var cmdPkt = new DicPacketCmdGetSdhciRegisters
|
||||
{
|
||||
hdr = new DicPacketHeader
|
||||
{
|
||||
id = Consts.PacketId,
|
||||
len = (uint) Marshal.SizeOf<DicPacketCmdGetSdhciRegisters>(),
|
||||
version = Consts.PacketVersion,
|
||||
packetType = DicPacketType.CommandGetSdhciRegisters
|
||||
}
|
||||
};
|
||||
|
||||
var buf = Marshal.StructureToByteArrayLittleEndian(cmdPkt);
|
||||
|
||||
var len = _socket.Send(buf, SocketFlags.None);
|
||||
|
||||
if (len != buf.Length)
|
||||
{
|
||||
DicConsole.ErrorWriteLine("Could not write to the network...");
|
||||
return false;
|
||||
}
|
||||
|
||||
var hdrBuf = new byte[Marshal.SizeOf<DicPacketHeader>()];
|
||||
|
||||
len = _socket.Receive(hdrBuf, hdrBuf.Length, SocketFlags.Peek);
|
||||
|
||||
if (len < hdrBuf.Length)
|
||||
{
|
||||
DicConsole.ErrorWriteLine("Could not read from the network...");
|
||||
return false;
|
||||
}
|
||||
|
||||
var hdr = Marshal.ByteArrayToStructureLittleEndian<DicPacketHeader>(hdrBuf);
|
||||
|
||||
if (hdr.id != Consts.PacketId)
|
||||
{
|
||||
DicConsole.ErrorWriteLine("Received data is not a DIC Remote Packet...");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (hdr.packetType != DicPacketType.ResponseGetSdhciRegisters)
|
||||
{
|
||||
DicConsole.ErrorWriteLine("Expected Device Type Response Packet, got packet type {0}...",
|
||||
hdr.packetType);
|
||||
return false;
|
||||
}
|
||||
|
||||
buf = new byte[hdr.len];
|
||||
len = _socket.Receive(buf, buf.Length, SocketFlags.None);
|
||||
|
||||
if (len < buf.Length)
|
||||
{
|
||||
DicConsole.ErrorWriteLine("Could not read from the network...");
|
||||
return false;
|
||||
}
|
||||
|
||||
var res = Marshal.ByteArrayToStructureLittleEndian<DicPacketResGetSdhciRegisters>(buf);
|
||||
|
||||
if (res.csd_len > 0)
|
||||
{
|
||||
if (res.csd_len > 16)
|
||||
res.csd_len = 16;
|
||||
|
||||
csd = new byte[res.csd_len];
|
||||
|
||||
Array.Copy(res.csd, 0, csd, 0, res.csd_len);
|
||||
}
|
||||
|
||||
if (res.cid_len > 0)
|
||||
{
|
||||
if (res.cid_len > 16)
|
||||
res.cid_len = 16;
|
||||
|
||||
cid = new byte[res.cid_len];
|
||||
|
||||
Array.Copy(res.cid, 0, cid, 0, res.cid_len);
|
||||
}
|
||||
|
||||
if (res.ocr_len > 0)
|
||||
{
|
||||
if (res.ocr_len > 16)
|
||||
res.ocr_len = 16;
|
||||
|
||||
ocr = new byte[res.ocr_len];
|
||||
|
||||
Array.Copy(res.ocr, 0, ocr, 0, res.ocr_len);
|
||||
}
|
||||
|
||||
if (res.scr_len > 0)
|
||||
{
|
||||
if (res.scr_len > 16)
|
||||
res.scr_len = 16;
|
||||
|
||||
scr = new byte[res.scr_len];
|
||||
|
||||
Array.Copy(res.scr, 0, scr, 0, res.scr_len);
|
||||
}
|
||||
|
||||
return res.isSdhci;
|
||||
}
|
||||
|
||||
public bool GetUsbData(out byte[] descriptors, out ushort idVendor, out ushort idProduct,
|
||||
|
||||
@@ -237,6 +237,11 @@ namespace DiscImageChef.Devices.Remote
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public byte[] scr;
|
||||
|
||||
public uint csd_len;
|
||||
public uint cid_len;
|
||||
public uint ocr_len;
|
||||
public uint scr_len;
|
||||
}
|
||||
|
||||
public struct DicPacketCmdGetUsbData
|
||||
|
||||
Reference in New Issue
Block a user