aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-rp/src/pio.rs62
1 files changed, 40 insertions, 22 deletions
diff --git a/embassy-rp/src/pio.rs b/embassy-rp/src/pio.rs
index 769641ac9..3c5969dbd 100644
--- a/embassy-rp/src/pio.rs
+++ b/embassy-rp/src/pio.rs
@@ -811,28 +811,6 @@ impl<'d, PIO: PioInstance> PioCommon<'d, PIO> {
811 self.instructions_used &= !instrs.used_mask; 811 self.instructions_used &= !instrs.used_mask;
812 } 812 }
813 813
814 pub fn is_irq_set(&self, irq_no: u8) -> bool {
815 assert!(irq_no < 8);
816 unsafe {
817 let irq_flags = PIO::PIO.irq();
818 irq_flags.read().0 & (1 << irq_no) != 0
819 }
820 }
821
822 pub fn clear_irq(&mut self, irq_no: usize) {
823 assert!(irq_no < 8);
824 unsafe { PIO::PIO.irq().write(|w| w.set_irq(1 << irq_no)) }
825 }
826
827 pub fn clear_irqs(&mut self, mask: u8) {
828 unsafe { PIO::PIO.irq().write(|w| w.set_irq(mask)) }
829 }
830
831 pub fn force_irq(&mut self, irq_no: usize) {
832 assert!(irq_no < 8);
833 unsafe { PIO::PIO.irq_force().write(|w| w.set_irq_force(1 << irq_no)) }
834 }
835
836 pub fn set_input_sync_bypass<'a>(&'a mut self, bypass: u32, mask: u32) { 814 pub fn set_input_sync_bypass<'a>(&'a mut self, bypass: u32, mask: u32) {
837 unsafe { 815 unsafe {
838 // this can interfere with per-pin bypass functions. splitting the 816 // this can interfere with per-pin bypass functions. splitting the
@@ -878,8 +856,47 @@ impl<'d, PIO: PioInstance, const N: usize> PioIrq<'d, PIO, N> {
878 } 856 }
879} 857}
880 858
859#[derive(Clone)]
860pub struct PioIrqFlags<'d, PIO: PioInstance> {
861 pio: PhantomData<&'d PIO>,
862}
863
864impl<'d, PIO: PioInstance> PioIrqFlags<'d, PIO> {
865 pub fn check(&self, irq_no: u8) -> bool {
866 assert!(irq_no < 8);
867 self.check_any(1 << irq_no)
868 }
869
870 pub fn check_any(&self, irqs: u8) -> bool {
871 unsafe { PIO::PIO.irq().read().irq() & irqs != 0 }
872 }
873
874 pub fn check_all(&self, irqs: u8) -> bool {
875 unsafe { PIO::PIO.irq().read().irq() & irqs == irqs }
876 }
877
878 pub fn clear(&self, irq_no: usize) {
879 assert!(irq_no < 8);
880 self.clear_all(1 << irq_no);
881 }
882
883 pub fn clear_all(&self, irqs: u8) {
884 unsafe { PIO::PIO.irq().write(|w| w.set_irq(irqs)) }
885 }
886
887 pub fn set(&self, irq_no: usize) {
888 assert!(irq_no < 8);
889 self.set_all(1 << irq_no);
890 }
891
892 pub fn set_all(&self, irqs: u8) {
893 unsafe { PIO::PIO.irq_force().write(|w| w.set_irq_force(irqs)) }
894 }
895}
896
881pub struct Pio<'d, PIO: PioInstance> { 897pub struct Pio<'d, PIO: PioInstance> {
882 pub common: PioCommon<'d, PIO>, 898 pub common: PioCommon<'d, PIO>,
899 pub irq_flags: PioIrqFlags<'d, PIO>,
883 pub irq0: PioIrq<'d, PIO, 0>, 900 pub irq0: PioIrq<'d, PIO, 0>,
884 pub irq1: PioIrq<'d, PIO, 1>, 901 pub irq1: PioIrq<'d, PIO, 1>,
885 pub irq2: PioIrq<'d, PIO, 2>, 902 pub irq2: PioIrq<'d, PIO, 2>,
@@ -899,6 +916,7 @@ impl<'d, PIO: PioInstance> Pio<'d, PIO> {
899 instructions_used: 0, 916 instructions_used: 0,
900 pio: PhantomData, 917 pio: PhantomData,
901 }, 918 },
919 irq_flags: PioIrqFlags { pio: PhantomData },
902 irq0: PioIrq { pio: PhantomData }, 920 irq0: PioIrq { pio: PhantomData },
903 irq1: PioIrq { pio: PhantomData }, 921 irq1: PioIrq { pio: PhantomData },
904 irq2: PioIrq { pio: PhantomData }, 922 irq2: PioIrq { pio: PhantomData },