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 
8 using System;
9 using System.Collections.Generic;
10 using Antmicro.Renode.Peripherals;
11 using Antmicro.Renode.Peripherals.SPI;
12 using Antmicro.Renode.Core;
13 using Antmicro.Renode.Utilities;
14 
15 namespace Antmicro.Renode.Extensions.Mocks
16 {
17     /* Example usage:
18     emulation MockSpiHost sysbus.spi_device
19     host.MockSpiHost WriteBytes 0x0 "010203040506070809"
20     host.MockSpiHost ReadBytes 9
21     */
22 
23     public static class MockSpiHost
24     {
AddMockSpiHost(this Emulation emulation, ISPIPeripheral device, string name = R)25         public static void AddMockSpiHost(this Emulation emulation, ISPIPeripheral device, string name = "MockSpiHost")
26         {
27             emulation.HostMachine.AddHostMachineElement(new SpiHost(device), name);
28         }
29     }
30 
31     public class SpiHost : IHostMachineElement
32     {
SpiHost(ISPIPeripheral device)33         public SpiHost(ISPIPeripheral device)
34         {
35             this.device = device;
36         }
37 
WriteBytes(string hexString)38         public void WriteBytes(string hexString)
39         {
40             var dataToSend = Misc.HexStringToByteArray(hexString);
41 
42             foreach(var b in dataToSend)
43             {
44                 device.Transmit(b);
45             }
46             device.FinishTransmission();
47         }
48 
ReadBytes(int count)49         public byte[] ReadBytes(int count)
50         {
51             var returnedData = new byte[count];
52             for(var index = 0; index < count ; index++)
53             {
54                 // This will block the monitor until finished.
55                 returnedData[index] = device.Transmit(0);
56             }
57             return returnedData;
58         }
59 
60         private readonly ISPIPeripheral device;
61     }
62 }
63