1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 using Antmicro.Renode.Logging;
8 using Antmicro.Renode.Core.Structure;
9 using static Antmicro.Renode.Peripherals.SPI.Cadence_xSPI;
10 
11 namespace Antmicro.Renode.Peripherals.SPI.Cadence_xSPICommands
12 {
13     internal abstract class Command
14     {
CreateCommand(Cadence_xSPI controller, CommandPayload payload)15         static public Command CreateCommand(Cadence_xSPI controller, CommandPayload payload)
16         {
17             switch(controller.Mode)
18             {
19                 case ControllerMode.SoftwareTriggeredInstructionGenerator:
20                     return STIGCommand.CreateSTIGCommand(controller, payload);
21                 case ControllerMode.AutoCommand:
22                     return AutoCommand.CreateAutoCommand(controller, payload);
23                 default:
24                     controller.Log(LogLevel.Warning, "Unable to create the command, unknown controller mode 0x{0:x}", controller.Mode);
25                     return null;
26             }
27         }
28 
Command(Cadence_xSPI controller)29         public Command(Cadence_xSPI controller)
30         {
31             this.controller = controller;
32         }
33 
FinishTransmission()34         public void FinishTransmission()
35         {
36             if(TransmissionFinished)
37             {
38                 return;
39             }
40             Peripheral?.FinishTransmission();
41             TransmissionFinished = true;
42         }
43 
ToString()44         public override string ToString()
45         {
46             return $"{this.GetType().Name}: chipSelect = {ChipSelect}, invalidCommand = {InvalidCommandError}";
47         }
48 
Transmit()49         public abstract void Transmit();
50 
51         public bool TransmissionFinished { get; protected set; }
52         public bool Completed { get; protected set; }
53         public bool CRCError { get; protected set; }
54         public bool BusError { get; protected set; }
55         public bool InvalidCommandError { get; protected set; }
56         public bool Failed => CRCError || BusError || InvalidCommandError;
57 
58         public abstract uint ChipSelect { get; }
59 
Log(LogLevel logLevel, string message, params object[] arg)60         protected void Log(LogLevel logLevel, string message, params object[] arg)
61         {
62             controller.Log(logLevel, message, arg);
63         }
64 
65         protected ISPIPeripheral Peripheral
66         {
67             get
68             {
69                 if(!isPeripheralObtained)
70                 {
71                     isPeripheralObtained = true;
72                     if(!controller.TryGetPeripheral((int)ChipSelect, out peripheral))
73                     {
74                         controller.Log(LogLevel.Warning, "There is no peripheral with the selected address 0x{0:x}.", ChipSelect);
75                     }
76                 }
77                 return peripheral;
78             }
79         }
80 
81         private ISPIPeripheral peripheral;
82         private bool isPeripheralObtained;
83         private readonly Cadence_xSPI controller;
84     }
85 }
86