private void Update() { if (interruptOccurred12.Value) { IRQ12.Blink(); interruptOccurred12.Value = false; } else if (interruptOccurred34.Value) { IRQ34.Blink(); interruptOccurred34.Value = false; } }
public EOSS3_SimplePeriodicTimer(Machine machine) : base(machine) { interruptTimestamps = new ushort[NumberOfInterrupts]; FFEKickOff = new GPIO(); timerSoftware30Bit = new LimitTimer(machine.ClockSource, 1000 /*count every 1ms*/, this, "Software Use Timer", limit: 0x3FFFFFFF, enabled: false, eventEnabled: false, direction: Time.Direction.Ascending); timerFFEKickOffUpCounter = new LimitTimer(machine.ClockSource, 1000 /*count every 1ms*/, this, "FFE Kick-Off", limit: 0x4 /* the minimal legal limit, as LimitTimer does not accept 0 */, enabled: false, eventEnabled: true, direction: Time.Direction.Ascending); timerFFEKickOffUpCounter.LimitReached += delegate { if (sleepMode.Value) { this.Log(LogLevel.Noisy, "FFE Kick-Off is masked"); } else { FFEKickOff.Blink(); this.Log(LogLevel.Noisy, "FFE Kick-Off!"); } }; DefineRegisters(); }
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 PULP_uDMA_UART(Machine machine) : base(machine) { TxIRQ = new GPIO(); RxIRQ = new GPIO(); var registersMap = new Dictionary<long, DoubleWordRegister> { {(long)Registers.RxBaseAddress, new DoubleWordRegister(this) .WithValueField(0, 32, out rxBufferAddress, name: "RX_SADDR / Rx buffer base address") }, {(long)Registers.RxSize, new DoubleWordRegister(this) .WithValueField(0, 17, out rxBufferSize, name: "RX_SIZE / Rx buffer size") }, {(long)Registers.RxConfig, new DoubleWordRegister(this) .WithFlag(4, name: "EN / RX channel enable and start", // Continuous mode is currently not supported valueProviderCallback: _ => rxStarted, writeCallback: (_, value) => { rxStarted = value; if(value) { rxIdx = 0; if(Count > 0) { // With the new round of reception we might still have some characters in the // buffer. CharWritten(); } } }) }, {(long)Registers.TxBaseAddress, new DoubleWordRegister(this) .WithValueField(0, 32, out txBufferAddress, name: "TX_SADDR / Tx buffer base address") }, {(long)Registers.TxSize, new DoubleWordRegister(this) .WithValueField(0, 17, out txBufferSize, name: "TX_SIZE / Tx buffer size") }, {(long)Registers.TxConfig, new DoubleWordRegister(this) .WithFlag(4, name: "EN / TX channel enable and start", // Continuous mode is currently not supported valueProviderCallback: _ => false, writeCallback: (_, value) => { if(!value) { return; } if(txBufferSize.Value == 0) { this.Log(LogLevel.Warning, "TX is being enabled, but the buffer size is not configured. Ignoring the operation"); return; } var data = machine.SystemBus.ReadBytes(txBufferAddress.Value, (int)txBufferSize.Value); foreach(var c in data) { TransmitCharacter(c); } TxIRQ.Blink(); }) }, {(long)Registers.Status, new DoubleWordRegister(this) .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => false, name: "TX busy") // tx is never busy .WithFlag(1, FieldMode.Read, valueProviderCallback: _ => false, name: "RX busy") // rx is never busy }, {(long)Registers.Setup, new DoubleWordRegister(this) .WithFlag(0, out parityEnable, name: "PARITY_ENA / Parity Enable") .WithTag("BIT_LENGTH / Character length", 1, 2) .WithFlag(3, out stopBits, name: "STOP_BITS / Stop bits length") .WithTag("POLLING_EN / Polling Enabled", 4, 1) .WithTag("CLEAN_FIFO / Clean RX FIFO", 5, 1) .WithTag("TX_ENA / TX enabled", 8, 1) .WithTag("RX_ENA / RX enabled", 9, 1) .WithTag("CLKDIV / Clock divider", 16, 16) }, }; registers = new DoubleWordRegisterCollection(this, registersMap); }