diff --git a/embassy-stm32/src/tsc/mod.rs b/embassy-stm32/src/tsc/mod.rs
index 8da0e87ab..301d6f900 100644
--- a/embassy-stm32/src/tsc/mod.rs
+++ b/embassy-stm32/src/tsc/mod.rs
@@ -5,7 +5,7 @@
/// Enums defined for peripheral parameters
pub mod enums;
-use crate::gpio::AnyPin;
+use crate::gpio::{low_level::AFType, AnyPin, Pull};
use crate::{pac::tsc::Tsc as Regs, rcc::RccPeripheral};
use crate::{peripherals, Peripheral};
use embassy_hal_internal::{into_ref, PeripheralRef};
@@ -186,22 +186,21 @@ impl<'d, T: Instance> Tsc<'d, T> {
pub fn new(
peri: impl Peripheral
+ 'd,
// g1_d1: Option> + 'd>>,
- // g1_d2: Option> + 'd>>,
- // g1_d3: Option> + 'd>>,
+ g1_d2: Option> + 'd>>,
+ g1_d3: Option> + 'd>>,
// g1_d4: Option> + 'd>>,
// g2_d1: Option> + 'd>,
// g2_d2: Option> + 'd>,
- // g2_d3: Option> + 'd>,
- // g2_d4: Option> + 'd>,
+ g2_d3: Option> + 'd>>,
+ g2_d4: Option> + 'd>>,
// g3_d1: Option> + 'd>,
// g3_d2: Option> + 'd>,
// g3_d3: Option> + 'd>,
// g3_d4: Option> + 'd>,
-
- // g4_d1: Option> + 'd>,
- // g4_d2: Option> + 'd>,
+ g4_d1: Option> + 'd>>,
+ g4_d2: Option> + 'd>>,
// g4_d3: Option> + 'd>,
// g4_d4: Option> + 'd>,
@@ -226,13 +225,102 @@ impl<'d, T: Instance> Tsc<'d, T> {
// g8_d4: Option> + 'd>,
config: Config,
) -> Self {
- into_ref!(peri);
+ let g1_d2 = g1_d2.unwrap();
+ let g1_d2_pin = g1_d2.pin;
+ let g1_d3 = g1_d3.unwrap();
+ let g1_d3_pin = g1_d3.pin;
+ let g2_d3 = g2_d3.unwrap();
+ let g2_d3_pin = g2_d3.pin;
+ let g2_d4 = g2_d4.unwrap();
+ let g2_d4_pin = g2_d4.pin;
+ let g4_d1 = g4_d1.unwrap();
+ let g4_d1_pin = g4_d1.pin;
+ let g4_d2 = g4_d2.unwrap();
+ let g4_d2_pin = g4_d2.pin;
+ into_ref!(peri, g1_d2_pin, g1_d3_pin, g2_d3_pin, g2_d4_pin, g4_d1_pin, g4_d2_pin);
+
+ // Configure pins
+ match g1_d2.role {
+ PinType::Channel => g1_d2_pin.set_as_af_pull(g1_d2_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ PinType::Sample => g1_d2_pin.set_as_af_pull(g1_d2_pin.af_num(), AFType::OutputOpenDrain, Pull::None),
+ PinType::Shield => g1_d2_pin.set_as_af_pull(g1_d2_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ }
+ match g1_d3.role {
+ PinType::Channel => g1_d3_pin.set_as_af_pull(g1_d3_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ PinType::Sample => g1_d3_pin.set_as_af_pull(g1_d3_pin.af_num(), AFType::OutputOpenDrain, Pull::None),
+ PinType::Shield => g1_d3_pin.set_as_af_pull(g1_d3_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ }
+ let g1 = PinGroup {
+ d1: None,
+ d2: Some(TscPin {
+ pin: g1_d2_pin.map_into(),
+ role: g1_d2.role,
+ }),
+ d3: Some(TscPin {
+ pin: g1_d3_pin.map_into(),
+ role: g1_d3.role,
+ }),
+ d4: None,
+ };
+
+ match g2_d3.role {
+ PinType::Channel => g2_d3_pin.set_as_af_pull(g2_d3_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ PinType::Sample => g2_d3_pin.set_as_af_pull(g2_d3_pin.af_num(), AFType::OutputOpenDrain, Pull::None),
+ PinType::Shield => g2_d3_pin.set_as_af_pull(g2_d3_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ }
+ match g2_d4.role {
+ PinType::Channel => g2_d4_pin.set_as_af_pull(g2_d4_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ PinType::Sample => g2_d4_pin.set_as_af_pull(g2_d4_pin.af_num(), AFType::OutputOpenDrain, Pull::None),
+ PinType::Shield => g2_d4_pin.set_as_af_pull(g2_d4_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ }
+ let g2 = PinGroup {
+ d1: None,
+ d2: None,
+ d3: Some(TscPin {
+ pin: g2_d3_pin.map_into(),
+ role: g2_d3.role,
+ }),
+ d4: Some(TscPin {
+ pin: g2_d4_pin.map_into(),
+ role: g2_d4.role,
+ }),
+ };
+
+ match g4_d1.role {
+ PinType::Channel => g4_d1_pin.set_as_af_pull(g4_d1_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ PinType::Sample => g4_d1_pin.set_as_af_pull(g4_d1_pin.af_num(), AFType::OutputOpenDrain, Pull::None),
+ PinType::Shield => g4_d1_pin.set_as_af_pull(g4_d1_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ }
+ match g4_d2.role {
+ PinType::Channel => g4_d2_pin.set_as_af_pull(g4_d2_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ PinType::Sample => g4_d2_pin.set_as_af_pull(g4_d2_pin.af_num(), AFType::OutputOpenDrain, Pull::None),
+ PinType::Shield => g4_d2_pin.set_as_af_pull(g4_d2_pin.af_num(), AFType::OutputPushPull, Pull::None),
+ }
+ let g4 = PinGroup {
+ d1: Some(TscPin {
+ pin: g4_d1_pin.map_into(),
+ role: g4_d1.role,
+ }),
+ d2: Some(TscPin {
+ pin: g4_d2_pin.map_into(),
+ role: g4_d2.role,
+ }),
+ d3: None,
+ d4: None,
+ };
// Need to check valid pin configuration input
- // Need to configure pin
- Self::new_inner(peri, config)
+ Self::new_inner(peri, Some(g1), Some(g2), None, Some(g4), None, None, None, None, config)
}
+ // fn configure_pin<'b, G: Pin>(pin: PeripheralRef<'b, G>, role: PinType) {
+ // match role {
+ // PinType::Channel => pin.set_as_af_pull(pin.af_num(), AFType::OutputPushPull, Pull::None),
+ // PinType::Sample => {}
+ // PinType::Shield => {}
+ // }
+ // }
+
// fn filter_group() -> Option> {}
fn extract_groups(io_mask: u32) -> u32 {
let mut groups: u32 = 0;
@@ -244,7 +332,18 @@ impl<'d, T: Instance> Tsc<'d, T> {
groups
}
- fn new_inner(peri: impl Peripheral + 'd, config: Config) -> Self {
+ fn new_inner(
+ peri: impl Peripheral
+ 'd,
+ g1: Option>,
+ g2: Option>,
+ g3: Option>,
+ g4: Option>,
+ g5: Option>,
+ g6: Option>,
+ g7: Option>,
+ g8: Option>,
+ config: Config,
+ ) -> Self {
into_ref!(peri);
T::enable_and_reset();
@@ -306,14 +405,14 @@ impl<'d, T: Instance> Tsc<'d, T> {
Self {
_peri: peri,
- g1: None,
- g2: None,
- g3: None,
- g4: None,
- g5: None,
- g6: None,
- g7: None,
- g8: None,
+ g1,
+ g2,
+ g3,
+ g4,
+ g5,
+ g6,
+ g7,
+ g8,
state: State::Ready,
config,
}