private void ManagePeripheral(PeripheralDisableInfo info) { if (!info.Address.HasValue) { this.Log(LogLevel.Warning, "Cannot manage peripheral {0} because of invalid address.", info.Name); return; } var peripheral = sysbus.WhatPeripheralIsAt(info.Address.Value); if (peripheral == null) { this.Log(LogLevel.Warning, "Cannot manage peripheral {0} because it is not registered.", info.Name); return; } if ((info.Type & DisableType.Clock) == 0) { this.Log(LogLevel.Debug, "Enabling peripheral {0}.", info.Name); sysbus.EnablePeripheral(peripheral); } else { this.Log(LogLevel.Debug, "Disabling peripheral {0}.", info.Name); sysbus.DisablePeripheral(peripheral); } if ((info.Type & DisableType.SoftReset) != 0) { this.Log(LogLevel.Debug, "Resetting peripheral {0}.", info.Name); peripheral.Reset(); } }
public PSE_Sysreg(Machine machine) { sysbus = machine.SystemBus; peripheralMap = new PeripheralDisableInfo[] { new PeripheralDisableInfo { Address = 0x20200000, Name = "ENVM" }, new PeripheralDisableInfo { Address = 0x20110000, Name = "MAC0" }, new PeripheralDisableInfo { Address = 0x20112000, Name = "MAC1" }, new PeripheralDisableInfo { Address = 0x20008000, Name = "MMC" }, new PeripheralDisableInfo { Address = 0x20125000, Name = "TIMER" }, new PeripheralDisableInfo { Address = 0x20000000, Name = "MMUART0" }, new PeripheralDisableInfo { Address = 0x20100000, Name = "MMUART1" }, new PeripheralDisableInfo { Address = 0x20102000, Name = "MMUART2" }, new PeripheralDisableInfo { Address = 0x20104000, Name = "MMUART3" }, new PeripheralDisableInfo { Address = 0x20106000, Name = "MMUART4" }, new PeripheralDisableInfo { Address = 0x20108000, Name = "SPI0" }, new PeripheralDisableInfo { Address = 0x20109000, Name = "SPI1" }, new PeripheralDisableInfo { Address = 0x2010A000, Name = "I2C0" }, new PeripheralDisableInfo { Address = 0x2010B000, Name = "I2C1" }, new PeripheralDisableInfo { Address = 0x2010C000, Name = "CAN0" }, new PeripheralDisableInfo { Address = 0x2010D000, Name = "CAN1" }, new PeripheralDisableInfo { Address = 0x20201000, Name = "USB" }, new PeripheralDisableInfo { Address = null, Name = "FPGA" }, new PeripheralDisableInfo { Address = 0x20124000, Name = "MSRTC" }, new PeripheralDisableInfo { Address = 0x21000000, Name = "QSPI" }, new PeripheralDisableInfo { Address = 0x20120000, Name = "GPIO0" }, new PeripheralDisableInfo { Address = 0x20121000, Name = "GPIO1" }, new PeripheralDisableInfo { Address = 0x20122000, Name = "GPIO2" }, new PeripheralDisableInfo { Address = 0x20080000, Name = "DDRC" }, new PeripheralDisableInfo { Address = null, Name = "FIC0" }, new PeripheralDisableInfo { Address = null, Name = "FIC1" }, new PeripheralDisableInfo { Address = null, Name = "FIC2" }, new PeripheralDisableInfo { Address = null, Name = "FIC3" }, new PeripheralDisableInfo { Address = 0x22000000, Name = "ATHENA" }, new PeripheralDisableInfo { Address = null, Name = "CFM" }, new PeripheralDisableInfo { Address = null, Name = "SGMII" }, }; var registersMap = new Dictionary <long, DoubleWordRegister> { // Enables the clock to the MSS peripheral. When the clock is off the peripheral should not be accessed. { (long)Registers.SubblkClockCr, new DoubleWordRegister(this) .WithFlag(0, writeCallback: (_, val) => ManageClock(val, 0), name: "ENVM") .WithFlag(1, writeCallback: (_, val) => ManageClock(val, 1), name: "MAC0") .WithFlag(2, writeCallback: (_, val) => ManageClock(val, 2), name: "MAC1") .WithFlag(3, writeCallback: (_, val) => ManageClock(val, 3), name: "MMC") .WithFlag(4, writeCallback: (_, val) => ManageClock(val, 4), name: "TIMER") .WithFlag(5, writeCallback: (_, val) => ManageClock(val, 5), name: "MMUART0") .WithFlag(6, writeCallback: (_, val) => ManageClock(val, 6), name: "MMUART1") .WithFlag(7, writeCallback: (_, val) => ManageClock(val, 7), name: "MMUART2") .WithFlag(8, writeCallback: (_, val) => ManageClock(val, 8), name: "MMUART3") .WithFlag(9, writeCallback: (_, val) => ManageClock(val, 9), name: "MMUART4") .WithFlag(10, writeCallback: (_, val) => ManageClock(val, 10), name: "SPI0") .WithFlag(11, writeCallback: (_, val) => ManageClock(val, 11), name: "SPI1") .WithFlag(12, writeCallback: (_, val) => ManageClock(val, 12), name: "I2C0") .WithFlag(13, writeCallback: (_, val) => ManageClock(val, 13), name: "I2C1") .WithFlag(14, writeCallback: (_, val) => ManageClock(val, 14), name: "CAN0") .WithFlag(15, writeCallback: (_, val) => ManageClock(val, 15), name: "CAN1") .WithFlag(16, writeCallback: (_, val) => ManageClock(val, 16), name: "USB") .WithTag("FPGA", 17, 1) .WithFlag(18, writeCallback: (_, val) => ManageClock(val, 18), name: "MSRTC") .WithFlag(19, writeCallback: (_, val) => ManageClock(val, 19), name: "QSPI") .WithFlag(20, writeCallback: (_, val) => ManageClock(val, 20), name: "GPIO0") .WithFlag(21, writeCallback: (_, val) => ManageClock(val, 21), name: "GPIO1") .WithFlag(22, writeCallback: (_, val) => ManageClock(val, 22), name: "GPIO2") .WithFlag(23, writeCallback: (_, val) => ManageClock(val, 23), name: "DDRC") .WithTag("FIC0", 24, 1) .WithTag("FIC1", 25, 1) .WithTag("FIC2", 26, 1) .WithTag("FIC3", 27, 1) .WithFlag(28, writeCallback: (_, val) => ManageClock(val, 28), name: "ATHENA") .WithTag("CFM", 29, 1) .WithReservedBits(30, 1) .WithReservedBits(31, 1) }, // Holds the MSS peripherals in reset. When in reset the peripheral should not be accessed. { (long)Registers.SoftResetCr, new DoubleWordRegister(this, 0x7FFFFFFE) .WithFlag(0, writeCallback: (_, val) => ManageSoftReset(val, 0), name: "ENVM") .WithFlag(1, writeCallback: (_, val) => ManageSoftReset(val, 1), name: "MAC0") .WithFlag(2, writeCallback: (_, val) => ManageSoftReset(val, 2), name: "MAC1") .WithFlag(3, writeCallback: (_, val) => ManageSoftReset(val, 3), name: "MMC") .WithFlag(4, writeCallback: (_, val) => ManageSoftReset(val, 4), name: "TIMER") .WithFlag(5, writeCallback: (_, val) => ManageSoftReset(val, 5), name: "MMUART0") .WithFlag(6, writeCallback: (_, val) => ManageSoftReset(val, 6), name: "MMUART1") .WithFlag(7, writeCallback: (_, val) => ManageSoftReset(val, 7), name: "MMUART2") .WithFlag(8, writeCallback: (_, val) => ManageSoftReset(val, 8), name: "MMUART3") .WithFlag(9, writeCallback: (_, val) => ManageSoftReset(val, 9), name: "MMUART4") .WithFlag(10, writeCallback: (_, val) => ManageSoftReset(val, 10), name: "SPI0") .WithFlag(11, writeCallback: (_, val) => ManageSoftReset(val, 11), name: "SPI1") .WithFlag(12, writeCallback: (_, val) => ManageSoftReset(val, 12), name: "I2C0") .WithFlag(13, writeCallback: (_, val) => ManageSoftReset(val, 13), name: "I2C1") .WithFlag(14, writeCallback: (_, val) => ManageSoftReset(val, 14), name: "CAN0") .WithFlag(15, writeCallback: (_, val) => ManageSoftReset(val, 15), name: "CAN1") .WithFlag(16, writeCallback: (_, val) => ManageSoftReset(val, 16), name: "USB") .WithTag("FPGA", 17, 1) .WithFlag(18, writeCallback: (_, val) => ManageSoftReset(val, 18), name: "MSRTC") .WithFlag(19, writeCallback: (_, val) => ManageSoftReset(val, 19), name: "QSPI") .WithFlag(20, writeCallback: (_, val) => ManageSoftReset(val, 20), name: "GPIO0") .WithFlag(21, writeCallback: (_, val) => ManageSoftReset(val, 21), name: "GPIO1") .WithFlag(22, writeCallback: (_, val) => ManageSoftReset(val, 22), name: "GPIO2") .WithFlag(23, writeCallback: (_, val) => ManageSoftReset(val, 23), name: "DDRC") .WithTag("FIC0", 24, 1) .WithTag("FIC1", 25, 1) .WithTag("FIC2", 26, 1) .WithTag("FIC3", 27, 1) .WithFlag(28, writeCallback: (_, val) => ManageSoftReset(val, 28), name: "ATHENA") .WithTag("CFM", 29, 1) .WithTag("SGMII", 30, 1) .WithReservedBits(31, 1) } }; registers = new DoubleWordRegisterCollection(this, registersMap); }