From 7bd563a05b43e427733ca0216099e56e4540dac5 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 9 Jul 2020 03:39:58 +0100 Subject: [PATCH] Add MediaTek's READ CACHE vendor command. --- .idea/.idea.Aaru/.idea/contentModel.xml | 1 + Aaru.Devices/Aaru.Devices.csproj | 1 + Aaru.Devices/Device/ScsiCommands/MediaTek.cs | 75 ++++++++++++++++++++ Aaru.Devices/Enums.cs | 6 +- 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 Aaru.Devices/Device/ScsiCommands/MediaTek.cs diff --git a/.idea/.idea.Aaru/.idea/contentModel.xml b/.idea/.idea.Aaru/.idea/contentModel.xml index 3807a113f..626393d33 100644 --- a/.idea/.idea.Aaru/.idea/contentModel.xml +++ b/.idea/.idea.Aaru/.idea/contentModel.xml @@ -634,6 +634,7 @@ + diff --git a/Aaru.Devices/Aaru.Devices.csproj b/Aaru.Devices/Aaru.Devices.csproj index 0778313f9..d7e95a5ed 100644 --- a/Aaru.Devices/Aaru.Devices.csproj +++ b/Aaru.Devices/Aaru.Devices.csproj @@ -49,6 +49,7 @@ + diff --git a/Aaru.Devices/Device/ScsiCommands/MediaTek.cs b/Aaru.Devices/Device/ScsiCommands/MediaTek.cs new file mode 100644 index 000000000..8e24fa151 --- /dev/null +++ b/Aaru.Devices/Device/ScsiCommands/MediaTek.cs @@ -0,0 +1,75 @@ +// /*************************************************************************** +// Aaru Data Preservation Suite +// ---------------------------------------------------------------------------- +// +// Filename : MediaTek.cs +// Author(s) : Natalia Portillo +// +// Component : MediaTek vendor commands. +// +// --[ Description ] ---------------------------------------------------------- +// +// Contains vendor commands for MMC drives with MediaTek chipsets. +// +// --[ License ] -------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2020 Natalia Portillo +// ****************************************************************************/ + +using Aaru.Console; + +namespace Aaru.Devices +{ + public partial class Device + { + /// Reads from the drive's cache. + /// true if the command failed and contains the sense buffer. + /// Buffer where the cache contents will be stored + /// Sense buffer. + /// Timeout in seconds. + /// Duration in milliseconds it took for the device to execute the command. + /// Starting offset in cache memory. + /// How much data to retrieve from cache. + public bool MediaTekReadCache(out byte[] buffer, out byte[] senseBuffer, uint offset, uint length, uint timeout, + out double duration) + { + senseBuffer = new byte[32]; + byte[] cdb = new byte[10]; + buffer = new byte[length]; + + cdb[0] = (byte)ScsiCommands.MediaTekReadCache; + cdb[1] = 0x06; + cdb[2] = (byte)((offset & 0xFF000000) >> 24); + cdb[3] = (byte)((offset & 0xFF0000) >> 16); + cdb[4] = (byte)((offset & 0xFF00) >> 8); + cdb[5] = (byte)(offset & 0xFF); + cdb[6] = (byte)((length & 0xFF000000) >> 24); + cdb[7] = (byte)((length & 0xFF0000) >> 16); + cdb[8] = (byte)((length & 0xFF00) >> 8); + cdb[9] = (byte)(length & 0xFF); + + LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration, + out bool sense); + + Error = LastError != 0; + + AaruConsole.DebugWriteLine("SCSI Device", "MediaTek READ CACHE took {0} ms.", duration); + + return sense; + } + } +} \ No newline at end of file diff --git a/Aaru.Devices/Enums.cs b/Aaru.Devices/Enums.cs index 080491a48..54d31473c 100644 --- a/Aaru.Devices/Enums.cs +++ b/Aaru.Devices/Enums.cs @@ -1833,7 +1833,11 @@ namespace Aaru.Devices /// Gets current audio playing position MiniDiscReadPosition = 0xD7, /// Gets some values that are identical amongst audio discs and data discs, different between them - MiniDiscGetType = 0xD8 + MiniDiscGetType = 0xD8, + #endregion + + #region MediaTek vendor commands + MediaTekReadCache = 0xF1 #endregion } #endregion SCSI Commands