aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaleb Jamison <[email protected]>2024-09-16 12:41:12 -0400
committerCaleb Jamison <[email protected]>2024-09-16 12:41:12 -0400
commit48fd0550d1569a44a6b58a41423b0f86270fb373 (patch)
tree6d80a1e33b59dc715c218772ed9ad1790f0325f2
parent55c3da5a4f48ea6c66371484c83d6298cde3befe (diff)
Review fixes
Don't overflow on subtract Replace giant match with for loop dedupe register write
-rw-r--r--embassy-rp/src/pio/mod.rs130
1 files changed, 43 insertions, 87 deletions
diff --git a/embassy-rp/src/pio/mod.rs b/embassy-rp/src/pio/mod.rs
index fc940b045..ace597f00 100644
--- a/embassy-rp/src/pio/mod.rs
+++ b/embassy-rp/src/pio/mod.rs
@@ -767,95 +767,51 @@ impl<'d, PIO: Instance + 'd, const SM: usize> StateMachine<'d, PIO, SM> {
767 767
768 #[cfg(feature = "_rp235x")] 768 #[cfg(feature = "_rp235x")]
769 { 769 {
770 let shift_gpio_base = { 770 let mut low_ok = true;
771 match ( 771 let mut high_ok = true;
772 if config.in_count > 0 { 772 for pin in [
773 Some(config.pins.in_base) 773 config.pins.in_base,
774 } else { 774 config.pins.in_base + config.in_count,
775 None 775 config.pins.sideset_base,
776 }, 776 config.pins.sideset_base + config.pins.sideset_count,
777 if config.pins.sideset_count > 0 { 777 config.pins.set_base,
778 Some(config.pins.sideset_base) 778 config.pins.set_base + config.pins.set_count,
779 } else { 779 config.pins.out_base,
780 None 780 config.pins.out_base + config.pins.out_count,
781 }, 781 ]
782 if config.pins.set_count > 0 { 782 .iter()
783 Some(config.pins.set_base) 783 .flatten()
784 } else { 784 {
785 None 785 low_ok &= pin < 32;
786 }, 786 high_ok &= pin >= 16;
787 if config.pins.out_count > 0 {
788 Some(config.pins.out_base)
789 } else {
790 None
791 },
792 ) {
793 (None, None, None, None) => false,
794
795 (Some(..32), None, None, None) => false,
796 (None, Some(..32), None, None) => false,
797 (None, None, Some(..32), None) => false,
798 (None, None, None, Some(..32)) => false,
799
800 (Some(..32), Some(..32), None, None) => false,
801 (None, Some(..32), Some(..32), None) => false,
802 (None, None, Some(..32), Some(..32)) => false,
803 (Some(..32), None, None, Some(..32)) => false,
804
805 (None, Some(..32), Some(..32), Some(..32)) => false,
806 (Some(..32), None, Some(..32), Some(..32)) => false,
807 (Some(..32), Some(..32), None, Some(..32)) => false,
808 (Some(..32), Some(..32), Some(..32), None) => false,
809
810 (Some(..32), Some(..32), Some(..32), Some(..32)) => false,
811
812 (Some(16..), None, None, None) => true,
813 (None, Some(16..), None, None) => true,
814 (None, None, Some(16..), None) => true,
815 (None, None, None, Some(16..)) => true,
816
817 (Some(16..), Some(16..), None, None) => true,
818 (None, Some(16..), Some(16..), None) => true,
819 (None, None, Some(16..), Some(16..)) => true,
820 (Some(16..), None, None, Some(16..)) => true,
821
822 (None, Some(16..), Some(16..), Some(16..)) => true,
823 (Some(16..), None, Some(16..), Some(16..)) => true,
824 (Some(16..), Some(16..), None, Some(16..)) => true,
825 (Some(16..), Some(16..), Some(16..), None) => true,
826
827 (Some(16..), Some(16..), Some(16..), Some(16..)) => true,
828
829 (i, side, set, out) => panic!(
830 "All pins must either be <=31 or >=16, in:{:?}, side:{:?}, set:{:?}, out:{:?}",
831 i, side, set, out
832 ),
833 }
834 };
835
836 if shift_gpio_base {
837 sm.pinctrl().write(|w| {
838 w.set_sideset_count(config.pins.sideset_count);
839 w.set_set_count(config.pins.set_count);
840 w.set_out_count(config.pins.out_count);
841 w.set_in_base(config.pins.in_base - 16);
842 w.set_sideset_base(config.pins.sideset_base - 16);
843 w.set_set_base(config.pins.set_base - 16);
844 w.set_out_base(config.pins.out_base - 16);
845 });
846 } else {
847 sm.pinctrl().write(|w| {
848 w.set_sideset_count(config.pins.sideset_count);
849 w.set_set_count(config.pins.set_count);
850 w.set_out_count(config.pins.out_count);
851 w.set_in_base(config.pins.in_base);
852 w.set_sideset_base(config.pins.sideset_base);
853 w.set_set_base(config.pins.set_base);
854 w.set_out_base(config.pins.out_base);
855 });
856 } 787 }
857 788
858 PIO::PIO.gpiobase().write(|w| w.set_gpiobase(shift_gpio_base)); 789 if !low_ok && !high_ok {
790 panic!(
791 "All pins must either be <32 or >=16, in:{:?}-{:?}, side:{:?}-{:?}, set:{:?}-{:?}, out:{:?}-{:?}",
792 config.pins.in_base,
793 config.pins.in_base + config.in_count,
794 config.pins.sideset_base,
795 config.pins.sideset_base + config.pins.sideset_count,
796 config.pins.set_base,
797 config.pins.set_base + config.pins.set_count,
798 config.pins.out_base,
799 config.pins.out_base + config.pins.out_count,
800 )
801 }
802 let shift = if low_ok { 0 } else { 16 };
803
804 sm.pinctrl().write(|w| {
805 w.set_sideset_count(config.pins.sideset_count);
806 w.set_set_count(config.pins.set_count);
807 w.set_out_count(config.pins.out_count);
808 w.set_in_base(config.pins.in_base.checked_sub(shift).unwrap_or_default());
809 w.set_sideset_base(config.pins.sideset_base.checked_sub(shift).unwrap_or_default());
810 w.set_set_base(config.pins.set_base.checked_sub(shift).unwrap_or_default());
811 w.set_out_base(config.pins.out_base.checked_sub(shift).unwrap_or_default());
812 });
813
814 PIO::PIO.gpiobase().write(|w| w.set_gpiobase(shift == 16));
859 } 815 }
860 816
861 if let Some(origin) = config.origin { 817 if let Some(origin) = config.origin {