pub struct Sio { /* private fields */ }
Expand description
Single-cycle IO block Provides core-local and inter-core hardware for the two processors, with single-cycle access.
Implementations§
source§impl Sio
impl Sio
pub const unsafe fn from_ptr(ptr: *mut ()) -> Self
pub const fn as_ptr(&self) -> *mut ()
sourcepub const fn gpio_in(self, n: usize) -> Reg<u32, RW>
pub const fn gpio_in(self, n: usize) -> Reg<u32, RW>
Input value for GPIO0…31. In the Non-secure SIO, Secure-only GPIOs (as per ACCESSCTRL) appear as zero.
pub const fn gpio_out(self, n: usize) -> Gpio
pub const fn gpio_oe(self, n: usize) -> Gpio
pub const fn fifo(self) -> Fifo
sourcepub const fn spinlock_st(self) -> Reg<u32, RW>
pub const fn spinlock_st(self) -> Reg<u32, RW>
Spinlock state A bitmap containing the state of all 32 spinlocks (1=locked). Mainly intended for debugging.
pub const fn interp(self, n: usize) -> Interp
sourcepub const fn spinlock(self, n: usize) -> Reg<u32, RW>
pub const fn spinlock(self, n: usize) -> Reg<u32, RW>
Reading from a spinlock address will: - Return 0 if lock is already locked - Otherwise return nonzero, and simultaneously claim the lock Writing (any value) releases the lock. If core 0 and core 1 attempt to claim the same lock simultaneously, core 0 wins. The value returned on success is 0x1 << lock number.
sourcepub const fn doorbell_out_set(self) -> Reg<DoorbellOutSet, RW>
pub const fn doorbell_out_set(self) -> Reg<DoorbellOutSet, RW>
Trigger a doorbell interrupt on the opposite core. Write 1 to a bit to set the corresponding bit in DOORBELL_IN on the opposite core. This raises the opposite core’s doorbell interrupt. Read to get the status of the doorbells currently asserted on the opposite core. This is equivalent to that core reading its own DOORBELL_IN status.
sourcepub const fn doorbell_out_clr(self) -> Reg<DoorbellOutClr, RW>
pub const fn doorbell_out_clr(self) -> Reg<DoorbellOutClr, RW>
Clear doorbells which have been posted to the opposite core. This register is intended for debugging and initialisation purposes. Writing 1 to a bit in DOORBELL_OUT_CLR clears the corresponding bit in DOORBELL_IN on the opposite core. Clearing all bits will cause that core’s doorbell interrupt to deassert. Since the usual order of events is for software to send events using DOORBELL_OUT_SET, and acknowledge incoming events by writing to DOORBELL_IN_CLR, this register should be used with caution to avoid race conditions. Reading returns the status of the doorbells currently asserted on the other core, i.e. is equivalent to that core reading its own DOORBELL_IN status.
sourcepub const fn doorbell_in_set(self) -> Reg<DoorbellInSet, RW>
pub const fn doorbell_in_set(self) -> Reg<DoorbellInSet, RW>
Write 1s to trigger doorbell interrupts on this core. Read to get status of doorbells currently asserted on this core.
sourcepub const fn doorbell_in_clr(self) -> Reg<DoorbellInClr, RW>
pub const fn doorbell_in_clr(self) -> Reg<DoorbellInClr, RW>
Check and acknowledge doorbells posted to this core. This core’s doorbell interrupt is asserted when any bit in this register is 1. Write 1 to each bit to clear that bit. The doorbell interrupt deasserts once all bits are cleared. Read to get status of doorbells currently asserted on this core.
sourcepub const fn peri_nonsec(self) -> Reg<PeriNonsec, RW>
pub const fn peri_nonsec(self) -> Reg<PeriNonsec, RW>
Detach certain core-local peripherals from Secure SIO, and attach them to Non-secure SIO, so that Non-secure software can use them. Attempting to access one of these peripherals from the Secure SIO when it is attached to the Non-secure SIO, or vice versa, will generate a bus error. This register is per-core, and is only present on the Secure SIO. Most SIO hardware is duplicated across the Secure and Non-secure SIO, so is not listed in this register.
sourcepub const fn riscv_softirq(self) -> Reg<RiscvSoftirq, RW>
pub const fn riscv_softirq(self) -> Reg<RiscvSoftirq, RW>
Control the assertion of the standard software interrupt (MIP.MSIP) on the RISC-V cores. Unlike the RISC-V timer, this interrupt is not routed to a normal system-level interrupt line, so can not be used by the Arm cores. It is safe for both cores to write to this register on the same cycle. The set/clear effect is accumulated across both cores, and then applied. If a flag is both set and cleared on the same cycle, only the set takes effect.
sourcepub const fn mtime_ctrl(self) -> Reg<MtimeCtrl, RW>
pub const fn mtime_ctrl(self) -> Reg<MtimeCtrl, RW>
Control register for the RISC-V 64-bit Machine-mode timer. This timer is only present in the Secure SIO, so is only accessible to an Arm core in Secure mode or a RISC-V core in Machine mode. Note whilst this timer follows the RISC-V privileged specification, it is equally usable by the Arm cores. The interrupts are routed to normal system-level interrupt lines as well as to the MIP.MTIP inputs on the RISC-V cores.
sourcepub const fn mtime(self) -> Reg<u32, RW>
pub const fn mtime(self) -> Reg<u32, RW>
Read/write access to the high half of RISC-V Machine-mode timer. This register is shared between both cores. If both cores write on the same cycle, core 1 takes precedence.
sourcepub const fn mtimeh(self) -> Reg<u32, RW>
pub const fn mtimeh(self) -> Reg<u32, RW>
Read/write access to the high half of RISC-V Machine-mode timer. This register is shared between both cores. If both cores write on the same cycle, core 1 takes precedence.
sourcepub const fn mtimecmp(self) -> Reg<u32, RW>
pub const fn mtimecmp(self) -> Reg<u32, RW>
Low half of RISC-V Machine-mode timer comparator. This register is core-local, i.e., each core gets a copy of this register, with the comparison result routed to its own interrupt line. The timer interrupt is asserted whenever MTIME is greater than or equal to MTIMECMP. This comparison is unsigned, and performed on the full 64-bit values.
sourcepub const fn mtimecmph(self) -> Reg<u32, RW>
pub const fn mtimecmph(self) -> Reg<u32, RW>
High half of RISC-V Machine-mode timer comparator. This register is core-local. The timer interrupt is asserted whenever MTIME is greater than or equal to MTIMECMP. This comparison is unsigned, and performed on the full 64-bit values.
sourcepub const fn tmds_wdata(self) -> Reg<u32, RW>
pub const fn tmds_wdata(self) -> Reg<u32, RW>
Write-only access to the TMDS colour data register.
sourcepub const fn tmds_peek_single(self) -> Reg<u32, RW>
pub const fn tmds_peek_single(self) -> Reg<u32, RW>
Get the encoding of one pixel’s worth of colour data, packed into a 32-bit value (3x10-bit symbols). The PEEK alias does not shift the colour register when read, but still advances the running DC balance state of each encoder. This is useful for pixel doubling.
sourcepub const fn tmds_pop_single(self) -> Reg<u32, RW>
pub const fn tmds_pop_single(self) -> Reg<u32, RW>
Get the encoding of one pixel’s worth of colour data, packed into a 32-bit value. The packing is 5 chunks of 3 lanes times 2 bits (30 bits total). Each chunk contains two bits of a TMDS symbol per lane. This format is intended for shifting out with the HSTX peripheral on RP2350. The POP alias shifts the colour register when read, as well as advancing the running DC balance state of each encoder.
sourcepub const fn tmds_peek_double_l0(self) -> Reg<u32, RW>
pub const fn tmds_peek_double_l0(self) -> Reg<u32, RW>
Get lane 0 of the encoding of two pixels’ worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. The PEEK alias does not shift the colour register when read, but still advances the lane 0 DC balance state. This is useful if all 3 lanes’ worth of encode are to be read at once, rather than processing the entire scanline for one lane before moving to the next lane.
sourcepub const fn tmds_pop_double_l0(self) -> Reg<u32, RW>
pub const fn tmds_pop_double_l0(self) -> Reg<u32, RW>
Get lane 0 of the encoding of two pixels’ worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. The POP alias shifts the colour register when read, according to the values of PIX_SHIFT and PIX2_NOSHIFT.
sourcepub const fn tmds_peek_double_l1(self) -> Reg<u32, RW>
pub const fn tmds_peek_double_l1(self) -> Reg<u32, RW>
Get lane 1 of the encoding of two pixels’ worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. The PEEK alias does not shift the colour register when read, but still advances the lane 1 DC balance state. This is useful if all 3 lanes’ worth of encode are to be read at once, rather than processing the entire scanline for one lane before moving to the next lane.
sourcepub const fn tmds_pop_double_l1(self) -> Reg<u32, RW>
pub const fn tmds_pop_double_l1(self) -> Reg<u32, RW>
Get lane 1 of the encoding of two pixels’ worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. The POP alias shifts the colour register when read, according to the values of PIX_SHIFT and PIX2_NOSHIFT.
sourcepub const fn tmds_peek_double_l2(self) -> Reg<u32, RW>
pub const fn tmds_peek_double_l2(self) -> Reg<u32, RW>
Get lane 2 of the encoding of two pixels’ worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. The PEEK alias does not shift the colour register when read, but still advances the lane 2 DC balance state. This is useful if all 3 lanes’ worth of encode are to be read at once, rather than processing the entire scanline for one lane before moving to the next lane.
sourcepub const fn tmds_pop_double_l2(self) -> Reg<u32, RW>
pub const fn tmds_pop_double_l2(self) -> Reg<u32, RW>
Get lane 2 of the encoding of two pixels’ worth of colour data. Two 10-bit TMDS symbols are packed at the bottom of a 32-bit word. The POP alias shifts the colour register when read, according to the values of PIX_SHIFT and PIX2_NOSHIFT.
Trait Implementations§
impl Copy for Sio
impl Eq for Sio
impl Send for Sio
impl StructuralPartialEq for Sio
impl Sync for Sio
Auto Trait Implementations§
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)