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