diff --git a/DiscImageChef.Devices/ChangeLog b/DiscImageChef.Devices/ChangeLog index 8f656a52b..de8120c39 100644 --- a/DiscImageChef.Devices/ChangeLog +++ b/DiscImageChef.Devices/ChangeLog @@ -1,3 +1,14 @@ +2016-01-13 Natalia Portillo + + * Enums.cs: + * DiscImageChef.Devices.csproj: + * Device/ScsiCommands/ArchiveCorp.cs: + Added vendor commands for Archive Corporation Viper 2060S, + 2125S and 2150S. + + * Device/ScsiCommands/Adaptec.cs: + Corrected documentation typo. + 2016-01-13 Natalia Portillo * Enums.cs: diff --git a/DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs b/DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs index d45f71ffb..95a8c4049 100644 --- a/DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs +++ b/DiscImageChef.Devices/Device/ScsiCommands/Adaptec.cs @@ -47,7 +47,7 @@ namespace DiscImageChef.Devices /// /// Buffer. /// Sense buffer. - /// SCSI. + /// SCSI Logical Block Address. /// Timeout. /// Duration. public bool AdaptecTranslate(out byte[] buffer, out byte[] senseBuffer, uint lba, uint timeout, out double duration) @@ -61,7 +61,7 @@ namespace DiscImageChef.Devices /// Buffer. /// Sense buffer. /// If set to true request the data from drive 1. - /// SCSI. + /// SCSI Logical Block Address. /// Timeout. /// Duration. public bool AdaptecTranslate(out byte[] buffer, out byte[] senseBuffer, bool drive1, uint lba, uint timeout, out double duration) diff --git a/DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs b/DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs new file mode 100644 index 000000000..0f98506bb --- /dev/null +++ b/DiscImageChef.Devices/Device/ScsiCommands/ArchiveCorp.cs @@ -0,0 +1,113 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ArchiveCorp.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Archive Corp. 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 System; +using DiscImageChef.Console; + +namespace DiscImageChef.Devices +{ + public partial class Device + { + /// + /// Gets the underlying drive cylinder, head and index bytes for the specified SCSI LBA. + /// + /// Buffer. + /// Sense buffer. + /// Timeout. + /// Duration. + public bool ArchiveCorpRequestBlockAddress(out byte[] buffer, out byte[] senseBuffer, uint timeout, out double duration) + { + buffer = new byte[3]; + byte[] cdb = new byte[6]; + senseBuffer = new byte[32]; + bool sense; + + cdb[0] = (byte)ScsiCommands.Archive_RequestBlockAddress; + cdb[4] = 3; + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "ARCHIVE CORP. REQUEST BLOCK ADDRESS took {0} ms.", duration); + + return sense; + } + + /// + /// Gets the underlying drive cylinder, head and index bytes for the specified SCSI LBA. + /// + /// Sense buffer. + /// Logical Block Address, starting from 1. + /// Timeout. + /// Duration. + public bool ArchiveCorpSeekBlock(out byte[] senseBuffer, uint lba, uint timeout, out double duration) + { + return ArchiveCorpSeekBlock(out senseBuffer, false, lba, timeout, out duration); + } + + /// + /// Positions the tape at the specified block address + /// + /// Sense buffer. + /// If set to true, return from the command immediately. + /// Logical Block Address, starting from 1. + /// Timeout. + /// Duration. + public bool ArchiveCorpSeekBlock(out byte[] senseBuffer, bool immediate, uint lba, uint timeout, out double duration) + { + byte[] buffer = new byte[0]; + byte[] cdb = new byte[6]; + senseBuffer = new byte[32]; + bool sense; + + cdb[0] = (byte)ScsiCommands.Archive_SeekBlock; + cdb[1] = (byte)((lba & 0x1F0000) >> 16); + cdb[2] = (byte)((lba & 0xFF00) >> 8); + cdb[3] = (byte)(lba & 0xFF); + if (immediate) + cdb[1] += 0x01; + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.None, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "ARCHIVE CORP. SEEK BLOCK took {0} ms.", duration); + + return sense; + } + } +} + diff --git a/DiscImageChef.Devices/DiscImageChef.Devices.csproj b/DiscImageChef.Devices/DiscImageChef.Devices.csproj index 619af967a..a6c0cb7de 100644 --- a/DiscImageChef.Devices/DiscImageChef.Devices.csproj +++ b/DiscImageChef.Devices/DiscImageChef.Devices.csproj @@ -60,6 +60,7 @@ + diff --git a/DiscImageChef.Devices/Enums.cs b/DiscImageChef.Devices/Enums.cs index cdaa9374f..531e702a3 100644 --- a/DiscImageChef.Devices/Enums.cs +++ b/DiscImageChef.Devices/Enums.cs @@ -2607,12 +2607,32 @@ namespace DiscImageChef.Devices #endregion NEC vendor commands #region Adaptec vendor commands + /// + /// Translates a SCSI LBA to a drive's CHS + /// Adaptec_Translate = 0x0F, + /// + /// Configures Adaptec controller error threshold + /// Adaptec_SetErrorThreshold = 0x10, + /// + /// Reads and resets error and statistical counters + /// Adaptec_ReadCounters = 0x11, + /// + /// Writes to controller's RAM + /// Adaptec_WriteBuffer = 0x13, - Adaptec_ReadBuffer = 0x14 + /// + /// Reads controller's RAM + /// + Adaptec_ReadBuffer = 0x14, #endregion Adaptec vendor commands + + #region Archive Corp. vendor commands + Archive_RequestBlockAddress = 0x02, + Archive_SeekBlock = 0x0C + #endregion Archive Corp. vendor commands } #endregion SCSI Commands