diff options
| -rw-r--r-- | embassy-rp/src/pio.rs | 45 | ||||
| -rw-r--r-- | examples/rp/src/bin/pio_async.rs | 9 | ||||
| -rw-r--r-- | examples/rp/src/bin/pio_hd44780.rs | 7 |
3 files changed, 37 insertions, 24 deletions
diff --git a/embassy-rp/src/pio.rs b/embassy-rp/src/pio.rs index 52ef89a16..769641ac9 100644 --- a/embassy-rp/src/pio.rs +++ b/embassy-rp/src/pio.rs | |||
| @@ -180,21 +180,12 @@ impl<'a, 'd, PIO: PioInstance, const SM: usize> Drop for FifoInFuture<'a, 'd, PI | |||
| 180 | 180 | ||
| 181 | /// Future that waits for IRQ | 181 | /// Future that waits for IRQ |
| 182 | #[must_use = "futures do nothing unless you `.await` or poll them"] | 182 | #[must_use = "futures do nothing unless you `.await` or poll them"] |
| 183 | pub struct IrqFuture<PIO: PioInstance> { | 183 | pub struct IrqFuture<'a, 'd, PIO: PioInstance> { |
| 184 | pio: PhantomData<PIO>, | 184 | pio: PhantomData<&'a PioIrq<'d, PIO, 0>>, |
| 185 | irq_no: u8, | 185 | irq_no: u8, |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | impl<'a, PIO: PioInstance> IrqFuture<PIO> { | 188 | impl<'a, 'd, PIO: PioInstance> Future for IrqFuture<'a, 'd, PIO> { |
| 189 | pub fn new(irq_no: u8) -> Self { | ||
| 190 | IrqFuture { | ||
| 191 | pio: PhantomData::default(), | ||
| 192 | irq_no, | ||
| 193 | } | ||
| 194 | } | ||
| 195 | } | ||
| 196 | |||
| 197 | impl<'d, PIO: PioInstance> Future for IrqFuture<PIO> { | ||
| 198 | type Output = (); | 189 | type Output = (); |
| 199 | fn poll(self: FuturePin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { | 190 | fn poll(self: FuturePin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { |
| 200 | //debug!("Poll {},{}", PIO::PIO_NO, SM); | 191 | //debug!("Poll {},{}", PIO::PIO_NO, SM); |
| @@ -224,7 +215,7 @@ impl<'d, PIO: PioInstance> Future for IrqFuture<PIO> { | |||
| 224 | } | 215 | } |
| 225 | } | 216 | } |
| 226 | 217 | ||
| 227 | impl<'d, PIO: PioInstance> Drop for IrqFuture<PIO> { | 218 | impl<'a, 'd, PIO: PioInstance> Drop for IrqFuture<'a, 'd, PIO> { |
| 228 | fn drop(&mut self) { | 219 | fn drop(&mut self) { |
| 229 | unsafe { | 220 | unsafe { |
| 230 | PIO::PIO.irqs(0).inte().write_clear(|m| { | 221 | PIO::PIO.irqs(0).inte().write_clear(|m| { |
| @@ -688,10 +679,6 @@ impl<'d, PIO: PioInstance + 'd, const SM: usize> PioStateMachine<'d, PIO, SM> { | |||
| 688 | FifoInFuture::new(self) | 679 | FifoInFuture::new(self) |
| 689 | } | 680 | } |
| 690 | 681 | ||
| 691 | pub fn wait_irq(&self, irq_no: u8) -> IrqFuture<PIO> { | ||
| 692 | IrqFuture::new(irq_no) | ||
| 693 | } | ||
| 694 | |||
| 695 | pub fn has_tx_stalled(&self) -> bool { | 682 | pub fn has_tx_stalled(&self) -> bool { |
| 696 | unsafe { | 683 | unsafe { |
| 697 | let fdebug = PIO::PIO.fdebug(); | 684 | let fdebug = PIO::PIO.fdebug(); |
| @@ -862,7 +849,8 @@ impl<'d, PIO: PioInstance> PioCommon<'d, PIO> { | |||
| 862 | 849 | ||
| 863 | /// Register a pin for PIO usage. Pins will be released from the PIO block | 850 | /// Register a pin for PIO usage. Pins will be released from the PIO block |
| 864 | /// (i.e., have their `FUNCSEL` reset to `NULL`) when the [`PioCommon`] *and* | 851 | /// (i.e., have their `FUNCSEL` reset to `NULL`) when the [`PioCommon`] *and* |
| 865 | /// all [`PioStateMachine`]s for this block have been dropped. | 852 | /// all [`PioStateMachine`]s for this block have been dropped. **Other members |
| 853 | /// of [`Pio`] do not keep pin registrations alive.** | ||
| 866 | pub fn make_pio_pin(&mut self, pin: impl Peripheral<P = impl PioPin + 'd> + 'd) -> Pin<'d, PIO> { | 854 | pub fn make_pio_pin(&mut self, pin: impl Peripheral<P = impl PioPin + 'd> + 'd) -> Pin<'d, PIO> { |
| 867 | into_ref!(pin); | 855 | into_ref!(pin); |
| 868 | unsafe { | 856 | unsafe { |
| @@ -877,8 +865,25 @@ impl<'d, PIO: PioInstance> PioCommon<'d, PIO> { | |||
| 877 | } | 865 | } |
| 878 | } | 866 | } |
| 879 | 867 | ||
| 868 | pub struct PioIrq<'d, PIO: PioInstance, const N: usize> { | ||
| 869 | pio: PhantomData<&'d PIO>, | ||
| 870 | } | ||
| 871 | |||
| 872 | impl<'d, PIO: PioInstance, const N: usize> PioIrq<'d, PIO, N> { | ||
| 873 | pub fn wait<'a>(&'a mut self) -> IrqFuture<'a, 'd, PIO> { | ||
| 874 | IrqFuture { | ||
| 875 | pio: PhantomData, | ||
| 876 | irq_no: N as u8, | ||
| 877 | } | ||
| 878 | } | ||
| 879 | } | ||
| 880 | |||
| 880 | pub struct Pio<'d, PIO: PioInstance> { | 881 | pub struct Pio<'d, PIO: PioInstance> { |
| 881 | pub common: PioCommon<'d, PIO>, | 882 | pub common: PioCommon<'d, PIO>, |
| 883 | pub irq0: PioIrq<'d, PIO, 0>, | ||
| 884 | pub irq1: PioIrq<'d, PIO, 1>, | ||
| 885 | pub irq2: PioIrq<'d, PIO, 2>, | ||
| 886 | pub irq3: PioIrq<'d, PIO, 3>, | ||
| 882 | pub sm0: PioStateMachine<'d, PIO, 0>, | 887 | pub sm0: PioStateMachine<'d, PIO, 0>, |
| 883 | pub sm1: PioStateMachine<'d, PIO, 1>, | 888 | pub sm1: PioStateMachine<'d, PIO, 1>, |
| 884 | pub sm2: PioStateMachine<'d, PIO, 2>, | 889 | pub sm2: PioStateMachine<'d, PIO, 2>, |
| @@ -894,6 +899,10 @@ impl<'d, PIO: PioInstance> Pio<'d, PIO> { | |||
| 894 | instructions_used: 0, | 899 | instructions_used: 0, |
| 895 | pio: PhantomData, | 900 | pio: PhantomData, |
| 896 | }, | 901 | }, |
| 902 | irq0: PioIrq { pio: PhantomData }, | ||
| 903 | irq1: PioIrq { pio: PhantomData }, | ||
| 904 | irq2: PioIrq { pio: PhantomData }, | ||
| 905 | irq3: PioIrq { pio: PhantomData }, | ||
| 897 | sm0: PioStateMachine { pio: PhantomData }, | 906 | sm0: PioStateMachine { pio: PhantomData }, |
| 898 | sm1: PioStateMachine { pio: PhantomData }, | 907 | sm1: PioStateMachine { pio: PhantomData }, |
| 899 | sm2: PioStateMachine { pio: PhantomData }, | 908 | sm2: PioStateMachine { pio: PhantomData }, |
diff --git a/examples/rp/src/bin/pio_async.rs b/examples/rp/src/bin/pio_async.rs index 11b290869..3d76a7d7b 100644 --- a/examples/rp/src/bin/pio_async.rs +++ b/examples/rp/src/bin/pio_async.rs | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | use defmt::info; | 4 | use defmt::info; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_rp::peripherals::PIO0; | 6 | use embassy_rp::peripherals::PIO0; |
| 7 | use embassy_rp::pio::{Pio, PioCommon, PioPin, PioStateMachine, ShiftDirection}; | 7 | use embassy_rp::pio::{Pio, PioCommon, PioIrq, PioPin, PioStateMachine, ShiftDirection}; |
| 8 | use embassy_rp::pio_instr_util; | 8 | use embassy_rp::pio_instr_util; |
| 9 | use embassy_rp::relocate::RelocatedProgram; | 9 | use embassy_rp::relocate::RelocatedProgram; |
| 10 | use {defmt_rtt as _, panic_probe as _}; | 10 | use {defmt_rtt as _, panic_probe as _}; |
| @@ -99,10 +99,10 @@ fn setup_pio_task_sm2(pio: &mut PioCommon<PIO0>, sm: &mut PioStateMachine<PIO0, | |||
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | #[embassy_executor::task] | 101 | #[embassy_executor::task] |
| 102 | async fn pio_task_sm2(mut sm: PioStateMachine<'static, PIO0, 2>) { | 102 | async fn pio_task_sm2(mut irq: PioIrq<'static, PIO0, 3>, mut sm: PioStateMachine<'static, PIO0, 2>) { |
| 103 | sm.set_enable(true); | 103 | sm.set_enable(true); |
| 104 | loop { | 104 | loop { |
| 105 | sm.wait_irq(3).await; | 105 | irq.wait().await; |
| 106 | info!("IRQ trigged"); | 106 | info!("IRQ trigged"); |
| 107 | } | 107 | } |
| 108 | } | 108 | } |
| @@ -114,6 +114,7 @@ async fn main(spawner: Spawner) { | |||
| 114 | 114 | ||
| 115 | let Pio { | 115 | let Pio { |
| 116 | mut common, | 116 | mut common, |
| 117 | irq3, | ||
| 117 | mut sm0, | 118 | mut sm0, |
| 118 | mut sm1, | 119 | mut sm1, |
| 119 | mut sm2, | 120 | mut sm2, |
| @@ -125,5 +126,5 @@ async fn main(spawner: Spawner) { | |||
| 125 | setup_pio_task_sm2(&mut common, &mut sm2); | 126 | setup_pio_task_sm2(&mut common, &mut sm2); |
| 126 | spawner.spawn(pio_task_sm0(sm0)).unwrap(); | 127 | spawner.spawn(pio_task_sm0(sm0)).unwrap(); |
| 127 | spawner.spawn(pio_task_sm1(sm1)).unwrap(); | 128 | spawner.spawn(pio_task_sm1(sm1)).unwrap(); |
| 128 | spawner.spawn(pio_task_sm2(sm2)).unwrap(); | 129 | spawner.spawn(pio_task_sm2(irq3, sm2)).unwrap(); |
| 129 | } | 130 | } |
diff --git a/examples/rp/src/bin/pio_hd44780.rs b/examples/rp/src/bin/pio_hd44780.rs index bc51d43c4..7c1d7acfe 100644 --- a/examples/rp/src/bin/pio_hd44780.rs +++ b/examples/rp/src/bin/pio_hd44780.rs | |||
| @@ -85,7 +85,10 @@ impl<'l> HD44780<'l> { | |||
| 85 | 85 | ||
| 86 | let db7pin = db7.pin(); | 86 | let db7pin = db7.pin(); |
| 87 | let Pio { | 87 | let Pio { |
| 88 | mut common, mut sm0, .. | 88 | mut common, |
| 89 | mut irq0, | ||
| 90 | mut sm0, | ||
| 91 | .. | ||
| 89 | } = Pio::new(pio); | 92 | } = Pio::new(pio); |
| 90 | 93 | ||
| 91 | // takes command words (<wait:24> <command:4> <0:4>) | 94 | // takes command words (<wait:24> <command:4> <0:4>) |
| @@ -145,7 +148,7 @@ impl<'l> HD44780<'l> { | |||
| 145 | sm0.push_tx((50 << 8) | 0x20); | 148 | sm0.push_tx((50 << 8) | 0x20); |
| 146 | sm0.push_tx(0b1100_0000); | 149 | sm0.push_tx(0b1100_0000); |
| 147 | 150 | ||
| 148 | sm0.wait_irq(0).await; | 151 | irq0.wait().await; |
| 149 | sm0.set_enable(false); | 152 | sm0.set_enable(false); |
| 150 | 153 | ||
| 151 | // takes command sequences (<rs:1> <count:7>, data...) | 154 | // takes command sequences (<rs:1> <count:7>, data...) |
