1 //
2 // Copyright (c) 2010-2024 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.Core;
8 using Antmicro.Renode.Core.Structure.Registers;
9 using Antmicro.Renode.Peripherals.I2C;
10 using Antmicro.Renode.Peripherals.SPI;
11 using Antmicro.Renode.Peripherals.Sensor;
12 using Antmicro.Renode.Utilities.RESD;
13 using Antmicro.Renode.Utilities;
14 
15 namespace Antmicro.Renode.Peripherals.Sensors
16 {
17     public partial class ICM20948
18     {
DefineGyroAccelUserBank0Registers()19         private void DefineGyroAccelUserBank0Registers()
20         {
21             GyroAccelUserBank0Registers.WhoAmI.Define(gyroAccelUserBank0Registers, 0xEA)
22                 .WithTag("WHO_AM_I", 0, 8)
23             ;
24 
25             GyroAccelUserBank0Registers.UserControl.Define(gyroAccelUserBank0Registers)
26                 .WithTag("DMP_EN", 7, 1)
27                 .WithTag("FIFO_EN", 6, 1)
28                 .WithTag("I2C_MST_EN", 5, 1)
29                 .WithTag("I2C_IF_DIS", 4, 1)
30                 .WithTag("DMP_RST", 3, 1)
31                 .WithTag("SRAM_RST", 2, 1)
32                 .WithTag("I2C_MST_RST", 1, 1)
33                 .WithReservedBits(0, 1)
34             ;
35 
36             GyroAccelUserBank0Registers.LPConfig.Define(gyroAccelUserBank0Registers)
37                 .WithReservedBits(7, 1)
38                 .WithTag("I2C_MST_CYCLE", 6, 1)
39                 .WithTag("ACCEL_CYCLE", 5, 1)
40                 .WithTag("GYRO_CYCLE", 4, 1)
41                 .WithReservedBits(0, 4)
42             ;
43 
44             GyroAccelUserBank0Registers.PowerManagement1.Define(gyroAccelUserBank0Registers)
45                 .WithFlag(7, FieldMode.Write, writeCallback: (_, val) => { if(val) SoftwareReset(); }, name: "DEVICE_RESET")
46                 .WithTag("SLEEP", 6, 1)
47                 .WithTag("LP_EN", 5, 1)
48                 .WithReservedBits(4, 1)
49                 .WithTag("TEMP_DIS", 3, 1)
50                 .WithTag("CLKSEL", 0, 3)
51             ;
52 
53             GyroAccelUserBank0Registers.PowerManagement2.Define(gyroAccelUserBank0Registers)
54                 .WithReservedBits(6, 2)
55                 .WithTag("DISABLE_ACCEL", 3, 3)
56                 .WithTag("DISABLE_GYRO", 0, 3)
57             ;
58 
59             GyroAccelUserBank0Registers.InterruptPinConfig.Define(gyroAccelUserBank0Registers)
60                 .WithTag("INT1_ACTL", 7, 1)
61                 .WithTag("INT1_OPEN", 6, 1)
62                 .WithTag("INT1_LATCH_INT_EN", 5, 1)
63                 .WithTag("INT_ANYRD_2CLEAR", 4, 1)
64                 .WithTag("ACTL_FSYNC", 3, 1)
65                 .WithTag("FSYNC_INT_MODE_EN", 2, 1)
66                 .WithTag("BYPASS_EN", 1, 1)
67                 .WithReservedBits(0, 1)
68             ;
69 
70             GyroAccelUserBank0Registers.InterruptEnable.Define(gyroAccelUserBank0Registers)
71                 .WithFlag(7, out wakeOnFSYNCInterruptEnabled, name: "REG_WOF_EN")
72                 .WithReservedBits(4, 3)
73                 .WithFlag(3, out wakeOnMotionInterruptEnabled, name: "WOM_INT_EN")
74                 .WithFlag(2, out pllReadyInterruptEnabled, name: "PLL_RDY_EN")
75                 .WithFlag(1, out digitalMotionProcessorInterruptEnabled, name: "DMP_INT1_EN")
76                 .WithFlag(0, out i2cMasterInterruptEnabled, name: "I2C_MST_INT_EN")
77                 .WithChangeCallback((_, __) => UpdateInterrupts())
78             ;
79 
80             GyroAccelUserBank0Registers.InterruptEnable1.Define(gyroAccelUserBank0Registers)
81                 .WithReservedBits(1, 7)
82                 .WithFlag(0, out rawDataReadyInterruptEnabled, name: "RAW_DATA_0_RDY_EN")
83                 .WithChangeCallback((_, __) => UpdateInterrupts())
84             ;
85 
86             GyroAccelUserBank0Registers.InterruptEnable2.Define(gyroAccelUserBank0Registers)
87                 .WithReservedBits(1, 7)
88                 .WithFlag(0, out fifoOverflowInterruptEnabled, name: "FIFO_OVERFLOW_EN")
89                 .WithChangeCallback((_, __) => UpdateInterrupts())
90             ;
91 
92             GyroAccelUserBank0Registers.InterruptEnable3.Define(gyroAccelUserBank0Registers)
93                 .WithReservedBits(1, 7)
94                 .WithFlag(0, out fifoWatermarkInterruptEnabled,  name: "FIFO_WM_EN")
95                 .WithChangeCallback((_, __) => UpdateInterrupts())
96             ;
97 
98             GyroAccelUserBank0Registers.I2CMstStatus.Define(gyroAccelUserBank0Registers)
99                 .WithTag("PASS_THROUGH", 7, 1)
100                 .WithTag("I2C_SLV4_DONE", 6, 1)
101                 .WithTag("I2C_LOST_ARB", 5, 1)
102                 .WithTag("I2C_SLV4_NACK", 4, 1)
103                 .WithTag("I2C_SLV3_NACK", 3, 1)
104                 .WithTag("I2C_SLV2_NACK", 2, 1)
105                 .WithTag("I2C_SLV1_NACK", 1, 1)
106                 .WithTag("I2C_SLV0_NACK", 0, 1)
107             ;
108 
109             GyroAccelUserBank0Registers.InterruptStatus.Define(gyroAccelUserBank0Registers)
110                 .WithReservedBits(4, 4)
111                 .WithFlag(3, out wakeOnMotionInterruptStatus, name: "WOM_INT")
112                 .WithFlag(2, out pllReadyInterruptStatus, name: "PLL_RDY_INT")
113                 .WithFlag(1, out digitalMotionProcessorInterruptStatus, name: "DMP_INT1")
114                 .WithFlag(0, out i2cMasterInterruptStatus, name: "I2C_MST_INT")
115                 .WithChangeCallback((_, __) => UpdateInterrupts())
116             ;
117 
118             GyroAccelUserBank0Registers.InterruptStatus1.Define(gyroAccelUserBank0Registers)
119                 .WithReservedBits(1, 7)
120                 .WithFlag(0, out rawDataReadyInterruptStatus, name: "RAW_DATA_0_RDY_INT")
121                 .WithChangeCallback((_, __) => UpdateInterrupts())
122             ;
123 
124             GyroAccelUserBank0Registers.InterruptStatus2.Define(gyroAccelUserBank0Registers)
125                 .WithReservedBits(1, 7)
126                 .WithFlag(0, out fifoOverflowInterruptStatus, name: "FIFO_OVERFLOW_INT")
127                 .WithChangeCallback((_, __) => UpdateInterrupts())
128             ;
129 
130             GyroAccelUserBank0Registers.InterruptStatus3.Define(gyroAccelUserBank0Registers)
131                 .WithReservedBits(1, 7)
132                 .WithFlag(0, out fifoWatermarkInterruptStatus, name: "FIFO_WM_INT")
133                 .WithChangeCallback((_, __) => UpdateInterrupts())
134             ;
135 
136             GyroAccelUserBank0Registers.DelayTimeHigh.Define(gyroAccelUserBank0Registers)
137                 .WithTag("DELAY_TIMEH", 0, 8)
138             ;
139 
140             GyroAccelUserBank0Registers.DelayTimeLow.Define(gyroAccelUserBank0Registers)
141                 .WithTag("DELAY_TIMEL", 0, 8)
142             ;
143 
144             GyroAccelUserBank0Registers.AccelerationXOutHigh.Define(gyroAccelUserBank0Registers)
145                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawAccelerationX >> 8), name: "ACCEL_XOUT_H")
146             ;
147 
148             GyroAccelUserBank0Registers.AccelerationXOutLow.Define(gyroAccelUserBank0Registers)
149                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawAccelerationX, name: "ACCEL_XOUT_L")
150             ;
151 
152             GyroAccelUserBank0Registers.AccelerationYOutHigh.Define(gyroAccelUserBank0Registers)
153                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawAccelerationY >> 8), name: "ACCEL_YOUT_H")
154             ;
155 
156             GyroAccelUserBank0Registers.AccelerationYOutLow.Define(gyroAccelUserBank0Registers)
157                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawAccelerationY, name: "ACCEL_YOUT_L")
158             ;
159 
160             GyroAccelUserBank0Registers.AccelerationZOutHigh.Define(gyroAccelUserBank0Registers)
161                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawAccelerationZ >> 8), name: "ACCEL_ZOUT_H")
162             ;
163 
164             GyroAccelUserBank0Registers.AccelerationZOutLow.Define(gyroAccelUserBank0Registers)
165                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawAccelerationZ, name: "ACCEL_ZOUT_L")
166             ;
167 
168             GyroAccelUserBank0Registers.GyroscopeXOutHigh.Define(gyroAccelUserBank0Registers)
169                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawAngularRateX >> 8), name: "GYRO_XOUT_H")
170             ;
171 
172             GyroAccelUserBank0Registers.GyroscopeXOutLow.Define(gyroAccelUserBank0Registers)
173                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawAngularRateX, name: "GYRO_XOUT_L")
174             ;
175 
176             GyroAccelUserBank0Registers.GyroscopeYOutHigh.Define(gyroAccelUserBank0Registers)
177                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawAngularRateY >> 8), name: "GYRO_YOUT_H")
178             ;
179 
180             GyroAccelUserBank0Registers.GyroscopeYOutLow.Define(gyroAccelUserBank0Registers)
181                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawAngularRateY, name: "GYRO_YOUT_L")
182             ;
183 
184             GyroAccelUserBank0Registers.GyroscopeZOutHigh.Define(gyroAccelUserBank0Registers)
185                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawAngularRateZ >> 8), name: "GYRO_ZOUT_H")
186             ;
187 
188             GyroAccelUserBank0Registers.GyroscopeZOutLow.Define(gyroAccelUserBank0Registers)
189                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawAngularRateZ, name: "GYRO_ZOUT_L")
190             ;
191 
192             GyroAccelUserBank0Registers.TemperatureOutHigh.Define(gyroAccelUserBank0Registers)
193                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)(RawTemperature >> 8), name: "TEMP_OUT_H")
194             ;
195 
196             GyroAccelUserBank0Registers.TemperatureOutLow.Define(gyroAccelUserBank0Registers)
197                 .WithValueField(0, 8, valueProviderCallback: _ => (byte)RawTemperature, name: "TEMP_OUT_L")
198             ;
199 
200             GyroAccelUserBank0Registers.ExtSlvSensorData0.DefineMany(gyroAccelUserBank0Registers, NumberOfExternalSlaveSensorDataRegisters, (register, index) =>
201             {
202                 register
203                     .WithValueField(0, 8, out externalSlaveSensorData[index], FieldMode.Read, name: "EXT_SLV_SENS_DATA_00")
204                 ;
205             });
206 
207             GyroAccelUserBank0Registers.FifoEnable1.Define(gyroAccelUserBank0Registers)
208                 .WithReservedBits(4, 4)
209                 .WithTag("SLV_3_FIFO_EN", 3, 1)
210                 .WithTag("SLV_2_FIFO_EN", 2, 1)
211                 .WithTag("SLV_1_FIFO_EN", 1, 1)
212                 .WithTag("SLV_0_FIFO_EN", 0, 1)
213             ;
214 
215             GyroAccelUserBank0Registers.FifoEnable2.Define(gyroAccelUserBank0Registers)
216                 .WithReservedBits(5, 3)
217                 .WithTaggedFlag("ACCEL_FIFO_EN", 4)
218                 .WithTaggedFlag("GYRO_Z_FIFO_EN", 3)
219                 .WithTaggedFlag("GYRO_Y_FIFO_EN", 2)
220                 .WithTaggedFlag("GYRO_X_FIFO_EN", 1)
221                 .WithTaggedFlag("TEMP_FIFO_EN", 0)
222             ;
223 
224             GyroAccelUserBank0Registers.FifoReset.Define(gyroAccelUserBank0Registers)
225                 .WithReservedBits(5, 3)
226                 .WithTag("FIFO_RESET", 0, 5)
227             ;
228 
229             GyroAccelUserBank0Registers.FifoMode.Define(gyroAccelUserBank0Registers)
230                 .WithReservedBits(5, 3)
231                 .WithTag("FIFO_MODE", 0, 5)
232             ;
233 
234             GyroAccelUserBank0Registers.FifoCountHigh.Define(gyroAccelUserBank0Registers)
235                 .WithReservedBits(5, 3)
236                 .WithTag("FIFO_CNT", 0, 5)
237             ;
238 
239             GyroAccelUserBank0Registers.FifoCountLow.Define(gyroAccelUserBank0Registers)
240                 .WithTag("FIFO_CNT", 0, 8)
241             ;
242 
243             GyroAccelUserBank0Registers.FifoRW.Define(gyroAccelUserBank0Registers)
244                 .WithTag("FIFO_R_W", 0, 8)
245             ;
246 
247             GyroAccelUserBank0Registers.DataReadyStatus.Define(gyroAccelUserBank0Registers)
248                 .WithTag("WOF_STATUS", 7, 1)
249                 .WithReservedBits(4, 3)
250                 .WithTag("RAW_DATA_RDY", 0, 4)
251             ;
252 
253             GyroAccelUserBank0Registers.FifoConfig.Define(gyroAccelUserBank0Registers)
254                 .WithReservedBits(1, 7)
255                 .WithTag("FIFO_CFG", 0, 1)
256             ;
257 
258             DefineBankSelectRegister(gyroAccelUserBank0Registers);
259         }
260 
261         private IFlagRegisterField wakeOnFSYNCInterruptEnabled;
262         private IFlagRegisterField wakeOnMotionInterruptEnabled;
263         private IFlagRegisterField pllReadyInterruptEnabled;
264         private IFlagRegisterField digitalMotionProcessorInterruptEnabled;
265         private IFlagRegisterField i2cMasterInterruptEnabled;
266         private IFlagRegisterField rawDataReadyInterruptEnabled;
267         private IFlagRegisterField fifoOverflowInterruptEnabled;
268         private IFlagRegisterField fifoWatermarkInterruptEnabled;
269         private IFlagRegisterField wakeOnMotionInterruptStatus;
270         private IFlagRegisterField pllReadyInterruptStatus;
271         private IFlagRegisterField digitalMotionProcessorInterruptStatus;
272         private IFlagRegisterField i2cMasterInterruptStatus;
273         private IFlagRegisterField rawDataReadyInterruptStatus;
274         private IFlagRegisterField fifoOverflowInterruptStatus;
275         private IFlagRegisterField fifoWatermarkInterruptStatus;
276         private IValueRegisterField[] externalSlaveSensorData = new IValueRegisterField[NumberOfExternalSlaveSensorDataRegisters];
277 
278         private enum GyroAccelUserBank0Registers : byte
279         {
280             WhoAmI = 0x0,
281             UserControl = 0x3,
282             LPConfig = 0x5,
283             PowerManagement1 = 0x6,
284             PowerManagement2 = 0x7,
285             InterruptPinConfig = 0xF,
286             InterruptEnable = 0x10,
287             InterruptEnable1 = 0x11,
288             InterruptEnable2 = 0x12,
289             InterruptEnable3 = 0x13,
290             I2CMstStatus = 0x17,
291             InterruptStatus = 0x19,
292             InterruptStatus1 = 0x1A,
293             InterruptStatus2 = 0x1B,
294             InterruptStatus3 = 0x1C,
295             DelayTimeHigh = 0x28,
296             DelayTimeLow = 0x29,
297             AccelerationXOutHigh = 0x2D,
298             AccelerationXOutLow = 0x2E,
299             AccelerationYOutHigh = 0x2F,
300             AccelerationYOutLow = 0x30,
301             AccelerationZOutHigh = 0x31,
302             AccelerationZOutLow = 0x32,
303             GyroscopeXOutHigh = 0x33,
304             GyroscopeXOutLow = 0x34,
305             GyroscopeYOutHigh = 0x35,
306             GyroscopeYOutLow = 0x36,
307             GyroscopeZOutHigh = 0x37,
308             GyroscopeZOutLow = 0x38,
309             TemperatureOutHigh = 0x39,
310             TemperatureOutLow = 0x3A,
311             ExtSlvSensorData0 = 0x3B,
312             ExtSlvSensorData1 = 0x3C,
313             ExtSlvSensorData2 = 0x3D,
314             ExtSlvSensorData3 = 0x3E,
315             ExtSlvSensorData4 = 0x3F,
316             ExtSlvSensorData5 = 0x40,
317             ExtSlvSensorData6 = 0x41,
318             ExtSlvSensorData7 = 0x42,
319             ExtSlvSensorData8 = 0x43,
320             ExtSlvSensorData9 = 0x44,
321             ExtSlvSensorData10 = 0x45,
322             ExtSlvSensorData11 = 0x46,
323             ExtSlvSensorData12 = 0x47,
324             ExtSlvSensorData13 = 0x48,
325             ExtSlvSensorData14 = 0x49,
326             ExtSlvSensorData15 = 0x4A,
327             ExtSlvSensorData16 = 0x4B,
328             ExtSlvSensorData17 = 0x4C,
329             ExtSlvSensorData18 = 0x4D,
330             ExtSlvSensorData19 = 0x4E,
331             ExtSlvSensorData20 = 0x4F,
332             ExtSlvSensorData21 = 0x50,
333             ExtSlvSensorData22 = 0x51,
334             ExtSlvSensorData23 = 0x52,
335             FifoEnable1 = 0x66,
336             FifoEnable2 = 0x67,
337             FifoReset = 0x68,
338             FifoMode = 0x69,
339             FifoCountHigh = 0x70,
340             FifoCountLow = 0x71,
341             FifoRW = 0x72,
342             DataReadyStatus = 0x74,
343             FifoConfig = 0x76,
344             RegisterBankSelection = 0x7F,
345         }
346     }
347 }
348