aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-03-15 18:51:09 +0000
committerGitHub <[email protected]>2024-03-15 18:51:09 +0000
commitc580d4c490239762b6e68ee9e25599bfe86ed926 (patch)
tree39a1c339e3785072564ecc0b3820233c58138219 /tests
parenta92a73abe46967a9ca511aa21265b7c338e11c6f (diff)
parent0f0301843487a921a5ef57eb8972971181ea0024 (diff)
Merge pull request #2701 from timokroeger/stm32-ucpd
STM32 UCPD CI Test
Diffstat (limited to 'tests')
-rw-r--r--tests/stm32/Cargo.toml8
-rw-r--r--tests/stm32/src/bin/ucpd.rs120
2 files changed, 127 insertions, 1 deletions
diff --git a/tests/stm32/Cargo.toml b/tests/stm32/Cargo.toml
index bfe003a11..e42470004 100644
--- a/tests/stm32/Cargo.toml
+++ b/tests/stm32/Cargo.toml
@@ -13,7 +13,7 @@ stm32f303ze = ["embassy-stm32/stm32f303ze", "chrono", "not-gpdma"]
13stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "eth", "stop", "can", "not-gpdma", "dac", "rng"] 13stm32f429zi = ["embassy-stm32/stm32f429zi", "chrono", "eth", "stop", "can", "not-gpdma", "dac", "rng"]
14stm32f446re = ["embassy-stm32/stm32f446re", "chrono", "stop", "can", "not-gpdma", "dac", "sdmmc"] 14stm32f446re = ["embassy-stm32/stm32f446re", "chrono", "stop", "can", "not-gpdma", "dac", "sdmmc"]
15stm32f767zi = ["embassy-stm32/stm32f767zi", "chrono", "not-gpdma", "eth", "rng"] 15stm32f767zi = ["embassy-stm32/stm32f767zi", "chrono", "not-gpdma", "eth", "rng"]
16stm32g071rb = ["embassy-stm32/stm32g071rb", "cm0", "not-gpdma", "dac"] 16stm32g071rb = ["embassy-stm32/stm32g071rb", "cm0", "not-gpdma", "dac", "ucpd"]
17stm32g491re = ["embassy-stm32/stm32g491re", "chrono", "stop", "not-gpdma", "rng", "fdcan"] 17stm32g491re = ["embassy-stm32/stm32g491re", "chrono", "stop", "not-gpdma", "rng", "fdcan"]
18stm32h563zi = ["embassy-stm32/stm32h563zi", "chrono", "eth", "rng", "hash"] 18stm32h563zi = ["embassy-stm32/stm32h563zi", "chrono", "eth", "rng", "hash"]
19stm32h753zi = ["embassy-stm32/stm32h753zi", "chrono", "not-gpdma", "eth", "rng", "fdcan", "hash", "cryp"] 19stm32h753zi = ["embassy-stm32/stm32h753zi", "chrono", "not-gpdma", "eth", "rng", "fdcan", "hash", "cryp"]
@@ -47,6 +47,7 @@ mac = ["dep:embassy-stm32-wpan", "embassy-stm32-wpan/mac"]
47embassy-stm32-wpan = [] 47embassy-stm32-wpan = []
48not-gpdma = [] 48not-gpdma = []
49dac = [] 49dac = []
50ucpd = []
50 51
51cm0 = ["portable-atomic/unsafe-assume-single-core"] 52cm0 = ["portable-atomic/unsafe-assume-single-core"]
52 53
@@ -161,6 +162,11 @@ path = "src/bin/timer.rs"
161required-features = [] 162required-features = []
162 163
163[[bin]] 164[[bin]]
165name = "ucpd"
166path = "src/bin/ucpd.rs"
167required-features = [ "ucpd",]
168
169[[bin]]
164name = "usart" 170name = "usart"
165path = "src/bin/usart.rs" 171path = "src/bin/usart.rs"
166required-features = [] 172required-features = []
diff --git a/tests/stm32/src/bin/ucpd.rs b/tests/stm32/src/bin/ucpd.rs
new file mode 100644
index 000000000..c09334ec8
--- /dev/null
+++ b/tests/stm32/src/bin/ucpd.rs
@@ -0,0 +1,120 @@
1// required-features: ucpd
2#![no_std]
3#![no_main]
4#[path = "../common.rs"]
5mod common;
6
7use common::*;
8use defmt::{assert, assert_eq};
9use embassy_executor::Spawner;
10use embassy_futures::join::join;
11use embassy_stm32::ucpd::{self, CcPhy, CcPull, CcSel, CcVState, RxError, Ucpd};
12use embassy_stm32::{bind_interrupts, peripherals};
13use embassy_time::Timer;
14
15bind_interrupts!(struct Irqs {
16 UCPD1_2 => ucpd::InterruptHandler<peripherals::UCPD1>, ucpd::InterruptHandler<peripherals::UCPD2>;
17});
18
19static SRC_TO_SNK: [u8; 6] = [0, 1, 2, 3, 4, 5];
20static SNK_TO_SRC: [u8; 4] = [9, 8, 7, 6];
21
22async fn wait_for_vstate<T: ucpd::Instance>(cc_phy: &mut CcPhy<'_, T>, vstate: CcVState) {
23 let (mut cc1, mut _cc2) = cc_phy.vstate();
24 while cc1 != vstate {
25 (cc1, _cc2) = cc_phy.wait_for_vstate_change().await;
26 }
27}
28
29async fn source(
30 mut ucpd: Ucpd<'static, peripherals::UCPD1>,
31 rx_dma: peripherals::DMA1_CH1,
32 tx_dma: peripherals::DMA1_CH2,
33) {
34 debug!("source: setting default current pull-up");
35 ucpd.cc_phy().set_pull(CcPull::SourceDefaultUsb);
36
37 // Wait for default sink.
38 debug!("source: wait for sink");
39 wait_for_vstate(ucpd.cc_phy(), CcVState::LOW).await;
40
41 // Advertise a higher current by changing the pull-up resistor.
42 debug!("source: sink detected, setting 3.0A current pull-up");
43 ucpd.cc_phy().set_pull(CcPull::Source3_0A);
44
45 let (_, mut pd_phy) = ucpd.split_pd_phy(rx_dma, tx_dma, CcSel::CC1);
46
47 // Listen for an incoming message
48 debug!("source: wait for message from sink");
49 let mut snk_to_src_buf = [0_u8; 30];
50 let n = unwrap!(pd_phy.receive(snk_to_src_buf.as_mut()).await);
51 assert_eq!(n, SNK_TO_SRC.len());
52 assert_eq!(&snk_to_src_buf[..n], SNK_TO_SRC.as_slice());
53
54 // Send message
55 debug!("source: message received, sending message");
56 unwrap!(pd_phy.transmit(SRC_TO_SNK.as_slice()).await);
57
58 // Wait for hard-reset
59 debug!("source: message sent, waiting for hard-reset");
60 assert!(matches!(
61 pd_phy.receive(snk_to_src_buf.as_mut()).await,
62 Err(RxError::HardReset)
63 ));
64}
65
66async fn sink(
67 mut ucpd: Ucpd<'static, peripherals::UCPD2>,
68 rx_dma: peripherals::DMA1_CH3,
69 tx_dma: peripherals::DMA1_CH4,
70) {
71 debug!("sink: setting pull down");
72 ucpd.cc_phy().set_pull(CcPull::Sink);
73
74 // Wait for default source.
75 debug!("sink: waiting for default vstate");
76 wait_for_vstate(ucpd.cc_phy(), CcVState::LOW).await;
77
78 // Wait higher current pull-up.
79 //debug!("sink: source default vstate detected, waiting for 3.0A vstate");
80 //wait_for_vstate(ucpd.cc_phy(), CcVState::HIGHEST).await;
81 //debug!("sink: source 3.0A vstate detected");
82 // TODO: not working yet, why? no idea, replace with timer for now
83 Timer::after_millis(100).await;
84
85 let (_, mut pd_phy) = ucpd.split_pd_phy(rx_dma, tx_dma, CcSel::CC1);
86
87 // Send message
88 debug!("sink: sending message");
89 unwrap!(pd_phy.transmit(SNK_TO_SRC.as_slice()).await);
90
91 // Listen for an incoming message
92 debug!("sink: message sent, waiting for message from source");
93 let mut src_to_snk_buf = [0_u8; 30];
94 let n = unwrap!(pd_phy.receive(src_to_snk_buf.as_mut()).await);
95 assert_eq!(n, SRC_TO_SNK.len());
96 assert_eq!(&src_to_snk_buf[..n], SRC_TO_SNK.as_slice());
97
98 // Send hard reset
99 debug!("sink: message received, sending hard-reset");
100 unwrap!(pd_phy.transmit_hardreset().await);
101}
102
103#[embassy_executor::main]
104async fn main(_spawner: Spawner) {
105 let p = embassy_stm32::init(config());
106 info!("Hello World!");
107
108 // Wire between PD0 and PA8
109 let ucpd1 = Ucpd::new(p.UCPD1, Irqs {}, p.PA8, p.PB15);
110 let ucpd2 = Ucpd::new(p.UCPD2, Irqs {}, p.PD0, p.PD2);
111
112 join(
113 source(ucpd1, p.DMA1_CH1, p.DMA1_CH2),
114 sink(ucpd2, p.DMA1_CH3, p.DMA1_CH4),
115 )
116 .await;
117
118 info!("Test OK");
119 cortex_m::asm::bkpt();
120}