From fcf4c56f0e943e7374b1cee2230304f817ed5d34 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 13 Jan 2016 19:59:44 +0000 Subject: [PATCH] * DiscImageChef.Devices/Enums.cs: * DiscImageChef.Helpers/ArrayFill.cs: * DiscImageChef.Helpers/ArrayIsEmpty.cs: * DiscImageChef.Devices/DiscImageChef.Devices.csproj: * DiscImageChef.Helpers/DiscImageChef.Helpers.csproj: Implemented Certance, Fujitsu and Hewlett-Packard vendor commands. * DiscImageChef.Devices/Device/ScsiCommands/Certance.cs: Implemented Certance vendor commands. * DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs: Implemented Fujitsu vendor commands. * DiscImageChef.Devices/Device/ScsiCommands/HP.cs: Implemented Hewlett-Packard vendor commands. --- DiscImageChef.Devices/ChangeLog | 16 +++ .../Device/ScsiCommands/Certance.cs | 94 ++++++++++++++ .../Device/ScsiCommands/Fujitsu.cs | 118 ++++++++++++++++++ .../Device/ScsiCommands/HP.cs | 109 ++++++++++++++++ .../DiscImageChef.Devices.csproj | 3 + DiscImageChef.Devices/Enums.cs | 50 +++++++- DiscImageChef.Helpers/ArrayFill.cs | 2 +- DiscImageChef.Helpers/ArrayIsEmpty.cs | 69 ++++++++++ DiscImageChef.Helpers/ChangeLog | 8 ++ .../DiscImageChef.Helpers.csproj | 1 + 10 files changed, 468 insertions(+), 2 deletions(-) create mode 100644 DiscImageChef.Devices/Device/ScsiCommands/Certance.cs create mode 100644 DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs create mode 100644 DiscImageChef.Devices/Device/ScsiCommands/HP.cs create mode 100644 DiscImageChef.Helpers/ArrayIsEmpty.cs diff --git a/DiscImageChef.Devices/ChangeLog b/DiscImageChef.Devices/ChangeLog index de8120c3..9dd69ba0 100644 --- a/DiscImageChef.Devices/ChangeLog +++ b/DiscImageChef.Devices/ChangeLog @@ -1,3 +1,19 @@ +2016-01-13 Natalia Portillo + + * Enums.cs: + * DiscImageChef.Devices.csproj: + Implemented Certance, Fujitsu and Hewlett-Packard vendor + commands. + + * Device/ScsiCommands/Certance.cs: + Implemented Certance vendor commands. + + * Device/ScsiCommands/Fujitsu.cs: + Implemented Fujitsu vendor commands. + + * Device/ScsiCommands/HP.cs: + Implemented Hewlett-Packard vendor commands. + 2016-01-13 Natalia Portillo * Enums.cs: diff --git a/DiscImageChef.Devices/Device/ScsiCommands/Certance.cs b/DiscImageChef.Devices/Device/ScsiCommands/Certance.cs new file mode 100644 index 00000000..13c55f59 --- /dev/null +++ b/DiscImageChef.Devices/Device/ScsiCommands/Certance.cs @@ -0,0 +1,94 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Certance.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Certance 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 + { + /// + /// Parks the load arm in preparation for transport + /// + /// Sense buffer. + /// Timeout. + /// Duration. + public bool CertancePark(out byte[] senseBuffer, uint timeout, out double duration) + { + return CertanceParkUnpark(out senseBuffer, true, timeout, out duration); + } + + /// + /// Unparks the load arm prior to operation + /// + /// Sense buffer. + /// Timeout. + /// Duration. + public bool CertanceUnpark(out byte[] senseBuffer, uint timeout, out double duration) + { + return CertanceParkUnpark(out senseBuffer, false, timeout, out duration); + } + + /// + /// Parks the load arm in preparation for transport or unparks it prior to operation + /// + /// Sense buffer. + /// If set to true, parks the load arm + /// Timeout. + /// Duration. + public bool CertanceParkUnpark(out byte[] senseBuffer, bool park, 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.Certance_ParkUnpark; + if(park) + cdb[4] = 1; + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.None, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "CERTANCE PARK UNPARK took {0} ms.", duration); + + return sense; + } + } +} + diff --git a/DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs b/DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs new file mode 100644 index 00000000..45ca9253 --- /dev/null +++ b/DiscImageChef.Devices/Device/ScsiCommands/Fujitsu.cs @@ -0,0 +1,118 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : Fujitsu.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Component +// +// 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 + { + public bool FujitsuDisplay(out byte[] senseBuffer, bool flash, FujitsuDisplayModes mode, string firstHalf, string secondHalf, uint timeout, out double duration) + { + byte[] tmp; + byte[] firstHalfBytes = new byte[8]; + byte[] secondHalfBytes = new byte[8]; + byte[] buffer = new byte[17]; + bool displayLen = false; + bool halfMsg = false; + byte[] cdb = new byte[10]; + bool sense; + + if(!string.IsNullOrWhiteSpace(firstHalf)) + { + tmp = System.Text.Encoding.ASCII.GetBytes(firstHalf); + Array.Copy(tmp, 0, firstHalfBytes, 0, 8); + } + if(!string.IsNullOrWhiteSpace(secondHalf)) + { + tmp = System.Text.Encoding.ASCII.GetBytes(secondHalf); + Array.Copy(tmp, 0, secondHalfBytes, 0, 8); + } + + if (mode != FujitsuDisplayModes.Half) + { + if (!ArrayHelpers.ArrayIsNullOrWhiteSpace(firstHalfBytes) && + !ArrayHelpers.ArrayIsNullOrWhiteSpace(secondHalfBytes)) + { + displayLen = true; + halfMsg = false; + } + else if (ArrayHelpers.ArrayIsNullOrWhiteSpace(firstHalfBytes) && + !ArrayHelpers.ArrayIsNullOrWhiteSpace(secondHalfBytes)) + { + displayLen = false; + halfMsg = false; + } + else if (!ArrayHelpers.ArrayIsNullOrWhiteSpace(firstHalfBytes) && + ArrayHelpers.ArrayIsNullOrWhiteSpace(secondHalfBytes)) + { + displayLen = false; + halfMsg = true; + } + else + { + displayLen = false; + halfMsg = false; + } + } + + buffer[0] = (byte)((byte)mode << 5); + if (displayLen) + buffer[0] += 0x10; + if (flash) + buffer[0] += 0x08; + if (halfMsg) + buffer[0] += 0x04; + buffer[0] += 0x01; // Always ASCII + + Array.Copy(firstHalfBytes, 0, buffer, 1, 8); + Array.Copy(secondHalfBytes, 0, buffer, 9, 8); + + cdb[0] = (byte)ScsiCommands.Fujitsu_Display; + cdb[6] = (byte)buffer.Length; + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.Out, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "FUJITSU DISPLAY took {0} ms.", duration); + + return sense; + } + } +} + diff --git a/DiscImageChef.Devices/Device/ScsiCommands/HP.cs b/DiscImageChef.Devices/Device/ScsiCommands/HP.cs new file mode 100644 index 00000000..b8a5378b --- /dev/null +++ b/DiscImageChef.Devices/Device/ScsiCommands/HP.cs @@ -0,0 +1,109 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : HP.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Hewlett-Packard 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 HP READ LONG vendor command + /// + /// true if the command failed and contains the sense buffer. + /// Buffer where the SCSI 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 HPReadLong(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 HP READ LONG vendor command + /// + /// true if the command failed and contains the sense buffer. + /// Buffer where the SCSI 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 HPReadLong(out byte[] buffer, out byte[] senseBuffer, bool relAddr, uint address, ushort transferLen, ushort blockBytes, bool pba, bool sectorCount, uint timeout, out double duration) + { + senseBuffer = new byte[32]; + byte[] cdb = new byte[10]; + bool sense; + + cdb[0] = (byte)ScsiCommands.ReadLong; + if(relAddr) + cdb[1] += 0x01; + cdb[2] = (byte)((address & 0xFF000000) >> 24); + cdb[3] = (byte)((address & 0xFF0000) >> 16); + cdb[4] = (byte)((address & 0xFF00) >> 8); + cdb[5] = (byte)(address & 0xFF); + cdb[7] = (byte)((transferLen & 0xFF00) >> 8); + cdb[8] = (byte)(transferLen & 0xFF); + if (pba) + cdb[9] += 0x80; + if (sectorCount) + cdb[9] += 0x40; + + if(sectorCount) + buffer = new byte[blockBytes * transferLen]; + else + buffer = new byte[transferLen]; + + lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, out sense); + error = lastError != 0; + + DicConsole.DebugWriteLine("SCSI Device", "HP READ LONG took {0} ms.", duration); + + return sense; + } + } +} + diff --git a/DiscImageChef.Devices/DiscImageChef.Devices.csproj b/DiscImageChef.Devices/DiscImageChef.Devices.csproj index a6c0cb7d..6d4377c2 100644 --- a/DiscImageChef.Devices/DiscImageChef.Devices.csproj +++ b/DiscImageChef.Devices/DiscImageChef.Devices.csproj @@ -61,6 +61,9 @@ + + + diff --git a/DiscImageChef.Devices/Enums.cs b/DiscImageChef.Devices/Enums.cs index 531e702a..123e4329 100644 --- a/DiscImageChef.Devices/Enums.cs +++ b/DiscImageChef.Devices/Enums.cs @@ -2630,9 +2630,33 @@ namespace DiscImageChef.Devices #endregion Adaptec vendor commands #region Archive Corp. vendor commands + /// + /// Gets current position's block address + /// Archive_RequestBlockAddress = 0x02, - Archive_SeekBlock = 0x0C + /// + /// Seeks to specified block address + /// + Archive_SeekBlock = 0x0C, #endregion Archive Corp. vendor commands + + #region Certance vendor commands + /// + /// Parks the load arm in preparation for transport + /// + Certance_ParkUnpark = 0x06, + #endregion Certance vendor commands + + #region Fujitsu vendor commands + /// + /// Used to check the controller's data and control path + /// + Fujitsu_LoopWriteToRead = 0xC1, + /// + /// Used to display a message on the operator panel + /// + Fujitsu_Display = 0xCF + #endregion Fujitsu vendor commands } #endregion SCSI Commands @@ -3363,5 +3387,29 @@ namespace DiscImageChef.Devices /// Supported = 5 } + + public enum FujitsuDisplayModes : byte + { + /// + /// Message is displayed until next tape operation starts + /// + Idle = 0, + /// + /// Message is displayed only if a cartridge is inserted, until its removal + /// + Cart = 1, + /// + /// Message is only displayed when drive is ready + /// + Ready = 2, + /// + /// Cancels current display + /// + Cancel = 3, + /// + /// Message is displayed only if a cartridge is inserted. When removed, only second half of the message is displayed. + /// + Half = 7 + } } diff --git a/DiscImageChef.Helpers/ArrayFill.cs b/DiscImageChef.Helpers/ArrayFill.cs index c3ba54cc..9798aee1 100644 --- a/DiscImageChef.Helpers/ArrayFill.cs +++ b/DiscImageChef.Helpers/ArrayFill.cs @@ -32,7 +32,7 @@ using System; namespace DiscImageChef { - public static class ArrayHelpers + public static partial class ArrayHelpers { public static void ArrayFill(T[] destinationArray, T value) { diff --git a/DiscImageChef.Helpers/ArrayIsEmpty.cs b/DiscImageChef.Helpers/ArrayIsEmpty.cs new file mode 100644 index 00000000..35ee8f86 --- /dev/null +++ b/DiscImageChef.Helpers/ArrayIsEmpty.cs @@ -0,0 +1,69 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ArrayIsEmpty.cs +// Version : 1.0 +// Author(s) : Natalia Portillo +// +// Component : Component +// +// 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; + +namespace DiscImageChef +{ + public static partial class ArrayHelpers + { + public static bool ArrayIsNullOrWhiteSpace(byte[] array) + { + if (array == null) + return true; + + foreach (byte b in array) + if (b != 0x00 && b != 0x20) + return false; + + return true; + } + + public static bool ArrayIsNullOrEmpty(byte[] array) + { + if (array == null) + return true; + + foreach (byte b in array) + if (b != 0x00) + return false; + + return true; + } + } +} + diff --git a/DiscImageChef.Helpers/ChangeLog b/DiscImageChef.Helpers/ChangeLog index 9a709ca0..e4872eee 100644 --- a/DiscImageChef.Helpers/ChangeLog +++ b/DiscImageChef.Helpers/ChangeLog @@ -1,3 +1,11 @@ +2016-01-13 Natalia Portillo + + * ArrayFill.cs: + * ArrayIsEmpty.cs: + * DiscImageChef.Helpers.csproj: + Implemented Certance, Fujitsu and Hewlett-Packard vendor + commands. + 2015-12-30 Natalia Portillo * StringHandlers.cs: diff --git a/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj b/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj index fece7f71..7d7520ea 100644 --- a/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj +++ b/DiscImageChef.Helpers/DiscImageChef.Helpers.csproj @@ -41,6 +41,7 @@ +