示例#1
0
        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();
            }
        }
示例#2
0
        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);
        }