1 //
2 // Copyright (c) 2010-2018 Antmicro
3 //
4 //  This file is licensed under the MIT License.
5 //  Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using Antmicro.Renode.Utilities.Packets;
9 
10 namespace Antmicro.Renode.Core.USB.MSC
11 {
12     [LeastSignificantByteFirst]
13     public struct BulkOnlyTransportCommandBlockWrapper
14     {
TryParseAntmicro.Renode.Core.USB.MSC.BulkOnlyTransportCommandBlockWrapper15         public static bool TryParse(byte[] bytes, out BulkOnlyTransportCommandBlockWrapper cbw)
16         {
17             if(bytes == null
18                 || bytes.Length != 31
19                 || BitConverter.ToUInt32(bytes, 0) != SignatureValue)
20             {
21                 cbw = default(BulkOnlyTransportCommandBlockWrapper);
22                 return false;
23             }
24 
25             cbw = Packet.Decode<BulkOnlyTransportCommandBlockWrapper>(bytes);
26 
27             return true;
28         }
29 
ToStringAntmicro.Renode.Core.USB.MSC.BulkOnlyTransportCommandBlockWrapper30         public override string ToString()
31         {
32             return $"Tag: 0x{Tag:x}, DataTransferLength: {DataTransferLength}, Flags: 0x{Flags:x}, LogicalUnitNumber: {LogicalUnitNumber}, Length: {Length}";
33         }
34 
35         [PacketField]
36         public uint Signature => SignatureValue;
37 
38         [PacketField]
39         public uint Tag { get; private set; }
40 
41         [PacketField]
42         public uint DataTransferLength  { get; private set; }
43 
44         [PacketField]
45         public byte Flags { get; private set; }
46 
47         [PacketField, Offset(bytes: 13), Width(4)]
48         public byte LogicalUnitNumber { get; private set; }
49 
50         [PacketField, Offset(bytes: 14), Width(5)]
51         public byte Length { get; private set; }
52 
53         public const int CommandOffset = 15;
54         public const uint SignatureValue = 0x43425355;
55     }
56 }