aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-05-15 15:59:30 +0000
committerGitHub <[email protected]>2023-05-15 15:59:30 +0000
commit1a87f7477abdb033d960a6af63c95a9e0575e670 (patch)
tree0523c59fe3ef2bd406d44ab414f2903c68a918b9 /tests
parent2bf2e54db925e1d8845deb5eaea737b6add95402 (diff)
parent14a5d03af2a74eccaa9930bdf81eef43791a4b33 (diff)
Merge #1458
1458: rp: remove take!, add bind_interrupts! r=Dirbaio a=pennae both of the uart interrupts now check a flag that only the dma rx path ever sets (and now unsets again on drop) to return early if it's not as they expect. this is ... not our preferred solution, but if bind_interrupts *must* allow mutiple handlers to be specified then this is the only way we can think of that doesn't break uarts. Co-authored-by: pennae <[email protected]>
Diffstat (limited to 'tests')
-rw-r--r--tests/rp/src/bin/uart_buffered.rs20
-rw-r--r--tests/rp/src/bin/uart_dma.rs20
-rw-r--r--tests/rp/src/bin/uart_upgrade.rs12
3 files changed, 32 insertions, 20 deletions
diff --git a/tests/rp/src/bin/uart_buffered.rs b/tests/rp/src/bin/uart_buffered.rs
index 1deb22ce6..1dcf57d07 100644
--- a/tests/rp/src/bin/uart_buffered.rs
+++ b/tests/rp/src/bin/uart_buffered.rs
@@ -4,13 +4,18 @@
4 4
5use defmt::{assert_eq, panic, *}; 5use defmt::{assert_eq, panic, *};
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_rp::bind_interrupts;
7use embassy_rp::gpio::{Level, Output}; 8use embassy_rp::gpio::{Level, Output};
8use embassy_rp::interrupt; 9use embassy_rp::peripherals::UART0;
9use embassy_rp::uart::{BufferedUart, BufferedUartRx, Config, Error, Instance, Parity}; 10use embassy_rp::uart::{BufferedInterruptHandler, BufferedUart, BufferedUartRx, Config, Error, Instance, Parity};
10use embassy_time::{Duration, Timer}; 11use embassy_time::{Duration, Timer};
11use embedded_io::asynch::{Read, ReadExactError, Write}; 12use embedded_io::asynch::{Read, ReadExactError, Write};
12use {defmt_rtt as _, panic_probe as _}; 13use {defmt_rtt as _, panic_probe as _};
13 14
15bind_interrupts!(struct Irqs {
16 UART0_IRQ => BufferedInterruptHandler<UART0>;
17});
18
14async fn read<const N: usize>(uart: &mut BufferedUart<'_, impl Instance>) -> Result<[u8; N], Error> { 19async fn read<const N: usize>(uart: &mut BufferedUart<'_, impl Instance>) -> Result<[u8; N], Error> {
15 let mut buf = [255; N]; 20 let mut buf = [255; N];
16 match uart.read_exact(&mut buf).await { 21 match uart.read_exact(&mut buf).await {
@@ -60,13 +65,12 @@ async fn main(_spawner: Spawner) {
60 info!("Hello World!"); 65 info!("Hello World!");
61 66
62 let (mut tx, mut rx, mut uart) = (p.PIN_0, p.PIN_1, p.UART0); 67 let (mut tx, mut rx, mut uart) = (p.PIN_0, p.PIN_1, p.UART0);
63 let mut irq = interrupt::take!(UART0_IRQ);
64 68
65 { 69 {
66 let config = Config::default(); 70 let config = Config::default();
67 let tx_buf = &mut [0u8; 16]; 71 let tx_buf = &mut [0u8; 16];
68 let rx_buf = &mut [0u8; 16]; 72 let rx_buf = &mut [0u8; 16];
69 let mut uart = BufferedUart::new(&mut uart, &mut irq, &mut tx, &mut rx, tx_buf, rx_buf, config); 73 let mut uart = BufferedUart::new(&mut uart, Irqs, &mut tx, &mut rx, tx_buf, rx_buf, config);
70 74
71 // Make sure we send more bytes than fits in the FIFO, to test the actual 75 // Make sure we send more bytes than fits in the FIFO, to test the actual
72 // bufferedUart. 76 // bufferedUart.
@@ -86,7 +90,7 @@ async fn main(_spawner: Spawner) {
86 let config = Config::default(); 90 let config = Config::default();
87 let tx_buf = &mut [0u8; 16]; 91 let tx_buf = &mut [0u8; 16];
88 let rx_buf = &mut [0u8; 16]; 92 let rx_buf = &mut [0u8; 16];
89 let mut uart = BufferedUart::new(&mut uart, &mut irq, &mut tx, &mut rx, tx_buf, rx_buf, config); 93 let mut uart = BufferedUart::new(&mut uart, Irqs, &mut tx, &mut rx, tx_buf, rx_buf, config);
90 94
91 // Make sure we send more bytes than fits in the FIFO, to test the actual 95 // Make sure we send more bytes than fits in the FIFO, to test the actual
92 // bufferedUart. 96 // bufferedUart.
@@ -121,7 +125,7 @@ async fn main(_spawner: Spawner) {
121 config.baudrate = 1000; 125 config.baudrate = 1000;
122 let tx_buf = &mut [0u8; 16]; 126 let tx_buf = &mut [0u8; 16];
123 let rx_buf = &mut [0u8; 16]; 127 let rx_buf = &mut [0u8; 16];
124 let mut uart = BufferedUart::new(&mut uart, &mut irq, &mut tx, &mut rx, tx_buf, rx_buf, config); 128 let mut uart = BufferedUart::new(&mut uart, Irqs, &mut tx, &mut rx, tx_buf, rx_buf, config);
125 129
126 // break on empty buffer 130 // break on empty buffer
127 uart.send_break(20).await; 131 uart.send_break(20).await;
@@ -155,7 +159,7 @@ async fn main(_spawner: Spawner) {
155 config.baudrate = 1000; 159 config.baudrate = 1000;
156 config.parity = Parity::ParityEven; 160 config.parity = Parity::ParityEven;
157 let rx_buf = &mut [0u8; 16]; 161 let rx_buf = &mut [0u8; 16];
158 let mut uart = BufferedUartRx::new(&mut uart, &mut irq, &mut rx, rx_buf, config); 162 let mut uart = BufferedUartRx::new(&mut uart, Irqs, &mut rx, rx_buf, config);
159 163
160 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u32) { 164 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u32) {
161 send(pin, v, Some(parity != 0)).await; 165 send(pin, v, Some(parity != 0)).await;
@@ -202,7 +206,7 @@ async fn main(_spawner: Spawner) {
202 let mut config = Config::default(); 206 let mut config = Config::default();
203 config.baudrate = 1000; 207 config.baudrate = 1000;
204 let rx_buf = &mut [0u8; 16]; 208 let rx_buf = &mut [0u8; 16];
205 let mut uart = BufferedUartRx::new(&mut uart, &mut irq, &mut rx, rx_buf, config); 209 let mut uart = BufferedUartRx::new(&mut uart, Irqs, &mut rx, rx_buf, config);
206 210
207 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) { 211 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) {
208 if good { 212 if good {
diff --git a/tests/rp/src/bin/uart_dma.rs b/tests/rp/src/bin/uart_dma.rs
index 52f42e582..75be76eda 100644
--- a/tests/rp/src/bin/uart_dma.rs
+++ b/tests/rp/src/bin/uart_dma.rs
@@ -4,12 +4,17 @@
4 4
5use defmt::{assert_eq, *}; 5use defmt::{assert_eq, *};
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_rp::bind_interrupts;
7use embassy_rp::gpio::{Level, Output}; 8use embassy_rp::gpio::{Level, Output};
8use embassy_rp::interrupt; 9use embassy_rp::peripherals::UART0;
9use embassy_rp::uart::{Async, Config, Error, Instance, Parity, Uart, UartRx}; 10use embassy_rp::uart::{Async, Config, Error, Instance, InterruptHandler, Parity, Uart, UartRx};
10use embassy_time::{Duration, Timer}; 11use embassy_time::{Duration, Timer};
11use {defmt_rtt as _, panic_probe as _}; 12use {defmt_rtt as _, panic_probe as _};
12 13
14bind_interrupts!(struct Irqs {
15 UART0_IRQ => InterruptHandler<UART0>;
16});
17
13async fn read<const N: usize>(uart: &mut Uart<'_, impl Instance, Async>) -> Result<[u8; N], Error> { 18async fn read<const N: usize>(uart: &mut Uart<'_, impl Instance, Async>) -> Result<[u8; N], Error> {
14 let mut buf = [255; N]; 19 let mut buf = [255; N];
15 uart.read(&mut buf).await?; 20 uart.read(&mut buf).await?;
@@ -51,7 +56,6 @@ async fn main(_spawner: Spawner) {
51 info!("Hello World!"); 56 info!("Hello World!");
52 57
53 let (mut tx, mut rx, mut uart) = (p.PIN_0, p.PIN_1, p.UART0); 58 let (mut tx, mut rx, mut uart) = (p.PIN_0, p.PIN_1, p.UART0);
54 let mut irq = interrupt::take!(UART0_IRQ);
55 59
56 // We can't send too many bytes, they have to fit in the FIFO. 60 // We can't send too many bytes, they have to fit in the FIFO.
57 // This is because we aren't sending+receiving at the same time. 61 // This is because we aren't sending+receiving at the same time.
@@ -61,7 +65,7 @@ async fn main(_spawner: Spawner) {
61 &mut uart, 65 &mut uart,
62 &mut tx, 66 &mut tx,
63 &mut rx, 67 &mut rx,
64 &mut irq, 68 Irqs,
65 &mut p.DMA_CH0, 69 &mut p.DMA_CH0,
66 &mut p.DMA_CH1, 70 &mut p.DMA_CH1,
67 config, 71 config,
@@ -82,7 +86,7 @@ async fn main(_spawner: Spawner) {
82 &mut uart, 86 &mut uart,
83 &mut tx, 87 &mut tx,
84 &mut rx, 88 &mut rx,
85 &mut irq, 89 Irqs,
86 &mut p.DMA_CH0, 90 &mut p.DMA_CH0,
87 &mut p.DMA_CH1, 91 &mut p.DMA_CH1,
88 config, 92 config,
@@ -111,7 +115,7 @@ async fn main(_spawner: Spawner) {
111 &mut uart, 115 &mut uart,
112 &mut tx, 116 &mut tx,
113 &mut rx, 117 &mut rx,
114 &mut irq, 118 Irqs,
115 &mut p.DMA_CH0, 119 &mut p.DMA_CH0,
116 &mut p.DMA_CH1, 120 &mut p.DMA_CH1,
117 config, 121 config,
@@ -154,7 +158,7 @@ async fn main(_spawner: Spawner) {
154 let mut config = Config::default(); 158 let mut config = Config::default();
155 config.baudrate = 1000; 159 config.baudrate = 1000;
156 config.parity = Parity::ParityEven; 160 config.parity = Parity::ParityEven;
157 let mut uart = UartRx::new(&mut uart, &mut rx, &mut irq, &mut p.DMA_CH0, config); 161 let mut uart = UartRx::new(&mut uart, &mut rx, Irqs, &mut p.DMA_CH0, config);
158 162
159 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u32) { 163 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, parity: u32) {
160 send(pin, v, Some(parity != 0)).await; 164 send(pin, v, Some(parity != 0)).await;
@@ -199,7 +203,7 @@ async fn main(_spawner: Spawner) {
199 // choose a very slow baud rate to make tests reliable even with O0 203 // choose a very slow baud rate to make tests reliable even with O0
200 let mut config = Config::default(); 204 let mut config = Config::default();
201 config.baudrate = 1000; 205 config.baudrate = 1000;
202 let mut uart = UartRx::new(&mut uart, &mut rx, &mut irq, &mut p.DMA_CH0, config); 206 let mut uart = UartRx::new(&mut uart, &mut rx, Irqs, &mut p.DMA_CH0, config);
203 207
204 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) { 208 async fn chr(pin: &mut Output<'_, impl embassy_rp::gpio::Pin>, v: u8, good: bool) {
205 if good { 209 if good {
diff --git a/tests/rp/src/bin/uart_upgrade.rs b/tests/rp/src/bin/uart_upgrade.rs
index d8c9aecf6..8605bb1c5 100644
--- a/tests/rp/src/bin/uart_upgrade.rs
+++ b/tests/rp/src/bin/uart_upgrade.rs
@@ -4,11 +4,16 @@
4 4
5use defmt::{assert_eq, *}; 5use defmt::{assert_eq, *};
6use embassy_executor::Spawner; 6use embassy_executor::Spawner;
7use embassy_rp::interrupt; 7use embassy_rp::bind_interrupts;
8use embassy_rp::uart::{Config, Uart}; 8use embassy_rp::peripherals::UART0;
9use embassy_rp::uart::{BufferedInterruptHandler, Config, Uart};
9use embedded_io::asynch::{Read, Write}; 10use embedded_io::asynch::{Read, Write};
10use {defmt_rtt as _, panic_probe as _}; 11use {defmt_rtt as _, panic_probe as _};
11 12
13bind_interrupts!(struct Irqs {
14 UART0_IRQ => BufferedInterruptHandler<UART0>;
15});
16
12#[embassy_executor::main] 17#[embassy_executor::main]
13async fn main(_spawner: Spawner) { 18async fn main(_spawner: Spawner) {
14 let p = embassy_rp::init(Default::default()); 19 let p = embassy_rp::init(Default::default());
@@ -29,11 +34,10 @@ async fn main(_spawner: Spawner) {
29 uart.blocking_read(&mut buf).unwrap(); 34 uart.blocking_read(&mut buf).unwrap();
30 assert_eq!(buf, data); 35 assert_eq!(buf, data);
31 36
32 let irq = interrupt::take!(UART0_IRQ);
33 let tx_buf = &mut [0u8; 16]; 37 let tx_buf = &mut [0u8; 16];
34 let rx_buf = &mut [0u8; 16]; 38 let rx_buf = &mut [0u8; 16];
35 39
36 let mut uart = uart.into_buffered(irq, tx_buf, rx_buf); 40 let mut uart = uart.into_buffered(Irqs, tx_buf, rx_buf);
37 41
38 // Make sure we send more bytes than fits in the FIFO, to test the actual 42 // Make sure we send more bytes than fits in the FIFO, to test the actual
39 // bufferedUart. 43 // bufferedUart.