diff --git a/DiscImageChef.Devices/ChangeLog b/DiscImageChef.Devices/ChangeLog index 3f06ab50..99cee1c7 100644 --- a/DiscImageChef.Devices/ChangeLog +++ b/DiscImageChef.Devices/ChangeLog @@ -1,3 +1,13 @@ +2016-01-14 Natalia Portillo + + * Enums.cs: + * DiscImageChef.Devices.csproj: + * Device/ScsiCommands/Plasmon.cs: + Added Plasmon vendor commands. + + * Device/ScsiCommands/Pioneer.cs: + Added Pioner READ CD-XA vendor command. + 2016-01-13 Natalia Portillo * Enums.cs: diff --git a/DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs b/DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs index 9ff00b25..18ddf506 100644 --- a/DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs +++ b/DiscImageChef.Devices/Device/ScsiCommands/Pioneer.cs @@ -54,7 +54,7 @@ namespace DiscImageChef.Devices /// How many blocks to read. /// Block size. /// Subchannel selection. - public bool ReadCdDa(out byte[] buffer, out byte[] senseBuffer, uint lba, uint blockSize, uint transferLength, PioneerSubchannel subchannel, uint timeout, out double duration) + public bool PioneerReadCdDa(out byte[] buffer, out byte[] senseBuffer, uint lba, uint blockSize, uint transferLength, PioneerSubchannel subchannel, uint timeout, out double duration) { senseBuffer = new byte[32]; byte[] cdb = new byte[12]; @@ -75,7 +75,7 @@ namespace DiscImageChef.Devices lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out sense); error = lastError != 0; - DicConsole.DebugWriteLine("SCSI Device", "READ CD-DA took {0} ms.", duration); + DicConsole.DebugWriteLine("SCSI Device", "PIONEER READ CD-DA took {0} ms.", duration); return sense; } @@ -92,7 +92,7 @@ namespace DiscImageChef.Devices /// End MM:SS:FF of read encoded as 0x00MMSSFF. /// Block size. /// Subchannel selection. - public bool ReadCdDaMsf(out byte[] buffer, out byte[] senseBuffer, uint startMsf, uint endMsf, uint blockSize, PioneerSubchannel subchannel, uint timeout, out double duration) + public bool PioneerReadCdDaMsf(out byte[] buffer, out byte[] senseBuffer, uint startMsf, uint endMsf, uint blockSize, PioneerSubchannel subchannel, uint timeout, out double duration) { senseBuffer = new byte[32]; byte[] cdb = new byte[12]; @@ -114,7 +114,58 @@ namespace DiscImageChef.Devices lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out sense); error = lastError != 0; - DicConsole.DebugWriteLine("SCSI Device", "READ CD-DA MSF took {0} ms.", duration); + DicConsole.DebugWriteLine("SCSI Device", "PIONEER READ CD-DA MSF took {0} ms.", duration); + + return sense; + } + + /// + /// Sends the Pioneer READ CD-XA command + /// + /// true if the command failed and contains the sense buffer. + /// Buffer where the Pioneer READ CD-XA response will be stored + /// Sense buffer. + /// Timeout in seconds. + /// Duration in milliseconds it took for the device to execute the command. + /// If set to true, returns all sector data with 294 bytes of error flags. Superseedes + /// If set to true, returns all 2352 bytes of sector data. + /// Start block address. + /// How many blocks to read. + public bool PioneerReadCdXa(out byte[] buffer, out byte[] senseBuffer, uint lba, uint transferLength, bool errorFlags, bool wholeSector, uint timeout, out double duration) + { + senseBuffer = new byte[32]; + byte[] cdb = new byte[12]; + bool sense; + + cdb[0] = (byte)ScsiCommands.ReadCdXa; + cdb[2] = (byte)((lba & 0xFF000000) >> 24); + cdb[3] = (byte)((lba & 0xFF0000) >> 16); + cdb[4] = (byte)((lba & 0xFF00) >> 8); + cdb[5] = (byte)(lba & 0xFF); + cdb[7] = (byte)((transferLength & 0xFF0000) >> 16); + cdb[8] = (byte)((transferLength & 0xFF00) >> 8); + cdb[9] = (byte)(transferLength & 0xFF); + + if (errorFlags) + { + buffer = new byte[2646 * transferLength]; + cdb[6] = 0x1F; + } + else if (wholeSector) + { + buffer = new byte[2352 * transferLength]; + cdb[6] = 0x0F; + } + else + { + buffer = new byte[2048 * transferLength]; + cdb[6] = 0x00; + } + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "PIONEER READ CD-XA took {0} ms.", duration); return sense; } diff --git a/DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs b/DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs new file mode 100644 index 00000000..f2cbe73a --- /dev/null +++ b/DiscImageChef.Devices/Device/ScsiCommands/Plasmon.cs @@ -0,0 +1,115 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Plasmon.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Plasmon vendor commands +// +// 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 DiscImageChef.Console; + +namespace DiscImageChef.Devices +{ + public partial class Device + { + /// + /// Sends the Plasmon READ LONG vendor command + /// + /// true if the command failed and contains the sense buffer. + /// Buffer where the Plasmon READ LONG response will be stored + /// Sense buffer. + /// If set to true address contain two's complement offset from last read address. + /// PBA/LBA to read. + /// How many bytes per block. + /// If set to true address contain physical block address. + /// Timeout in seconds. + /// Duration in milliseconds it took for the device to execute the command. + public bool PlasmonReadLong(out byte[] buffer, out byte[] senseBuffer, bool relAddr, uint address, ushort blockBytes, bool pba, uint timeout, out double duration) + { + return HPReadLong(out buffer, out senseBuffer, relAddr, address, 0, blockBytes, pba, false, timeout, out duration); + } + + /// + /// Sends the Plasmon READ LONG vendor command + /// + /// true if the command failed and contains the sense buffer. + /// Buffer where the Plasmon READ LONG response will be stored + /// Sense buffer. + /// If set to true address contain two's complement offset from last read address. + /// PBA/LBA to read. + /// How many blocks/bytes to read. + /// How many bytes per block. + /// If set to true address contain physical block address. + /// If set to true is a count of secors to read. Otherwise it will be ignored + /// Timeout in seconds. + /// Duration in milliseconds it took for the device to execute the command. + public bool PlasmonReadLong(out byte[] buffer, out byte[] senseBuffer, bool relAddr, uint address, ushort transferLen, ushort blockBytes, bool pba, bool sectorCount, uint timeout, out double duration) + { + return HPReadLong(out buffer, out senseBuffer, relAddr, address, transferLen, blockBytes, pba, sectorCount, timeout, out duration); + } + + /// + /// Retrieves the logical or physical block address for the specified + /// + /// true if the command failed and contains the sense buffer. + /// Buffer where the block address will be stored + /// Sense buffer. + /// PBA/LBA to read. + /// If set to true address contain a physical block address. + /// Timeout in seconds. + /// Duration in milliseconds it took for the device to execute the command. + public bool PlasmonReadSectorLocation(out byte[] buffer, out byte[] senseBuffer, uint address, bool pba, uint timeout, out double duration) + { + senseBuffer = new byte[32]; + byte[] cdb = new byte[10]; + bool sense; + + cdb[0] = (byte)ScsiCommands.Plasmon_ReadSectorLocation; + cdb[2] = (byte)((address & 0xFF000000) >> 24); + cdb[3] = (byte)((address & 0xFF0000) >> 16); + cdb[4] = (byte)((address & 0xFF00) >> 8); + cdb[5] = (byte)(address & 0xFF); + if (pba) + cdb[9] += 0x80; + + buffer = new byte[8]; + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "PLASMON READ SECTOR LOCATION took {0} ms.", duration); + + return sense; + } + } +} + diff --git a/DiscImageChef.Devices/DiscImageChef.Devices.csproj b/DiscImageChef.Devices/DiscImageChef.Devices.csproj index 6d4377c2..c1e526ef 100644 --- a/DiscImageChef.Devices/DiscImageChef.Devices.csproj +++ b/DiscImageChef.Devices/DiscImageChef.Devices.csproj @@ -64,6 +64,7 @@ + diff --git a/DiscImageChef.Devices/Enums.cs b/DiscImageChef.Devices/Enums.cs index 4cd7a23d..197996c2 100644 --- a/DiscImageChef.Devices/Enums.cs +++ b/DiscImageChef.Devices/Enums.cs @@ -2434,6 +2434,7 @@ namespace DiscImageChef.Devices /// Sets the spindle speed to be used while reading/writing data to a CD /// SetCdSpeed = 0xDA, + WriteCdp = 0xE3, #endregion #region ATA Command Pass-Through @@ -2668,6 +2669,17 @@ namespace DiscImageChef.Devices /// MSystems_SecurityEraseOld = 0xDF, #endregion M-Systems vendor commands + + #region Plasmon vendor commands + /// + /// Retrieves sector address + /// + Plasmon_ReadSectorLocation = 0xE6, + /// + /// Makes a Compliant WORM block completely unreadable + /// + Plasmon_Shred = 0xEE, + #endregion Plasmon vendor commands } #endregion SCSI Commands