diff options
| author | Caleb Jamison <[email protected]> | 2024-09-16 12:41:12 -0400 |
|---|---|---|
| committer | Caleb Jamison <[email protected]> | 2024-09-16 12:41:12 -0400 |
| commit | 48fd0550d1569a44a6b58a41423b0f86270fb373 (patch) | |
| tree | 6d80a1e33b59dc715c218772ed9ad1790f0325f2 | |
| parent | 55c3da5a4f48ea6c66371484c83d6298cde3befe (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.rs | 130 |
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 { |
