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); }
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); }
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); }
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); }
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); }