rp/pio: PioStateMachine{Instance, => ,Instance}

next step: get rid of the insance trait entirely
This commit is contained in:
pennae
2023-05-03 09:42:42 +02:00
parent 79985f0036
commit 906d2b2db7
6 changed files with 42 additions and 42 deletions

View File

@ -97,13 +97,13 @@ pub(crate) unsafe fn init() {
/// Future that waits for TX-FIFO to become writable
#[must_use = "futures do nothing unless you `.await` or poll them"]
pub struct FifoOutFuture<'a, PIO: PioInstance, SM: PioStateMachine + Unpin> {
pub struct FifoOutFuture<'a, PIO: PioInstance, SM: PioStateMachineInstance + Unpin> {
sm: &'a mut SM,
pio: PhantomData<PIO>,
value: u32,
}
impl<'a, PIO: PioInstance, SM: PioStateMachine + Unpin> FifoOutFuture<'a, PIO, SM> {
impl<'a, PIO: PioInstance, SM: PioStateMachineInstance + Unpin> FifoOutFuture<'a, PIO, SM> {
pub fn new(sm: &'a mut SM, value: u32) -> Self {
FifoOutFuture {
sm,
@ -113,7 +113,7 @@ impl<'a, PIO: PioInstance, SM: PioStateMachine + Unpin> FifoOutFuture<'a, PIO, S
}
}
impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Future for FifoOutFuture<'d, PIO, SM> {
impl<'d, PIO: PioInstance, SM: PioStateMachineInstance + Unpin> Future for FifoOutFuture<'d, PIO, SM> {
type Output = ();
fn poll(self: FuturePin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
//debug!("Poll {},{}", PIO::PIO_NO, SM);
@ -133,7 +133,7 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Future for FifoOutFuture
}
}
impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Drop for FifoOutFuture<'d, PIO, SM> {
impl<'d, PIO: PioInstance, SM: PioStateMachineInstance + Unpin> Drop for FifoOutFuture<'d, PIO, SM> {
fn drop(&mut self) {
unsafe {
PIO::PIO.irqs(0).inte().write_clear(|m| {
@ -145,12 +145,12 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine + Unpin> Drop for FifoOutFuture<'
/// Future that waits for RX-FIFO to become readable
#[must_use = "futures do nothing unless you `.await` or poll them"]
pub struct FifoInFuture<'a, PIO: PioInstance, SM: PioStateMachine> {
pub struct FifoInFuture<'a, PIO: PioInstance, SM: PioStateMachineInstance> {
sm: &'a mut SM,
pio: PhantomData<PIO>,
}
impl<'a, PIO: PioInstance, SM: PioStateMachine> FifoInFuture<'a, PIO, SM> {
impl<'a, PIO: PioInstance, SM: PioStateMachineInstance> FifoInFuture<'a, PIO, SM> {
pub fn new(sm: &'a mut SM) -> Self {
FifoInFuture {
sm,
@ -159,7 +159,7 @@ impl<'a, PIO: PioInstance, SM: PioStateMachine> FifoInFuture<'a, PIO, SM> {
}
}
impl<'d, PIO: PioInstance, SM: PioStateMachine> Future for FifoInFuture<'d, PIO, SM> {
impl<'d, PIO: PioInstance, SM: PioStateMachineInstance> Future for FifoInFuture<'d, PIO, SM> {
type Output = u32;
fn poll(mut self: FuturePin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
//debug!("Poll {},{}", PIO::PIO_NO, SM);
@ -178,7 +178,7 @@ impl<'d, PIO: PioInstance, SM: PioStateMachine> Future for FifoInFuture<'d, PIO,
}
}
impl<'d, PIO: PioInstance, SM: PioStateMachine> Drop for FifoInFuture<'d, PIO, SM> {
impl<'d, PIO: PioInstance, SM: PioStateMachineInstance> Drop for FifoInFuture<'d, PIO, SM> {
fn drop(&mut self) {
unsafe {
PIO::PIO.irqs(0).inte().write_clear(|m| {
@ -312,11 +312,11 @@ impl<'l, PIO: PioInstance> Pin<'l, PIO> {
}
}
pub struct PioStateMachineInstance<'d, PIO: PioInstance, const SM: usize> {
pub struct PioStateMachine<'d, PIO: PioInstance, const SM: usize> {
pio: PhantomData<&'d PIO>,
}
impl<'d, PIO: PioInstance, const SM: usize> Drop for PioStateMachineInstance<'d, PIO, SM> {
impl<'d, PIO: PioInstance, const SM: usize> Drop for PioStateMachine<'d, PIO, SM> {
fn drop(&mut self) {
unsafe {
PIO::PIO.ctrl().write_clear(|w| w.set_sm_enable(1 << SM));
@ -325,13 +325,13 @@ impl<'d, PIO: PioInstance, const SM: usize> Drop for PioStateMachineInstance<'d,
}
}
impl<'d, PIO: PioInstance, const SM: usize> sealed::PioStateMachine for PioStateMachineInstance<'d, PIO, SM> {
impl<'d, PIO: PioInstance, const SM: usize> sealed::PioStateMachineInstance for PioStateMachine<'d, PIO, SM> {
type Pio = PIO;
const SM: usize = SM;
}
impl<'d, PIO: PioInstance, const SM: usize> PioStateMachine for PioStateMachineInstance<'d, PIO, SM> {}
impl<'d, PIO: PioInstance, const SM: usize> PioStateMachineInstance for PioStateMachine<'d, PIO, SM> {}
pub trait PioStateMachine: sealed::PioStateMachine + Sized + Unpin {
pub trait PioStateMachineInstance: sealed::PioStateMachineInstance + Sized + Unpin {
fn restart(&mut self) {
let mask = 1u8 << Self::SM;
unsafe {
@ -892,10 +892,10 @@ impl<'d, PIO: PioInstance> PioCommon<'d, PIO> {
pub struct Pio<'d, PIO: PioInstance> {
pub common: PioCommon<'d, PIO>,
pub sm0: PioStateMachineInstance<'d, PIO, 0>,
pub sm1: PioStateMachineInstance<'d, PIO, 1>,
pub sm2: PioStateMachineInstance<'d, PIO, 2>,
pub sm3: PioStateMachineInstance<'d, PIO, 3>,
pub sm0: PioStateMachine<'d, PIO, 0>,
pub sm1: PioStateMachine<'d, PIO, 1>,
pub sm2: PioStateMachine<'d, PIO, 2>,
pub sm3: PioStateMachine<'d, PIO, 3>,
}
impl<'d, PIO: PioInstance> Pio<'d, PIO> {
@ -907,10 +907,10 @@ impl<'d, PIO: PioInstance> Pio<'d, PIO> {
instructions_used: 0,
pio: PhantomData,
},
sm0: PioStateMachineInstance { pio: PhantomData },
sm1: PioStateMachineInstance { pio: PhantomData },
sm2: PioStateMachineInstance { pio: PhantomData },
sm3: PioStateMachineInstance { pio: PhantomData },
sm0: PioStateMachine { pio: PhantomData },
sm1: PioStateMachine { pio: PhantomData },
sm2: PioStateMachine { pio: PhantomData },
sm3: PioStateMachine { pio: PhantomData },
}
}
}
@ -944,7 +944,7 @@ fn on_pio_drop<PIO: PioInstance>() {
mod sealed {
use super::*;
pub trait PioStateMachine {
pub trait PioStateMachineInstance {
type Pio: super::PioInstance;
const SM: usize;

View File

@ -1,8 +1,8 @@
use pio::{InSource, InstructionOperands, JmpCondition, OutDestination, SetDestination};
use crate::pio::PioStateMachine;
use crate::pio::PioStateMachineInstance;
pub fn set_x<SM: PioStateMachine>(sm: &mut SM, value: u32) {
pub fn set_x<SM: PioStateMachineInstance>(sm: &mut SM, value: u32) {
const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::X,
bit_count: 32,
@ -12,7 +12,7 @@ pub fn set_x<SM: PioStateMachine>(sm: &mut SM, value: u32) {
sm.exec_instr(OUT);
}
pub fn get_x<SM: PioStateMachine>(sm: &mut SM) -> u32 {
pub fn get_x<SM: PioStateMachineInstance>(sm: &mut SM) -> u32 {
const IN: u16 = InstructionOperands::IN {
source: InSource::X,
bit_count: 32,
@ -22,7 +22,7 @@ pub fn get_x<SM: PioStateMachine>(sm: &mut SM) -> u32 {
sm.pull_rx()
}
pub fn set_y<SM: PioStateMachine>(sm: &mut SM, value: u32) {
pub fn set_y<SM: PioStateMachineInstance>(sm: &mut SM, value: u32) {
const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::Y,
bit_count: 32,
@ -32,7 +32,7 @@ pub fn set_y<SM: PioStateMachine>(sm: &mut SM, value: u32) {
sm.exec_instr(OUT);
}
pub fn get_y<SM: PioStateMachine>(sm: &mut SM) -> u32 {
pub fn get_y<SM: PioStateMachineInstance>(sm: &mut SM) -> u32 {
const IN: u16 = InstructionOperands::IN {
source: InSource::Y,
bit_count: 32,
@ -43,7 +43,7 @@ pub fn get_y<SM: PioStateMachine>(sm: &mut SM) -> u32 {
sm.pull_rx()
}
pub fn set_pindir<SM: PioStateMachine>(sm: &mut SM, data: u8) {
pub fn set_pindir<SM: PioStateMachineInstance>(sm: &mut SM, data: u8) {
let set: u16 = InstructionOperands::SET {
destination: SetDestination::PINDIRS,
data,
@ -52,7 +52,7 @@ pub fn set_pindir<SM: PioStateMachine>(sm: &mut SM, data: u8) {
sm.exec_instr(set);
}
pub fn set_pin<SM: PioStateMachine>(sm: &mut SM, data: u8) {
pub fn set_pin<SM: PioStateMachineInstance>(sm: &mut SM, data: u8) {
let set: u16 = InstructionOperands::SET {
destination: SetDestination::PINS,
data,
@ -61,7 +61,7 @@ pub fn set_pin<SM: PioStateMachine>(sm: &mut SM, data: u8) {
sm.exec_instr(set);
}
pub fn set_out_pin<SM: PioStateMachine>(sm: &mut SM, data: u32) {
pub fn set_out_pin<SM: PioStateMachineInstance>(sm: &mut SM, data: u32) {
const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::PINS,
bit_count: 32,
@ -70,7 +70,7 @@ pub fn set_out_pin<SM: PioStateMachine>(sm: &mut SM, data: u32) {
sm.push_tx(data);
sm.exec_instr(OUT);
}
pub fn set_out_pindir<SM: PioStateMachine>(sm: &mut SM, data: u32) {
pub fn set_out_pindir<SM: PioStateMachineInstance>(sm: &mut SM, data: u32) {
const OUT: u16 = InstructionOperands::OUT {
destination: OutDestination::PINDIRS,
bit_count: 32,
@ -80,7 +80,7 @@ pub fn set_out_pindir<SM: PioStateMachine>(sm: &mut SM, data: u32) {
sm.exec_instr(OUT);
}
pub fn exec_jmp<SM: PioStateMachine>(sm: &mut SM, to_addr: u8) {
pub fn exec_jmp<SM: PioStateMachineInstance>(sm: &mut SM, to_addr: u8) {
let jmp: u16 = InstructionOperands::JMP {
address: to_addr,
condition: JmpCondition::Always,