Esempio n. 1
0
        public DA1468x_GPREG(Machine machine)
        {
            var registersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.SetFreeze, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "FRZ_WKUPTIM")
                  .WithFlag(1, name: "FRZ_SWTIM0")
                  .WithFlag(2, name: "FRZ_BLETIM")
                  .WithFlag(3, name: "FRZ_WDOG")
                  .WithFlag(4, name: "FRZ_USB")
                  .WithFlag(5, name: "FRZ_DMA")
                  .WithFlag(6, name: "FRZ_SWTIM1")
                  .WithFlag(7, name: "FRZ_SWTIM2")
                  .WithReservedBits(8, 8) },
                { (long)Registers.ResetFreeze, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "FRZ_WKUPTIM")
                  .WithFlag(1, name: "FRZ_SWTIM0")
                  .WithFlag(2, name: "FRZ_BLETIM")
                  .WithFlag(3, name: "FRZ_WDOG")
                  .WithFlag(4, name: "FRZ_USB")
                  .WithFlag(5, name: "FRZ_DMA")
                  .WithFlag(6, name: "FRZ_SWTIM1")
                  .WithFlag(7, name: "FRZ_SWTIM2")
                  .WithReservedBits(8, 8) },
                { (long)Registers.PllSysCtrl1, new WordRegister(this, 0x100)
                  .WithFlag(0, out pllEnable, name: "PLL_EN")
                  .WithFlag(1, out ldoPllEnable, name: "LDO_PLL_ENABLE")
                  .WithFlag(2, name: "LDO_PLL_VREF_HOLD")
                  .WithReservedBits(3, 5)
                  .WithValueField(8, 7, name: "PLL_R_DIV")
                  .WithReservedBits(15, 1) },
                { (long)Registers.PllSysCtrl2, new WordRegister(this, 0x26)
                  .WithValueField(0, 7, name: "PLL_N_DIV")
                  .WithReservedBits(7, 5)
                  .WithValueField(12, 2, name: "PLL_DEL_SEL")
                  .WithFlag(14, name: "PLL_SEL_MIN_CUR_INT")
                  .WithReservedBits(15, 1) },
                { (long)Registers.PllSysStatus, new WordRegister(this, 0x3)
                  .WithFlag(0, name: "PLL_LOCK_FINE", mode: FieldMode.Read, valueProviderCallback: (_) => pllEnable.Value)
                  .WithFlag(1, name: "LDO_PLL_OK", mode: FieldMode.Read, valueProviderCallback: (_) => ldoPllEnable.Value)
                  .WithReservedBits(2, 3)
                  .WithTag("PLL_BEST_MIN_CUR", 5, 6)
                  .WithTaggedFlag("PLL_CALIBR_END", 11)
                  .WithReservedBits(12, 4) },
            };

            registers = new WordRegisterCollection(this, registersMap);
        }
Esempio n. 2
0
        private void CreateRegisters()
        {
            var registerMap = new Dictionary <long, ByteRegister>
            {
                { (long)Registers.ErrorWPC, new ByteRegister(this)
                  .WithTaggedFlag("Bad block detected", 7)
                  .WithTaggedFlag("Uncorrectable ECC error", 6)
                  .WithReservedBits(5, 1)
                  .WithTaggedFlag("ID found", 4)
                  .WithReservedBits(3, 1)
                  .WithTaggedFlag("Command completed", 2)
                  .WithTaggedFlag("Track 000 not found", 1)
                  .WithTaggedFlag("DAM not found", 0) },
                //Four following registers are used only for device enumeration purposes.
                //They must preserve values, otherwise the firmware will assume that selected device is not present.
                { (long)Registers.SectorCount, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Sector count") },
                { (long)Registers.SectorNumber, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Sector number") },
                { (long)Registers.CylinderLow, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Cyliner Low") },
                { (long)Registers.CylinderHigh, new ByteRegister(this)
                  .WithValueField(0, 8, name: "Cylinder High") },
                { (long)Registers.DriveHead, new ByteRegister(this, 0xA0)
                  .WithValueField(0, 3, name: "Head select bits")
                  .WithFlag(4, writeCallback: (_, flag) => SelectDevice(flag ? Device.Slave : Device.Master), name: "Drive select")
                  .WithFlag(5, FieldMode.Read, name: "Fixed bit 1")
                  .WithFlag(6, FieldMode.Read, name: "Fixed bit 2")
                  .WithFlag(7, FieldMode.Read, name: "Fixed bit 3") },
                { (long)Registers.StatusCommand, new ByteRegister(this, 0x50)
                  .WithValueField(0, 8, writeCallback: (_, value) => ExecuteCommand((Command)value),
                                  valueProviderCallback: _ =>
                    {
                        return((packetTransmission || (selectedDevice?.DataReady ?? false)) ?
                               (uint)StatusCodes.DataRequest : 0);
                    }, name: "Command") },
            };

            var dataRegistersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.DataRegister, new WordRegister(this)
                  .WithValueField(0, 16, writeCallback: (_, value) => WriteData((ushort)value),
                                  valueProviderCallback: _ => ReadData(), name: "Data") },
            };

            registers     = new ByteRegisterCollection(this, registerMap);
            dataRegisters = new WordRegisterCollection(this, dataRegistersMap);
        }
Esempio n. 3
0
        public DA1468x_USB(Machine machine)
        {
            var registersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.MainCtrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "USBEN")
                  .WithFlag(1, name: "USB_DBG")
                  .WithReservedBits(2, 1)
                  .WithFlag(3, name: "USB_NAT")
                  .WithFlag(4, name: "LSMODE")
                  .WithReservedBits(5, 11) },
                { (long)Registers.MainMask, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "USB_M_WARN")
                  .WithFlag(1, name: "USB_M_ALT")
                  .WithFlag(2, name: "USB_M_TX_EV")
                  .WithFlag(3, name: "USB_M_FRAME")
                  .WithFlag(4, name: "USB_M_NAK")
                  .WithFlag(5, name: "USB_M_ULD")
                  .WithFlag(6, name: "USB_M_RX_EV")
                  .WithFlag(7, name: "USB_M_INTR")
                  .WithFlag(8, name: "USB_M_EP0_TX")
                  .WithFlag(9, name: "USB_M_EP0_RX")
                  .WithFlag(10, name: "USB_M_EP0_NAK")
                  .WithFlag(11, name: "USB_M_CH_EV")

                  .WithReservedBits(12, 4) },
                { (long)Registers.ChargerCtrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "USB_CHARGE_ON")
                  .WithFlag(1, name: "IDP_SRC_ON")
                  .WithFlag(2, name: "VDP_SRC_ON")
                  .WithFlag(3, name: "VDM_SRC_ON")
                  .WithFlag(4, name: "IDP_SNK_ON")
                  .WithFlag(5, name: "IDM_SNK_ON")
                  .WithReservedBits(6, 10) },
                { (long)Registers.ChargerStat, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "USB_DCP_DET")
                  .WithFlag(1, name: "USB_CHG_DET")
                  .WithFlag(2, name: "USB_DP_VAL")
                  .WithFlag(3, name: "USB_DM_VAL")
                  .WithFlag(4, name: "USB_DP_VAL2")
                  .WithFlag(5, name: "USB_DM_VAL2")
                  .WithReservedBits(6, 10) },
            };

            registers = new WordRegisterCollection(this, registersMap);
        }
        public PSE_USB(Machine machine, ControllerMode mode = ControllerMode.Host) : base(machine)
        {
            this.mode = mode;

            addressToDeviceCache = new TwoWayDictionary <byte, IUSBDevice>();

            fifoFromDeviceToHost         = new Queue <byte> [NumberOfEndpoints];
            fifoFromHostToDevice         = new Queue <byte> [NumberOfEndpoints];
            receiveDeviceAddress         = new IValueRegisterField[NumberOfEndpoints];
            transmitDeviceAddress        = new IValueRegisterField[NumberOfEndpoints];
            requestInTransaction         = new IFlagRegisterField[NumberOfEndpoints];
            transmitTargetEndpointNumber = new IValueRegisterField[NumberOfEndpoints];
            receiveTargetEndpointNumber  = new IValueRegisterField[NumberOfEndpoints];

            for (var i = 0; i < NumberOfEndpoints; i++)
            {
                fifoFromDeviceToHost[i] = new Queue <byte>();
                fifoFromHostToDevice[i] = new Queue <byte>();
            }

            MainIRQ = new GPIO();
            DmaIRQ  = new GPIO();

            byteRegisters       = new ByteRegisterCollection(this);
            wordRegisters       = new WordRegisterCollection(this);
            doubleWordRegisters = new DoubleWordRegisterCollection(this);

            var gate = new GPIOGate(MainIRQ);

            usbInterruptsManager = new InterruptManager <UsbInterrupt>(this, gate.GetGPIO(), "main");
            txInterruptsManager  = new InterruptManager <TxInterrupt>(this, gate.GetGPIO(), "main");
            rxInterruptsManager  = new InterruptManager <RxInterrupt>(this, gate.GetGPIO(), "main");

            DefineCommonRegisters();
            DefineIndexedRegisters();
            DefineFifoRegisters();
            DefineControlAndStatusRegisters();
            DefineNonIndexedEndpointControlAndStatusRegisters();
            DefineMultipointControlAndStatusRegisters();

            ResetInterrupts();
        }
        public DA1468x_DMA(Machine machine)
        {
            var registersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.Dma0Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma1Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma2Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma3Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma4Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma5Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma6Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Dma7Ctrl, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "DMA_ON")
                  .WithValueField(1, 2, name: "BW")
                  .WithFlag(3, name: "IRQ_ENABLE")
                  .WithFlag(4, name: "DREQ_MODE")
                  .WithFlag(5, name: "BINC")
                  .WithFlag(6, name: "AINC")
                  .WithFlag(7, name: "CIRCULAR")
                  .WithValueField(8, 3, name: "DMA_PRIO")
                  .WithFlag(11, name: "DMA_IDLE")
                  .WithFlag(12, name: "DMA_INT")
                  .WithReservedBits(13, 3) },
            };

            registers = new WordRegisterCollection(this, registersMap);
        }
Esempio n. 6
0
        public ENC28J60()
        {
            sync = new object();
            ResetPointers();

            var econ1 = new ByteRegister(this).WithValueField(0, 2, out currentBank, name: "BSEL")
                        .WithFlag(2, out ethernetReceiveEnabled, name: "RXEN")
                        .WithFlag(3, FieldMode.Read, writeCallback: (_, value) => { if (value)
                                                                                    {
                                                                                        TransmitPacket();
                                                                                    }
                                  }, name: "TXRTS")
                        .WithFlag(7, name: "TXRST");

            var econ2 = new ByteRegister(this, 0x80).WithFlag(6, FieldMode.Read, writeCallback: delegate {
                waitingPacketCount = Math.Max(0, waitingPacketCount - 1);
                RefreshInterruptStatus();
            }, name: "PKTDEC")
                        .WithFlag(7, out autoIncrement, name: "AUTOINC");

            var estat = new ByteRegister(this, 1).WithReadCallback(delegate { transmitPacketInterrupt.Value = false; RefreshInterruptStatus(); }) // not sure
                        .WithFlag(0, FieldMode.Read, name: "CLKRDY");                                                                             // we're always ready, so the reset value is 1

            var eie = new ByteRegister(this).WithFlag(3, out transmitPacketInterruptEnabled, writeCallback: delegate { RefreshInterruptStatus(); }, name: "TXIE")
                      .WithFlag(6, out receivePacketInterruptEnabled, writeCallback: delegate { RefreshInterruptStatus(); }, name: "PKTIE")
                      .WithFlag(7, out interruptsEnabled, writeCallback: delegate { RefreshInterruptStatus(); }, name: "INTIE");

            var eir = new ByteRegister(this).WithFlag(0, name: "RXERIF")
                      .WithFlag(3, out transmitPacketInterrupt, writeCallback: delegate { RefreshInterruptStatus(); }, name: "TXIF")
                      .WithFlag(6, FieldMode.Read, valueProviderCallback: _ => IsReceiveInterruptActive(), name: "PKTIF");

            var bank0Map = new Dictionary <long, ByteRegister>
            {
                // ERDPTL
                { 0x00, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(bufferReadPointer),
                                                              writeCallback: (_, value) => SetLowByteOf(ref bufferReadPointer, (byte)value)) },

                // ERDPTH
                { 0x01, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(bufferReadPointer),
                                                              writeCallback: (_, value) => SetHighByteOf(ref bufferReadPointer, (byte)value)) },

                // EWRPTL
                { 0x02, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(bufferWritePointer),
                                                              writeCallback: (_, value) => SetLowByteOf(ref bufferWritePointer, (byte)value)) },

                // EWRPTH
                { 0x03, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(bufferWritePointer),
                                                              writeCallback: (_, value) => SetHighByteOf(ref bufferWritePointer, (byte)value)) },

                // ETXSTL
                { 0x04, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(transmitBufferStart),
                                                              writeCallback: (_, value) => SetLowByteOf(ref transmitBufferStart, (byte)value)) },

                // ETXSTH
                { 0x05, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(transmitBufferStart),
                                                              writeCallback: (_, value) => SetHighByteOf(ref transmitBufferStart, (byte)value)) },

                // ETXNDL
                { 0x06, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(transmitBufferEnd),
                                                              writeCallback: (_, value) => SetLowByteOf(ref transmitBufferEnd, (byte)value)) },

                // ETXNDH
                { 0x07, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(transmitBufferEnd),
                                                              writeCallback: (_, value) => SetHighByteOf(ref transmitBufferEnd, (byte)value)) },

                // ERXSTL
                { 0x08, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(receiveBufferStart),
                                                              writeCallback: (_, value) => { SetLowByteOf(ref receiveBufferStart, (byte)value); currentReceiveWritePointer = receiveBufferStart; }) },

                // ERXSTH
                { 0x09, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(receiveBufferStart),
                                                              writeCallback: (_, value) => { SetHighByteOf(ref receiveBufferStart, (byte)value); currentReceiveWritePointer = receiveBufferStart; }) },

                // ERXNDL
                { 0x0A, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(receiveBufferEnd),
                                                              writeCallback: (_, value) => SetLowByteOf(ref receiveBufferEnd, (byte)value)) },

                // ERXNDH
                { 0x0B, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(receiveBufferEnd),
                                                              writeCallback: (_, value) => SetHighByteOf(ref receiveBufferEnd, (byte)value)) },

                // ERXRDPTL
                { 0x0C, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => GetLowByteOf(receiveReadPointer),
                                                              writeCallback: (_, value) => bufferedLowByteOfReceiveReadPointer = (byte)value) },

                // ERXRDPTH
                { 0x0D, new ByteRegister(this).WithValueField(0, 5, valueProviderCallback: _ => GetHighByteOf(receiveReadPointer),
                                                              writeCallback: (_, value) => receiveReadPointer = (int)(bufferedLowByteOfReceiveReadPointer | ((value << 8)))) }
            };

            var bank1Map = new Dictionary <long, ByteRegister>
            {
                // ERXFCON
                { 0x18, new ByteRegister(this, 0xA1).WithFlag(5, out crcEnabled, name: "CRCEN") },

                // EPKTCNT
                { 0x19, new ByteRegister(this).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: _ => (uint)waitingPacketCount) }
            };

            var bank2Map = new Dictionary <long, ByteRegister>
            {
                // MACON1
                // note that we currently ignore all the Pause Control Frame stuff
                { 0x00, new ByteRegister(this).WithFlag(0, out macReceiveEnabled, name: "MARXEN").WithFlag(2, name: "RXPAUS").WithFlag(3, name: "TXPAUS") },

                // MACON3
                { 0x02, new ByteRegister(this).WithFlag(0, name: "FULDPX") },

                // MABBIPG (too low level parameter for emulation)
                { 0x04, new ByteRegister(this).WithValueField(0, 7) },

                // MAIPGL (same as above)
                { 0x06, new ByteRegister(this).WithValueField(0, 7) },

                // MAIPGH (same as above)
                { 0x07, new ByteRegister(this).WithValueField(0, 7) },

                // MICMD
                { 0x12, new ByteRegister(this).WithFlag(0, writeCallback: (_, value) => { if (value)
                                                                                          {
                                                                                              ReadPhyRegister();
                                                                                          }
                                                        }, name: "MIIRD") },

                // MIREGADR
                { 0x14, new ByteRegister(this).WithValueField(0, 5, out miiRegisterAddress) },

                // MIWRL
                { 0x16, new ByteRegister(this).WithValueField(0, 8, out phyWriteLow) },

                // MIWRH
                { 0x17, new ByteRegister(this).WithValueField(0, 8, writeCallback: (_, value) => WritePhyRegister((ushort)(phyWriteLow.Value | (value << 8)))) },

                // MIRDL
                { 0x18, new ByteRegister(this).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: _ => (byte)lastReadPhyRegisterValue) },

                // MIRDH
                { 0x19, new ByteRegister(this).WithValueField(0, 8, FieldMode.Read, valueProviderCallback: _ => (byte)(lastReadPhyRegisterValue >> 8)) }
            };

            var bank3Map = new Dictionary <long, ByteRegister>
            {
                // MAADR5
                { 0x00, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => MAC.E, writeCallback: (_, value) => MAC = MAC.WithNewOctets(e: (byte)value)) },

                // MADDR6
                { 0x01, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => MAC.F, writeCallback: (_, value) => MAC = MAC.WithNewOctets(f: (byte)value)) },

                // MADDR3
                { 0x02, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => MAC.C, writeCallback: (_, value) => MAC = MAC.WithNewOctets(c: (byte)value)) },

                // MADDR4
                { 0x03, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => MAC.D, writeCallback: (_, value) => MAC = MAC.WithNewOctets(d: (byte)value)) },

                // MADDR1
                { 0x04, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => MAC.A, writeCallback: (_, value) => MAC = MAC.WithNewOctets(a: (byte)value)) },

                // MADDR2
                { 0x05, new ByteRegister(this).WithValueField(0, 8, valueProviderCallback: _ => MAC.B, writeCallback: (_, value) => MAC = MAC.WithNewOctets(b: (byte)value)) },

                // MISTAT
                { 0x0A, new ByteRegister(this).WithFlag(0, FieldMode.Read, name: "BUSY") } // we're never busy
            };

            var maps = new[] { bank0Map, bank1Map, bank2Map, bank3Map };

            // registers below are available in all banks
            foreach (var map in maps)
            {
                map.Add(0x1B, eie);   // EIE
                map.Add(0x1C, eir);   // EIR
                map.Add(0x1D, estat); // ESTAT
                map.Add(0x1E, econ2); // ECON2
                map.Add(0x1F, econ1); // ECON1
            }
            registers = maps.Select(x => new ByteRegisterCollection(this, x)).ToArray();

            ethernetBuffer = new byte[8.KB()];

            phyRegisters = new WordRegisterCollection(this, new Dictionary <long, WordRegister>
            {
                // PHCON1
                { 0x00, new WordRegister(this).WithFlag(8, name: "PDPXMD") }, // full duplex stuff, ignored

                // PHCON2
                { 0x10, new WordRegister(this) }
            });
            IRQ = new GPIO();
            IRQ.Set(); // the interrupt output is negated
        }
        public DA1468x_WKUP(Machine machine)
        {
            IRQ = new GPIO();
            var registersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.Ctrl, new WordRegister(this, 0x0)
                  .WithValueField(0, 5, name: "WKUP_DEB_VALUE")
                  .WithTaggedFlag("WKUP_SFT_KEYHIT", 6)
                  .WithFlag(7, name: "WKUP_ENABLE_IRQ", writeCallback: (_, value) => irqEnable = value)
                  .WithReservedBits(8, 8) },
                { (long)Registers.Compare, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "COMPARE")
                  .WithReservedBits(8, 8) },
                { (long)Registers.ResetIrq, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "WKUP_IRQ_RESET", mode: FieldMode.Write, writeCallback: (_, value) =>
                    {
                        eventsCounter = 0;
                        irqEnable     = false;
                    }) },
                { (long)Registers.Counter, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "EVENT_VALUE", mode: FieldMode.Read, valueProviderCallback: (_) => eventsCounter)
                  .WithReservedBits(8, 8) },
                { (long)Registers.ResetCounter, new WordRegister(this, 0x0)
                  .WithValueField(0, 15, name: "WKUP_CNTR_RST", mode: FieldMode.Write, writeCallback: (_, value) =>
                    {
                        eventsCounter = 0;
                    }) },
                { (long)Registers.SelectP0, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_SELECT_P0")
                  .WithReservedBits(8, 8) },
                { (long)Registers.SelectP1, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_SELECT_P1")
                  .WithReservedBits(8, 8) },
                { (long)Registers.SelectP2, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_SELECT_P2")
                  .WithReservedBits(8, 8) },
                { (long)Registers.SelectP3, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_SELECT_P3")
                  .WithReservedBits(8, 8) },
                { (long)Registers.SelectP4, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_SELECT_P4")
                  .WithReservedBits(8, 8) },
                { (long)Registers.PolarityP0, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_POL_P0")
                  .WithReservedBits(8, 8) },
                { (long)Registers.PolarityP1, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_POL_P1")
                  .WithReservedBits(8, 8) },
                { (long)Registers.PolarityP2, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_POL_P2")
                  .WithReservedBits(8, 8) },
                { (long)Registers.PolarityP3, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_POL_P3")
                  .WithReservedBits(8, 8) },
                { (long)Registers.PolarityP4, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "WKUP_POL_P4")
                  .WithReservedBits(8, 8) },
            };

            registers = new WordRegisterCollection(this, registersMap);
        }
        public DA1468x_CRG(Machine machine)
        {
            Xtal16Interrupt  = new GPIO();
            VbusRdyInterrupt = new GPIO();
            var registersMap = new Dictionary <long, WordRegister>
            {
                { (long)Registers.ClkAmba, new WordRegister(this, 0x22)
                  .WithValueField(0, 3, name: "HCLK_DIV")
                  .WithReservedBits(3, 1)
                  .WithValueField(4, 2, name: "PCLK_DIV")
                  .WithTaggedFlag("AES_CLK_ENABLE", 6)
                  .WithTaggedFlag("ECC_CLK_ENABLE", 7)
                  .WithTaggedFlag("TRNG_CLK_ENABLE", 8)
                  .WithFlag(9, name: "OTP_ENABLE")
                  .WithValueField(10, 2, name: "QSPI_DIV")
                  .WithFlag(12, name: "QSPI_ENABLE")
                  .WithReservedBits(13, 3) },
                { (long)Registers.ClkFreqTrim, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "FINE_ADJ")
                  .WithValueField(8, 3, name: "COARSE_ADJ")
                  .WithReservedBits(11, 5) },
                { (long)Registers.ClkRadio, new WordRegister(this, 0x0)
                  .WithValueField(0, 2, name: "RFCU_DIV")
                  .WithReservedBits(2, 1)
                  .WithFlag(3, name: "RFCU_ENABLE")
                  .WithValueField(4, 2, name: "BLE_DIV")
                  .WithFlag(6, name: "BLE_LP_RESET")
                  .WithFlag(7, name: "BLE_ENABLE")
                  .WithReservedBits(8, 8) },
                { (long)Registers.ClkCtrl, new WordRegister(this, 0x2001)
                  .WithEnumField <WordRegister, SysClkSel>(0, 2, name: "SYS_CLK_SEL",
                                                           writeCallback: (_, val) => ClockSelection = val,
                                                           valueProviderCallback: _ => ClockSelection)
                  .WithFlag(2, name: "XTAL16M_DISABLE", writeCallback: (_, val) =>
                    {
                        this.Log(LogLevel.Warning, "XTAL16M_DISABLE = {0}", val);
                        if (!val)
                        {
                            Xtal16Interrupt.Blink();
                        }
                    })
                  .WithTaggedFlag("XTAL32M_MODE", 3)
                  .WithTaggedFlag("USB_CLK_SRC", 4)
                  .WithTaggedFlag("PLL_DIV2", 5)
                  .WithTaggedFlag("DIVN_XTAL32M_MODE", 6)
                  .WithTaggedFlag("DIVN_SYNC_LEVEL", 7)
                  .WithValueField(8, 2, name: "CLK32K_SOURCE")
                  .WithReservedBits(10, 2)
                  .WithFlag(12, FieldMode.Read, name: "RUNNING_AT_32K", valueProviderCallback: _ => ClockSelection == SysClkSel.LowPower)
                  .WithFlag(13, FieldMode.Read, name: "RUNNING_AT_RC16M", valueProviderCallback: _ => ClockSelection == SysClkSel.RC16M)
                  .WithFlag(14, FieldMode.Read, name: "RUNNING_AT_XTAL16M", valueProviderCallback: _ => ClockSelection == SysClkSel.XTAL16M)
                  .WithFlag(15, FieldMode.Read, name: "RUNNING_AT_PLL96M", valueProviderCallback: _ => ClockSelection == SysClkSel.Pll96Mhz) },
                { (long)Registers.ClkTmr, new WordRegister(this, 0x0)
                  .WithValueField(0, 2, name: "TMR0_DIV")
                  .WithFlag(2, name: "TMR0_ENABLE")
                  .WithFlag(3, name: "TMR0_CLK_SEL")
                  .WithValueField(4, 2, name: "TMR1_DIV")
                  .WithFlag(6, name: "TMR1_ENABLE")
                  .WithFlag(7, name: "TMR1_CLK_SEL")
                  .WithValueField(8, 2, name: "TMR2_DIV")
                  .WithFlag(10, name: "TMR2_ENABLE")
                  .WithFlag(11, name: "TMR2_CLK_SEL")
                  .WithTaggedFlag("BREATH_ENABLE", 12)
                  .WithTaggedFlag("WAKEUPCT_ENABLE", 13)
                  .WithTaggedFlag("P06_TMR1_PWM_MODE", 14)
                  .WithReservedBits(15, 1) },
                { (long)Registers.PmuCtrl, new WordRegister(this, 0xF)
                  .WithFlag(0, name: "PERIPH_SLEEP", writeCallback: (_, val) => PeriphSleep = val, valueProviderCallback: _ => PeriphSleep)
                  .WithFlag(1, name: "RADIO_SLEEP", writeCallback: (_, val) => RadioSleep   = val, valueProviderCallback: _ => RadioSleep)
                  .WithFlag(2, name: "BLE_SLEEP", writeCallback: (_, val) => BleSleep       = val, valueProviderCallback: _ => BleSleep)
                  .WithReservedBits(3, 1)
                  .WithTaggedFlag("MAP_BANDGAP_EN", 4)
                  .WithFlag(5, name: "RESET_ON_WAKEUP")
                  .WithTag("OTP_COPY_DIV", 6, 2)
                  .WithValueField(8, 5, name: "RETAIN_RAM")
                  .WithFlag(13, name: "ENABLE_CLKLESS")
                  .WithFlag(14, name: "RETAIN_CACHE")
                  .WithTaggedFlag("RETAIN_ECCRAM", 15) },
                { (long)Registers.SysCtrl, new WordRegister(this, 0x20)
                  .WithValueField(0, 3, name: "REMAP_ADR0")
                  .WithValueField(3, 2, name: "REMAP_RAMS")
                  .WithFlag(5, name: "PAD_LATCH_EN")
                  .WithFlag(6, name: "OTPC_RESET_REQ")
                  .WithFlag(7, name: "DEBUGGER_ENABLE")
                  .WithTaggedFlag("DRA_OFF", 8)
                  .WithTaggedFlag("TIMEOUT_DISABLE", 9)
                  .WithTaggedFlag("CACHERAM_MUX", 10)
                  .WithTaggedFlag("DEV_PHASE", 11)
                  .WithFlag(12, name: "QSPI_INIT")
                  .WithTaggedFlag("OTP_COPY", 13)
                  .WithTaggedFlag("REMAP_INTVEC", 14)
                  .WithTaggedFlag("SW_RESET", 15) },
                { (long)Registers.SysStat, new WordRegister(this, 0x5C5)     //ReadOnly
                  .WithFlag(0, name: "RAD_IS_DOWN", valueProviderCallback: _ => RadioSleep == true)
                  .WithFlag(1, name: "RAD_IS_UP", valueProviderCallback: _ => RadioSleep == false)
                  .WithFlag(2, name: "PER_IS_DOWN", valueProviderCallback: _ => PeriphSleep == true)
                  .WithFlag(3, name: "PER_IS_UP", valueProviderCallback: _ => PeriphSleep == false)
                  .WithTaggedFlag("XTAL16_SW2", 4)
                  .WithFlag(5, name: "DBG_IS_ACTIVE")
                  .WithFlag(6, name: "XTAL16_TRIM_READY")
                  .WithFlag(7, name: "XTAL16_SETTLE_READY")
                  .WithFlag(8, name: "BLE_IS_DOWN", valueProviderCallback: _ => BleSleep == true)
                  .WithFlag(9, name: "BLE_IS_UP", valueProviderCallback: _ => BleSleep == false)
                  .WithReservedBits(10, 6) },
                { (long)Registers.Clk32K, new WordRegister(this, 0x7AE)
                  .WithFlag(0, name: "XTAL32K_ENABLE")
                  .WithValueField(1, 2, name: "XTAL32K_RBIAS")
                  .WithValueField(3, 4, name: "XTAL32K_CUR")
                  .WithFlag(7, name: "RC32K_ENABLE")
                  .WithValueField(8, 4, name: "RC32K_TRIM")
                  .WithFlag(12, name: "XTAL32K_DISABLE_AMPREG")
                  .WithReservedBits(13, 3) },
                { (long)Registers.Clk16M, new WordRegister(this, 0x54A0)
                  .WithFlag(0, name: "RC16M_ENABLE")
                  .WithValueField(1, 4, name: "RC16M_TRIM")
                  .WithValueField(5, 3, name: "XTAL16_CUR_SET")
                  .WithTaggedFlag("XTAL16_MAX_CURRENT", 8)
                  .WithTaggedFlag("XTAL16_EXT_CLK_ENABLE", 9)
                  .WithValueField(10, 3, name: "XTAL16_AMP_TRIM")
                  .WithFlag(13, name: "XTAL16_SPIKE_FLT_BYPASS")
                  .WithFlag(14, name: "XTAL16_HPASS_FLT_EN")
                  .WithReservedBits(15, 1) },
                { (long)Registers.ClkRCX20K, new WordRegister(this, 0x4C2)
                  .WithValueField(0, 4, name: "RCX20K_TRIM")
                  .WithValueField(4, 4, name: "RCX20K_NTC")
                  .WithValueField(8, 2, name: "RCX20K_BIAS")
                  .WithFlag(10, name: "RCX20K_LOWF")
                  .WithFlag(11, name: "RCX20K_ENABLE")
                  .WithReservedBits(12, 4) },
                { (long)Registers.BandGap, new WordRegister(this, 0x0)
                  .WithValueField(0, 5, name: "BGR_TRIM")
                  .WithValueField(5, 5, name: "BGR_ITRIM")
                  .WithValueField(10, 4, name: "LDO_SLEEP_TRIM")
                  .WithFlag(14, name: "LDO_SUPPLY_USE_BGREF")
                  .WithReservedBits(15, 1) },
                { (long)Registers.AnalogStatus, new WordRegister(this, 0x1820)
                  .WithFlag(0, name: "LDO_RADIO_OK", mode: FieldMode.Read)
                  .WithFlag(1, name: "COMP_VBAT_OK", mode: FieldMode.Read)
                  .WithFlag(2, name: "VBUS_AVAILABLE", mode: FieldMode.Read, valueProviderCallback: (_) => VbusAvailable)
                  .WithFlag(3, name: "NEWBAT", mode: FieldMode.Read)
                  .WithFlag(4, name: "LDO_SUPPLY_VBAT_OK", mode: FieldMode.Read)
                  .WithFlag(5, name: "LDO_SUPPLY_USB_OK", mode: FieldMode.Read)
                  .WithFlag(6, name: "BANDGAP_OK", mode: FieldMode.Read)
                  .WithFlag(7, name: "COMP_VDD_HIGH", mode: FieldMode.Read)
                  .WithFlag(8, name: "LCO_CORE_OK", mode: FieldMode.Read)
                  .WithFlag(9, name: "LDO_1V8_PA_OK", mode: FieldMode.Read)
                  .WithFlag(10, name: "LDO_1V8_FLASH_OK", mode: FieldMode.Read)
                  .WithFlag(11, name: "COMP_VBUS_HIGH", mode: FieldMode.Read)
                  .WithFlag(12, name: "COMP_VBUS_LOW", mode: FieldMode.Read)
                  .WithFlag(13, name: "COMP_V33_HIGH", mode: FieldMode.Read)
                  .WithFlag(14, name: "COMP_1V8_FLASH_HIGH", mode: FieldMode.Read)
                  .WithFlag(15, name: "COMP_1V8_PA_HIGH", mode: FieldMode.Read) },
                { (long)Registers.VbusIrqMask, new WordRegister(this, 0x3)
                  .WithFlag(0, name: "VBUS_IRQ_EN_FALL")
                  .WithFlag(1, name: "VBUS_IRQ_EN_RISE")
                  .WithReservedBits(2, 14) },
                { (long)Registers.VbusIrqClear, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "VBUS_IRQ_CLEAR")
                  .WithReservedBits(1, 15) },
                { (long)Registers.BodCtrl, new WordRegister(this, 0x700)
                  .WithTag("VDD_TRIM", 0, 2)
                  .WithTag("1V8_TRIM", 2, 2)
                  .WithTag("1V4_TRIM", 4, 2)
                  .WithTag("V33_TRIM", 6, 2)
                  .WithValueField(8, 3, name: "BOD_VDD_LVL")
                  .WithReservedBits(11, 5) },
                { (long)Registers.BodCtrl2, new WordRegister(this, 0x3)
                  .WithFlag(0, name: "BOD_RESET_EN")
                  .WithFlag(1, name: "BOD_VDD_EN")
                  .WithTaggedFlag("BOD_V33_EN", 2)
                  .WithTaggedFlag("BOD_1V8_PA_EN", 3)
                  .WithFlag(4, name: "BOD_1V8_FLASH_EN")
                  .WithFlag(5, name: "BOD_VBAT_EN")
                  .WithTaggedFlag("BOD_V14_EN", 6)
                  .WithReservedBits(7, 9) },
                { (long)Registers.LdoCtrl1, new WordRegister(this, 0xA7)
                  .WithValueField(0, 2, name: "LDO_CORE_CURLIM")
                  .WithValueField(2, 2, name: "LDO_VBAT_RET_LEVEL")
                  .WithValueField(4, 2, name: "LDO_SUPPLY_VBAT_LEVEL")
                  .WithValueField(6, 2, name: "LDO_SUPPLY_USB_LEVEL")
                  .WithValueField(8, 3, name: "LDO_CORE_SETVDD")
                  .WithValueField(11, 3, name: "LDO_RADIO_SETVDD")
                  .WithFlag(14, name: "LDO_RADIO_ENABLE")
                  .WithReservedBits(15, 1) },
                { (long)Registers.LdoCtrl2, new WordRegister(this, 0xF)
                  .WithFlag(0, name: "LDO_1V2_ON")
                  .WithFlag(1, name: "LDO_3V3_ON")
                  .WithFlag(2, name: "LDO_1V8_FLASH_ON")
                  .WithFlag(3, name: "LDO_1V8_PA_ON")
                  .WithFlag(4, name: "LDO_VBAT_RET_DISABLE")
                  .WithFlag(5, name: "LDO_1V8_FLASH_RET_DISABLE")
                  .WithFlag(6, name: "LDO_1V8_PA_RET_DISABLE")
                  .WithReservedBits(7, 9) },
                { (long)Registers.SleepTimer, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "SLEEP_TIMER") },
                { (long)Registers.XtalRdyCtrl, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "XTALRDY_CNT")
                  .WithReservedBits(8, 8) },
                { (long)Registers.XtalRdyStat, new WordRegister(this, 0x0)
                  .WithTag("XTALRDY_STAT", 0, 8)
                  .WithReservedBits(8, 8) },
                { (long)Registers.Xtal16MCtrl, new WordRegister(this, 0x0)
                  .WithValueField(0, 3, name: "XTAL16M_FREQ_TRIM_SW2")
                  .WithFlag(3, name: "XTAL16M_AMP_REG_SIG_SEL")
                  .WithValueField(4, 2, name: "XTAL16M_TST_AON")
                  .WithValueField(6, 2, name: "XTAL16M_SH_OVERRULE")
                  .WithFlag(8, name: "XTAL16M_ENABLE_ZERO")
                  .WithReservedBits(9, 7) },
                { (long)Registers.AonSpare, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "OSC16_HOLD_AMP")
                  .WithTaggedFlag("OSC16_SH_DISABLE", 1)
                  .WithTaggedFlag("EN_BATSYS_RET", 2)
                  .WithTaggedFlag("EN_BUSSYS_RET", 3)
                  .WithReservedBits(4, 12) },
            };

            registers = new WordRegisterCollection(this, registersMap);
        }
Esempio n. 9
0
        public DA1468x_ANAMISC(Machine machine)
        {
            var registersMap = new Dictionary <long, WordRegister>
            {
                {
                    (long)Registers.AnaTest, new WordRegister(this, 0x0)
                    .WithValueField(0, 4, name: "TEST_STRUCTURE")
                    .WithFlag(4, name: "ACORE_TESTBUS_EN")
                    .WithReservedBits(5, 11)
                },
                {
                    (long)Registers.Ctrl1, new WordRegister(this, 0x2000)
                    .WithValueField(0, 5, name: "CHARGE_LEVEL")
                    .WithFlag(5, name: "CHARGE_ON")
                    .WithTaggedFlag("NTC_DISABLE", 6)
                    .WithTaggedFlag("NTC_LOW_DISABLE", 7)
                    .WithValueField(8, 4, name: "CHARGE_CUR")
                    .WithValueField(12, 2, name: "DIE_TEMP_SET")
                    .WithTaggedFlag("DIE_TEMP_DISABLE", 14)
                    .WithReservedBits(15, 1)
                },
                { (long)Registers.Ctrl2, new WordRegister(this, 0xF07)
                  .WithValueField(0, 4, name: "CURRENT_GAIN_TRIM")
                  .WithValueField(4, 4, name: "CHARGER_VFLOAT_ADJ")
                  .WithValueField(8, 5, name: "CURRENT_OFFSET_TRIM")
                  .WithValueField(13, 3, name: "CHARGER_TEST") },
                { (long)Registers.Status, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "CHARGER_CC_MODE")
                  .WithTaggedFlag("CHARGER_CV_MODE", 1)
                  .WithTaggedFlag("END_OF_CHARGE", 2)
                  .WithTaggedFlag("CHARGER_BATTEMP_LOW", 3)
                  .WithTaggedFlag("CHARGER_BATTEMP_OK", 4)
                  .WithTaggedFlag("CHARGER_BATTEMP_HIGH", 5)
                  .WithTaggedFlag("CHARGER_TMODE_PROT", 6)
                  .WithReservedBits(7, 9) },
                { (long)Registers.SocCtrl1, new WordRegister(this, 0xD880)
                  .WithFlag(0, name: "SOC_ENABLE")
                  .WithFlag(1, name: "SOC_RESET_CHARGE")
                  .WithFlag(2, name: "SOC_RESET_AVG")
                  .WithFlag(3, name: "SOC_MUTE")
                  .WithFlag(4, name: "SOC_GPIO")
                  .WithFlag(5, name: "SOC_SIGN")
                  .WithValueField(6, 2, name: "SOC_IDAC")
                  .WithFlag(8, name: "SOC_LPF")
                  .WithValueField(9, 3, name: "SOC_CLK")
                  .WithValueField(12, 2, name: "SOC_BIAS")
                  .WithValueField(14, 2, name: "SOC_CINT") },
                { (long)Registers.SocCtrl2, new WordRegister(this, 0x776A)
                  .WithValueField(0, 2, name: "SOC_RVI")
                  .WithValueField(2, 3, name: "SOC_SCYCLE")
                  .WithFlag(5, name: "SOC_DCYCLE")
                  .WithValueField(6, 2, name: "SOC_ICM")
                  .WithValueField(8, 3, name: "SOC_CHOP")
                  .WithFlag(11, name: "SOC_CMIREG_ENABLE")
                  .WithValueField(12, 3, name: "SOC_MAW")
                  .WithFlag(15, name: "SOC_DYNAVG") },
                { (long)Registers.SocCtrl3, new WordRegister(this, 0x11)
                  .WithValueField(0, 2, name: "SOC_VSAT")
                  .WithFlag(2, name: "SOC_DYNTARG")
                  .WithFlag(3, name: "SOC_DYNHYS")
                  .WithValueField(4, 2, name: "SOC_VCMI")
                  .WithReservedBits(6, 10) },
                { (long)Registers.ChargeCtr1, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "CHARGE_CNT1", mode: FieldMode.Read) },
                { (long)Registers.ChargeCtr2, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "CHARGE_CNT2", mode: FieldMode.Read) },
                { (long)Registers.ChargeCtr3, new WordRegister(this, 0x0)
                  .WithValueField(0, 8, name: "CHARGE_CNT3", mode: FieldMode.Read)
                  .WithReservedBits(8, 8) },
                { (long)Registers.SocChargeAvg, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "CHARGE_AVG", mode: FieldMode.Read) },
                { (long)Registers.SocStatus, new WordRegister(this, 0x0)
                  .WithFlag(0, name: "SOC_INT_OVERLOAD")
                  .WithFlag(1, name: "SOC_INT_LOCKED")
                  .WithReservedBits(2, 14) },
                { (long)Registers.ClkRefSel, new WordRegister(this, 0x0)
                  .WithValueField(0, 2, name: "REF_CLK_SEL")
                  .WithFlag(2, name: "REF_CAL_START")
                  .WithReservedBits(3, 13) },
                { (long)Registers.ClkRefCnt, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "REF_CNT_VAL", mode: FieldMode.Read) },
                { (long)Registers.ClkRefValL, new WordRegister(this, 59580)
                  .WithValueField(0, 16, name: "XTAL_CNT_VAL", mode: FieldMode.Read) },
                { (long)Registers.ClkRefValH, new WordRegister(this, 0x0)
                  .WithValueField(0, 16, name: "XTAL_CNT_VAL", mode: FieldMode.Read) },
            };

            registers = new WordRegisterCollection(this, registersMap);
        }