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