From 4f1be456f4fb63fec7df3f5d0dc21b682934c02d Mon Sep 17 00:00:00 2001 From: matteotullo Date: Mon, 18 May 2026 13:48:47 -0700 Subject: [PATCH 1/5] Add SVID discovery functionality to type-c controller --- Cargo.lock | 1 + examples/rt685s-evk/Cargo.lock | 1 + examples/std/Cargo.lock | 1 + .../std/src/lib/type_c/mock_controller.rs | 7 +++ type-c-interface/Cargo.toml | 1 + type-c-interface/src/control/mod.rs | 1 + type-c-interface/src/control/svid.rs | 62 +++++++++++++++++++ type-c-interface/src/controller/mod.rs | 1 + type-c-interface/src/controller/svid.rs | 9 +++ type-c-interface/src/port/mod.rs | 1 + type-c-interface/src/port/svid.rs | 9 +++ type-c-service/src/controller/mod.rs | 1 + type-c-service/src/controller/svid.rs | 21 +++++++ type-c-service/src/driver/tps6699x.rs | 25 ++++++++ 14 files changed, 141 insertions(+) create mode 100644 type-c-interface/src/control/svid.rs create mode 100644 type-c-interface/src/controller/svid.rs create mode 100644 type-c-interface/src/port/svid.rs create mode 100644 type-c-service/src/controller/svid.rs diff --git a/Cargo.lock b/Cargo.lock index 4f5c1a89..89bd9182 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2262,6 +2262,7 @@ dependencies = [ "defmt 0.3.100", "embedded-services", "embedded-usb-pd", + "heapless 0.8.0", "log", "power-policy-interface", ] diff --git a/examples/rt685s-evk/Cargo.lock b/examples/rt685s-evk/Cargo.lock index 342fa1dc..2ed81527 100644 --- a/examples/rt685s-evk/Cargo.lock +++ b/examples/rt685s-evk/Cargo.lock @@ -1512,6 +1512,7 @@ dependencies = [ "defmt 0.3.100", "embedded-services", "embedded-usb-pd", + "heapless 0.8.0", "power-policy-interface", ] diff --git a/examples/std/Cargo.lock b/examples/std/Cargo.lock index 5d622782..fa1f9db3 100644 --- a/examples/std/Cargo.lock +++ b/examples/std/Cargo.lock @@ -1472,6 +1472,7 @@ dependencies = [ "bitfield 0.17.0", "embedded-services", "embedded-usb-pd", + "heapless 0.8.0", "log", "power-policy-interface", ] diff --git a/examples/std/src/lib/type_c/mock_controller.rs b/examples/std/src/lib/type_c/mock_controller.rs index 206857cd..848755b8 100644 --- a/examples/std/src/lib/type_c/mock_controller.rs +++ b/examples/std/src/lib/type_c/mock_controller.rs @@ -237,6 +237,13 @@ impl type_c_interface::controller::max_sink_voltage::MaxSinkVoltage for Controll } } +impl type_c_interface::controller::svid::SvidDiscovery for Controller<'_> { + async fn get_discovered_svids(&mut self, port: LocalPortId) -> Result { + debug!("Get discovered SVIDs for port {port:?}"); + Ok(DiscoveredSvids::default()) + } +} + impl type_c_interface::controller::pd::StateMachine for Controller<'_> { async fn set_pd_state_machine_config( &mut self, diff --git a/type-c-interface/Cargo.toml b/type-c-interface/Cargo.toml index 27857480..f8565d54 100644 --- a/type-c-interface/Cargo.toml +++ b/type-c-interface/Cargo.toml @@ -15,6 +15,7 @@ defmt = { workspace = true, optional = true } embedded-services.workspace = true embedded-usb-pd.workspace = true power-policy-interface.workspace = true +heapless.workspace = true [lints] workspace = true diff --git a/type-c-interface/src/control/mod.rs b/type-c-interface/src/control/mod.rs index 05607dec..426d42af 100644 --- a/type-c-interface/src/control/mod.rs +++ b/type-c-interface/src/control/mod.rs @@ -3,6 +3,7 @@ pub mod dp; pub mod pd; pub mod power; pub mod retimer; +pub mod svid; pub mod tbt; pub mod type_c; pub mod usb; diff --git a/type-c-interface/src/control/svid.rs b/type-c-interface/src/control/svid.rs new file mode 100644 index 00000000..fa40ed53 --- /dev/null +++ b/type-c-interface/src/control/svid.rs @@ -0,0 +1,62 @@ +use embedded_usb_pd::vdm::structured::Svid; +use heapless::Vec; + +/// Response from the `Discover SVIDs REQ` message and the [`PortCommandData::GetDiscoveredSvids`] command. +// Could be changed to hold the heapless::Vec directly if they were Copy or if PortResponseData was not Copy +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] +pub struct DiscoveredSvids { + num_sop: usize, + sop: [Svid; Self::NUM_SVIDS], + + num_sop_prime: usize, + sop_prime: [Svid; Self::NUM_SVIDS], +} + +impl DiscoveredSvids { + /// The number of SVIDs that can be reported in a single [`PortResponseData::DiscoveredSvids`] response. + const NUM_SVIDS: usize = 8; + + /// Create a new response object from `sop` and `sop_prime`. + pub fn new(sop: Vec, sop_prime: Vec) -> Self { + let num_sop = sop.len(); + let num_sop_prime = sop_prime.len(); + + let mut sop_array = [Svid(0); _]; + for (svid, dest) in sop.into_iter().zip(sop_array.iter_mut()) { + *dest = svid; + } + + let mut sop_prime_array = [Svid(0); _]; + for (svid, dest) in sop_prime.into_iter().zip(sop_prime_array.iter_mut()) { + *dest = svid; + } + + Self { + num_sop, + sop: sop_array, + num_sop_prime, + sop_prime: sop_prime_array, + } + } + + /// Returns the number of SVIDs discovered on the SOP port partner. + pub fn number_sop_svids(&self) -> usize { + self.num_sop + } + + /// Returns an iterator over the SVIDs discovered on the SOP port partner. + pub fn svid_sop(&self) -> impl ExactSizeIterator { + self.sop.iter().copied().take(self.num_sop) + } + + /// Returns the number of SVIDs discovered on the SOP' cable plug. + pub fn number_sop_prime_svids(&self) -> usize { + self.num_sop_prime + } + + /// Returns an iterator over the SVIDs discovered on the SOP' cable plug. + pub fn svid_sop_prime(&self) -> impl ExactSizeIterator { + self.sop_prime.iter().copied().take(self.num_sop_prime) + } +} diff --git a/type-c-interface/src/controller/mod.rs b/type-c-interface/src/controller/mod.rs index 9268ba28..c788c505 100644 --- a/type-c-interface/src/controller/mod.rs +++ b/type-c-interface/src/controller/mod.rs @@ -8,6 +8,7 @@ pub mod max_sink_voltage; pub mod pd; pub mod power; pub mod retimer; +pub mod svid; pub mod type_c; /// Controller ID diff --git a/type-c-interface/src/controller/svid.rs b/type-c-interface/src/controller/svid.rs new file mode 100644 index 00000000..2b5ada5e --- /dev/null +++ b/type-c-interface/src/controller/svid.rs @@ -0,0 +1,9 @@ +use embedded_usb_pd::{LocalPortId, PdError}; + +use crate::{control::svid::DiscoveredSvids, controller::pd::Pd}; + +/// Functionality related to getting a port's discovered SVIDs. +pub trait SvidDiscovery: Pd { + /// Get a port's discovered SVIDs + fn get_discovered_svids(&mut self, port: LocalPortId) -> impl Future>; +} diff --git a/type-c-interface/src/port/mod.rs b/type-c-interface/src/port/mod.rs index 7920f6db..652fd416 100644 --- a/type-c-interface/src/port/mod.rs +++ b/type-c-interface/src/port/mod.rs @@ -5,4 +5,5 @@ pub mod max_sink_voltage; pub mod pd; pub mod power; pub mod retimer; +pub mod svid; pub mod type_c; diff --git a/type-c-interface/src/port/svid.rs b/type-c-interface/src/port/svid.rs new file mode 100644 index 00000000..9ad7f696 --- /dev/null +++ b/type-c-interface/src/port/svid.rs @@ -0,0 +1,9 @@ +use embedded_usb_pd::PdError; + +use crate::{control::svid::DiscoveredSvids, port::pd::Pd}; + +/// Functionality related to getting this port's discovered SVIDs. +pub trait SvidDiscovery: Pd { + /// Get this port's discovered SVIDs + fn get_discovered_svids(&mut self) -> impl Future>; +} diff --git a/type-c-service/src/controller/mod.rs b/type-c-service/src/controller/mod.rs index e81cff9b..895e45a7 100644 --- a/type-c-service/src/controller/mod.rs +++ b/type-c-service/src/controller/mod.rs @@ -21,6 +21,7 @@ mod pd; mod power; pub mod retimer; pub mod state; +pub mod svid; pub mod type_c; pub mod ucsi; diff --git a/type-c-service/src/controller/svid.rs b/type-c-service/src/controller/svid.rs new file mode 100644 index 00000000..d72159b0 --- /dev/null +++ b/type-c-service/src/controller/svid.rs @@ -0,0 +1,21 @@ +//! Max sink voltage port trait implementation +use embedded_services::{event::Sender, sync::Lockable}; +use embedded_usb_pd::PdError; +use type_c_interface::{control::svid::DiscoveredSvids, controller::svid::SvidDiscovery}; + +use super::*; +use crate::controller::state::SharedState; + +impl< + 'device, + C: Lockable, + Shared: Lockable, + TypeCSender: Sender, + PowerSender: Sender, + LoopbackSender: Sender, +> type_c_interface::port::svid::SvidDiscovery for Port<'device, C, Shared, TypeCSender, PowerSender, LoopbackSender> +{ + async fn get_discovered_svids(&mut self) -> Result { + self.controller.lock().await.get_discovered_svids(self.port).await + } +} diff --git a/type-c-service/src/driver/tps6699x.rs b/type-c-service/src/driver/tps6699x.rs index 1560cd70..6afa4f4e 100644 --- a/type-c-service/src/driver/tps6699x.rs +++ b/type-c-service/src/driver/tps6699x.rs @@ -16,6 +16,7 @@ use embedded_usb_pd::type_c::Current as TypecCurrent; use embedded_usb_pd::ucsi::lpm; use embedded_usb_pd::{DataRole, Error, LocalPortId, PdError, PlugOrientation, PowerRole}; use fw_update_interface::basic::{Error as BasicFwUpdateError, FwUpdate as BasicFwUpdate}; +use heapless::Vec; use tps6699x::MAX_SUPPORTED_PORTS; use tps6699x::asynchronous::embassy::{self as tps6699x_drv, interrupt}; use tps6699x::asynchronous::fw_update::UpdateTarget; @@ -33,6 +34,7 @@ use type_c_interface::control::dp::{DpConfig, DpPinConfig, DpStatus}; use type_c_interface::control::pd::{PdStateMachineConfig, PortStatus}; use type_c_interface::control::power::SystemPowerState; use type_c_interface::control::retimer::RetimerFwUpdateState; +use type_c_interface::control::svid::DiscoveredSvids; use type_c_interface::control::tbt::TbtConfig; use type_c_interface::control::type_c::TypeCStateMachineState; use type_c_interface::control::usb::UsbControlConfig; @@ -888,6 +890,29 @@ impl type_c_interface::controller::max_sink_voltage::MaxSin } } +impl type_c_interface::controller::svid::SvidDiscovery for Tps6699x<'_, M, B> { + async fn get_discovered_svids(&mut self, port: LocalPortId) -> Result { + let svids = self + .tps6699x + .get_discovered_svids(port) + .await + .map_err(|e| self.log_error(e))?; + debug!("{:?} discovered SVIDs: {:?}", port, svids); + let mut sop = Vec::new(); + for svid in svids.svid_sop().take(sop.capacity()) { + let _ = sop.push(svid); + } + + let mut sop_prime = Vec::new(); + for svid in svids.svid_sop_prime().take(sop_prime.capacity()) { + let _ = sop_prime.push(svid); + } + + let svids = DiscoveredSvids::new(sop, sop_prime); + Ok(svids) + } +} + impl<'a, M: RawMutex, BUS: I2c> AsRef> for Tps6699x<'a, M, BUS> { fn as_ref(&self) -> &tps6699x_drv::Tps6699x<'a, M, BUS> { &self.tps6699x From 36c53952d4d08f1af90680dd78b4d3a40fcce2d4 Mon Sep 17 00:00:00 2001 From: matteotullo Date: Mon, 18 May 2026 14:44:13 -0700 Subject: [PATCH 2/5] Implement Discover Identity and Hard Reset traits for Type-C controller --- .../std/src/lib/type_c/mock_controller.rs | 22 ++++++++ .../src/controller/discover_identity.rs | 19 +++++++ type-c-interface/src/controller/hard_reset.rs | 9 ++++ type-c-interface/src/controller/mod.rs | 2 + .../src/port/discover_identity.rs | 15 ++++++ type-c-interface/src/port/hard_reset.rs | 9 ++++ type-c-interface/src/port/mod.rs | 2 + .../src/controller/discover_identity.rs | 35 ++++++++++++ type-c-service/src/controller/hard_reset.rs | 21 ++++++++ type-c-service/src/controller/mod.rs | 2 + type-c-service/src/driver/tps6699x.rs | 54 +++++++++++++++++++ 11 files changed, 190 insertions(+) create mode 100644 type-c-interface/src/controller/discover_identity.rs create mode 100644 type-c-interface/src/controller/hard_reset.rs create mode 100644 type-c-interface/src/port/discover_identity.rs create mode 100644 type-c-interface/src/port/hard_reset.rs create mode 100644 type-c-service/src/controller/discover_identity.rs create mode 100644 type-c-service/src/controller/hard_reset.rs diff --git a/examples/std/src/lib/type_c/mock_controller.rs b/examples/std/src/lib/type_c/mock_controller.rs index 848755b8..c54458cc 100644 --- a/examples/std/src/lib/type_c/mock_controller.rs +++ b/examples/std/src/lib/type_c/mock_controller.rs @@ -244,6 +244,28 @@ impl type_c_interface::controller::svid::SvidDiscovery for Controller<'_> { } } +impl type_c_interface::controller::hard_reset::HardReset for Controller<'_> { + async fn hard_reset(&mut self, port: LocalPortId) -> Result<(), PdError> { + debug!("Hard reset for port {port:?}"); + Ok(()) + } +} + +impl type_c_interface::controller::discover_identity::DiscoverIdentity for Controller<'_> { + async fn get_discover_identity_sop_response(&mut self, port: LocalPortId) -> Result { + debug!("Get Discover Identity SOP response for port {port:?}"); + Err(PdError::Failed) + } + + async fn get_discover_identity_sop_prime_response( + &mut self, + port: LocalPortId, + ) -> Result { + debug!("Get Discover Identity SOP' response for port {port:?}"); + Err(PdError::Failed) + } +} + impl type_c_interface::controller::pd::StateMachine for Controller<'_> { async fn set_pd_state_machine_config( &mut self, diff --git a/type-c-interface/src/controller/discover_identity.rs b/type-c-interface/src/controller/discover_identity.rs new file mode 100644 index 00000000..cc266fe4 --- /dev/null +++ b/type-c-interface/src/controller/discover_identity.rs @@ -0,0 +1,19 @@ +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; +use embedded_usb_pd::{LocalPortId, PdError}; + +use crate::controller::pd::Pd; + +/// Functionality related to getting a port's Discover Identity responses. +pub trait DiscoverIdentity: Pd { + /// Get the latest response from the Discover Identity command targeting SOP. + fn get_discover_identity_sop_response( + &mut self, + port: LocalPortId, + ) -> impl Future>; + + /// Get the latest response from the Discover Identity command targeting SOP'. + fn get_discover_identity_sop_prime_response( + &mut self, + port: LocalPortId, + ) -> impl Future>; +} diff --git a/type-c-interface/src/controller/hard_reset.rs b/type-c-interface/src/controller/hard_reset.rs new file mode 100644 index 00000000..cdc6709e --- /dev/null +++ b/type-c-interface/src/controller/hard_reset.rs @@ -0,0 +1,9 @@ +use embedded_usb_pd::{LocalPortId, PdError}; + +use crate::controller::pd::Pd; + +/// Functionality related to executing a Hard Reset on a port. +pub trait HardReset: Pd { + /// Execute a Hard Reset on the given port. + fn hard_reset(&mut self, port: LocalPortId) -> impl Future>; +} diff --git a/type-c-interface/src/controller/mod.rs b/type-c-interface/src/controller/mod.rs index c788c505..8c38350c 100644 --- a/type-c-interface/src/controller/mod.rs +++ b/type-c-interface/src/controller/mod.rs @@ -3,7 +3,9 @@ use embedded_services::named::Named; use embedded_usb_pd::PdError; +pub mod discover_identity; pub mod electrical_disconnect; +pub mod hard_reset; pub mod max_sink_voltage; pub mod pd; pub mod power; diff --git a/type-c-interface/src/port/discover_identity.rs b/type-c-interface/src/port/discover_identity.rs new file mode 100644 index 00000000..2f140236 --- /dev/null +++ b/type-c-interface/src/port/discover_identity.rs @@ -0,0 +1,15 @@ +use embedded_usb_pd::PdError; +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; + +use crate::port::pd::Pd; + +/// Functionality related to getting this port's Discover Identity responses. +pub trait DiscoverIdentity: Pd { + /// Get the latest response from the Discover Identity command targeting SOP. + fn get_discover_identity_sop_response(&mut self) -> impl Future>; + + /// Get the latest response from the Discover Identity command targeting SOP'. + fn get_discover_identity_sop_prime_response( + &mut self, + ) -> impl Future>; +} diff --git a/type-c-interface/src/port/hard_reset.rs b/type-c-interface/src/port/hard_reset.rs new file mode 100644 index 00000000..657c414a --- /dev/null +++ b/type-c-interface/src/port/hard_reset.rs @@ -0,0 +1,9 @@ +use embedded_usb_pd::PdError; + +use crate::port::pd::Pd; + +/// Functionality related to executing a Hard Reset on this port. +pub trait HardReset: Pd { + /// Execute a Hard Reset on this port. + fn hard_reset(&mut self) -> impl Future>; +} diff --git a/type-c-interface/src/port/mod.rs b/type-c-interface/src/port/mod.rs index 652fd416..99af9c2c 100644 --- a/type-c-interface/src/port/mod.rs +++ b/type-c-interface/src/port/mod.rs @@ -1,6 +1,8 @@ //! Type-C port related code +pub mod discover_identity; pub mod electrical_disconnect; pub mod event; +pub mod hard_reset; pub mod max_sink_voltage; pub mod pd; pub mod power; diff --git a/type-c-service/src/controller/discover_identity.rs b/type-c-service/src/controller/discover_identity.rs new file mode 100644 index 00000000..6d7887bb --- /dev/null +++ b/type-c-service/src/controller/discover_identity.rs @@ -0,0 +1,35 @@ +//! Discover Identity port trait implementation +use embedded_services::{event::Sender, sync::Lockable}; +use embedded_usb_pd::PdError; +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; +use type_c_interface::controller::discover_identity::DiscoverIdentity; + +use super::*; +use crate::controller::state::SharedState; + +impl< + 'device, + C: Lockable, + Shared: Lockable, + TypeCSender: Sender, + PowerSender: Sender, + LoopbackSender: Sender, +> type_c_interface::port::discover_identity::DiscoverIdentity + for Port<'device, C, Shared, TypeCSender, PowerSender, LoopbackSender> +{ + async fn get_discover_identity_sop_response(&mut self) -> Result { + self.controller + .lock() + .await + .get_discover_identity_sop_response(self.port) + .await + } + + async fn get_discover_identity_sop_prime_response(&mut self) -> Result { + self.controller + .lock() + .await + .get_discover_identity_sop_prime_response(self.port) + .await + } +} diff --git a/type-c-service/src/controller/hard_reset.rs b/type-c-service/src/controller/hard_reset.rs new file mode 100644 index 00000000..7c8ef039 --- /dev/null +++ b/type-c-service/src/controller/hard_reset.rs @@ -0,0 +1,21 @@ +//! Hard Reset port trait implementation +use embedded_services::{event::Sender, sync::Lockable}; +use embedded_usb_pd::PdError; +use type_c_interface::controller::hard_reset::HardReset; + +use super::*; +use crate::controller::state::SharedState; + +impl< + 'device, + C: Lockable, + Shared: Lockable, + TypeCSender: Sender, + PowerSender: Sender, + LoopbackSender: Sender, +> type_c_interface::port::hard_reset::HardReset for Port<'device, C, Shared, TypeCSender, PowerSender, LoopbackSender> +{ + async fn hard_reset(&mut self) -> Result<(), PdError> { + self.controller.lock().await.hard_reset(self.port).await + } +} diff --git a/type-c-service/src/controller/mod.rs b/type-c-service/src/controller/mod.rs index 895e45a7..eb7bfb7d 100644 --- a/type-c-service/src/controller/mod.rs +++ b/type-c-service/src/controller/mod.rs @@ -12,9 +12,11 @@ use crate::controller::event::{Event, Loopback}; use crate::controller::state::SharedState; pub mod config; +pub mod discover_identity; pub mod electrical_disconnect; pub mod event; pub mod event_receiver; +pub mod hard_reset; pub mod macros; pub mod max_sink_voltage; mod pd; diff --git a/type-c-service/src/driver/tps6699x.rs b/type-c-service/src/driver/tps6699x.rs index 6afa4f4e..8fccdfd1 100644 --- a/type-c-service/src/driver/tps6699x.rs +++ b/type-c-service/src/driver/tps6699x.rs @@ -892,6 +892,7 @@ impl type_c_interface::controller::max_sink_voltage::MaxSin impl type_c_interface::controller::svid::SvidDiscovery for Tps6699x<'_, M, B> { async fn get_discovered_svids(&mut self, port: LocalPortId) -> Result { + self.guard_no_fw_update_active()?; let svids = self .tps6699x .get_discovered_svids(port) @@ -913,6 +914,59 @@ impl type_c_interface::controller::svid::SvidDiscovery for } } +impl type_c_interface::controller::hard_reset::HardReset for Tps6699x<'_, M, B> { + async fn hard_reset(&mut self, port: LocalPortId) -> Result<(), PdError> { + self.guard_no_fw_update_active()?; + match self.tps6699x.execute_hrst(port).await.map_err(|e| self.log_error(e))? { + ReturnValue::Success => Ok(()), + r => { + debug!("Error executing hard reset on port {}: {:#?}", port.0, r); + Err(PdError::InvalidResponse) + } + } + } +} + +impl type_c_interface::controller::discover_identity::DiscoverIdentity for Tps6699x<'_, M, B> { + async fn get_discover_identity_sop_response( + &mut self, + port: LocalPortId, + ) -> Result { + self.guard_no_fw_update_active()?; + let data = self + .tps6699x + .get_received_sop_identity_data(port) + .await + .map_err(|e| self.log_error(e))?; + match data.try_into() { + Ok(vdos) => Ok(vdos), + Err(e) => { + debug!("Error deserializing Received SOP Identity Data: {:?}", e); + Err(PdError::Serialize) + } + } + } + + async fn get_discover_identity_sop_prime_response( + &mut self, + port: LocalPortId, + ) -> Result { + self.guard_no_fw_update_active()?; + let data = self + .tps6699x + .get_received_sop_prime_identity_data(port) + .await + .map_err(|e| self.log_error(e))?; + match data.try_into() { + Ok(vdos) => Ok(vdos), + Err(e) => { + debug!("Error deserializing Received SOP Prime Identity Data: {:?}", e); + Err(PdError::Serialize) + } + } + } +} + impl<'a, M: RawMutex, BUS: I2c> AsRef> for Tps6699x<'a, M, BUS> { fn as_ref(&self) -> &tps6699x_drv::Tps6699x<'a, M, BUS> { &self.tps6699x From ba9dcfa7ad75df20595b52cec40a89ecc027b04a Mon Sep 17 00:00:00 2001 From: matteotullo Date: Mon, 18 May 2026 15:00:31 -0700 Subject: [PATCH 3/5] Fix doc and example errors --- examples/std/Cargo.lock | 8 ++++---- examples/std/src/lib/type_c/mock_controller.rs | 2 ++ type-c-interface/src/control/svid.rs | 4 ++-- type-c-service/src/controller/svid.rs | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/std/Cargo.lock b/examples/std/Cargo.lock index fa1f9db3..9d833a99 100644 --- a/examples/std/Cargo.lock +++ b/examples/std/Cargo.lock @@ -382,9 +382,9 @@ dependencies = [ [[package]] name = "device-driver" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aa3d97b2acf349b9d52c75470e2ccfc7224c49597ec12c2fb0e28826e910495" +checksum = "c2e4547bd66511372d2a38ac3c1b2892c7ebf83cf0d5411c3406e496c85a1d96" dependencies = [ "embedded-io 0.6.1", "embedded-io-async 0.6.1", @@ -641,7 +641,7 @@ dependencies = [ [[package]] name = "embedded-usb-pd" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/embedded-usb-pd#1a8e79d3a2ac0d2837a34b045087cf0863146f7d" +source = "git+https://github.com/OpenDevicePartnership/embedded-usb-pd#0061a1e94a25c8db33ac1e8a0bb5a6b638fe2cd7" dependencies = [ "aquamarine", "bincode", @@ -1388,7 +1388,7 @@ dependencies = [ [[package]] name = "tps6699x" version = "0.1.0" -source = "git+https://github.com/OpenDevicePartnership/tps6699x?branch=v0.2.0#c908a50747e8fcce831d4e53026072b5b6916a7b" +source = "git+https://github.com/OpenDevicePartnership/tps6699x?branch=v0.2.0#abe5568183bfe5fb2ea81806dded6cb60f3f9b58" dependencies = [ "bincode", "bitfield 0.19.4", diff --git a/examples/std/src/lib/type_c/mock_controller.rs b/examples/std/src/lib/type_c/mock_controller.rs index c54458cc..0322301a 100644 --- a/examples/std/src/lib/type_c/mock_controller.rs +++ b/examples/std/src/lib/type_c/mock_controller.rs @@ -4,6 +4,7 @@ use embassy_sync::{channel, mutex::Mutex, signal::Signal}; use embedded_services::GlobalRawMutex; use embedded_services::named::Named; use embedded_usb_pd::ado::Ado; +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; use embedded_usb_pd::{LocalPortId, PdError}; use embedded_usb_pd::{PowerRole, type_c::Current}; use embedded_usb_pd::{type_c::ConnectionState, ucsi::lpm}; @@ -14,6 +15,7 @@ use type_c_interface::control::dp::{DpConfig, DpPinConfig, DpStatus}; use type_c_interface::control::pd::{PdStateMachineConfig, PortStatus}; use type_c_interface::control::power::SystemPowerState; use type_c_interface::control::retimer::RetimerFwUpdateState; +use type_c_interface::control::svid::DiscoveredSvids; use type_c_interface::control::tbt::TbtConfig; use type_c_interface::control::type_c::TypeCStateMachineState; use type_c_interface::control::usb::UsbControlConfig; diff --git a/type-c-interface/src/control/svid.rs b/type-c-interface/src/control/svid.rs index fa40ed53..699c8742 100644 --- a/type-c-interface/src/control/svid.rs +++ b/type-c-interface/src/control/svid.rs @@ -1,7 +1,7 @@ use embedded_usb_pd::vdm::structured::Svid; use heapless::Vec; -/// Response from the `Discover SVIDs REQ` message and the [`PortCommandData::GetDiscoveredSvids`] command. +/// Response from the `Discover SVIDs REQ` message and the PortCommandData::GetDiscoveredSvids command. // Could be changed to hold the heapless::Vec directly if they were Copy or if PortResponseData was not Copy #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "defmt", derive(defmt::Format))] @@ -14,7 +14,7 @@ pub struct DiscoveredSvids { } impl DiscoveredSvids { - /// The number of SVIDs that can be reported in a single [`PortResponseData::DiscoveredSvids`] response. + /// The number of SVIDs that can be reported in a single DiscoveredSvids response. const NUM_SVIDS: usize = 8; /// Create a new response object from `sop` and `sop_prime`. diff --git a/type-c-service/src/controller/svid.rs b/type-c-service/src/controller/svid.rs index d72159b0..4a4c8bea 100644 --- a/type-c-service/src/controller/svid.rs +++ b/type-c-service/src/controller/svid.rs @@ -1,4 +1,4 @@ -//! Max sink voltage port trait implementation +//! SvidDiscovery port trait implementation use embedded_services::{event::Sender, sync::Lockable}; use embedded_usb_pd::PdError; use type_c_interface::{control::svid::DiscoveredSvids, controller::svid::SvidDiscovery}; From b8a54d779bc91425ff03415cea70800cc79f834b Mon Sep 17 00:00:00 2001 From: matteotullo Date: Mon, 18 May 2026 15:51:56 -0700 Subject: [PATCH 4/5] consolidate hard reset, SVID discovery, and discover identity traits into main PD trait --- .../std/src/lib/type_c/mock_controller.rs | 24 ++- .../src/controller/discover_identity.rs | 19 --- type-c-interface/src/controller/hard_reset.rs | 9 -- type-c-interface/src/controller/mod.rs | 3 - type-c-interface/src/controller/pd.rs | 19 +++ type-c-interface/src/controller/svid.rs | 9 -- .../src/port/discover_identity.rs | 15 -- type-c-interface/src/port/hard_reset.rs | 9 -- type-c-interface/src/port/mod.rs | 3 - type-c-interface/src/port/pd.rs | 15 ++ type-c-interface/src/port/svid.rs | 9 -- .../src/controller/discover_identity.rs | 35 ----- type-c-service/src/controller/hard_reset.rs | 21 --- type-c-service/src/controller/mod.rs | 3 - type-c-service/src/controller/pd.rs | 26 ++++ type-c-service/src/controller/svid.rs | 21 --- type-c-service/src/driver/tps6699x.rs | 147 +++++++++--------- 17 files changed, 139 insertions(+), 248 deletions(-) delete mode 100644 type-c-interface/src/controller/discover_identity.rs delete mode 100644 type-c-interface/src/controller/hard_reset.rs delete mode 100644 type-c-interface/src/controller/svid.rs delete mode 100644 type-c-interface/src/port/discover_identity.rs delete mode 100644 type-c-interface/src/port/hard_reset.rs delete mode 100644 type-c-interface/src/port/svid.rs delete mode 100644 type-c-service/src/controller/discover_identity.rs delete mode 100644 type-c-service/src/controller/hard_reset.rs delete mode 100644 type-c-service/src/controller/svid.rs diff --git a/examples/std/src/lib/type_c/mock_controller.rs b/examples/std/src/lib/type_c/mock_controller.rs index 0322301a..10454d90 100644 --- a/examples/std/src/lib/type_c/mock_controller.rs +++ b/examples/std/src/lib/type_c/mock_controller.rs @@ -230,30 +230,17 @@ impl type_c_interface::controller::pd::Pd for Controller<'_> { debug!("Set Thunderbolt config for port {port:?}: {config:?}"); Ok(()) } -} -impl type_c_interface::controller::max_sink_voltage::MaxSinkVoltage for Controller<'_> { - async fn set_max_sink_voltage(&mut self, port: LocalPortId, voltage_mv: Option) -> Result<(), PdError> { - debug!("Set max sink voltage for port {}: {:?}", port.0, voltage_mv); + async fn hard_reset(&mut self, port: LocalPortId) -> Result<(), PdError> { + debug!("Hard reset for port {port:?}"); Ok(()) } -} -impl type_c_interface::controller::svid::SvidDiscovery for Controller<'_> { async fn get_discovered_svids(&mut self, port: LocalPortId) -> Result { debug!("Get discovered SVIDs for port {port:?}"); Ok(DiscoveredSvids::default()) } -} -impl type_c_interface::controller::hard_reset::HardReset for Controller<'_> { - async fn hard_reset(&mut self, port: LocalPortId) -> Result<(), PdError> { - debug!("Hard reset for port {port:?}"); - Ok(()) - } -} - -impl type_c_interface::controller::discover_identity::DiscoverIdentity for Controller<'_> { async fn get_discover_identity_sop_response(&mut self, port: LocalPortId) -> Result { debug!("Get Discover Identity SOP response for port {port:?}"); Err(PdError::Failed) @@ -268,6 +255,13 @@ impl type_c_interface::controller::discover_identity::DiscoverIdentity for Contr } } +impl type_c_interface::controller::max_sink_voltage::MaxSinkVoltage for Controller<'_> { + async fn set_max_sink_voltage(&mut self, port: LocalPortId, voltage_mv: Option) -> Result<(), PdError> { + debug!("Set max sink voltage for port {}: {:?}", port.0, voltage_mv); + Ok(()) + } +} + impl type_c_interface::controller::pd::StateMachine for Controller<'_> { async fn set_pd_state_machine_config( &mut self, diff --git a/type-c-interface/src/controller/discover_identity.rs b/type-c-interface/src/controller/discover_identity.rs deleted file mode 100644 index cc266fe4..00000000 --- a/type-c-interface/src/controller/discover_identity.rs +++ /dev/null @@ -1,19 +0,0 @@ -use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; -use embedded_usb_pd::{LocalPortId, PdError}; - -use crate::controller::pd::Pd; - -/// Functionality related to getting a port's Discover Identity responses. -pub trait DiscoverIdentity: Pd { - /// Get the latest response from the Discover Identity command targeting SOP. - fn get_discover_identity_sop_response( - &mut self, - port: LocalPortId, - ) -> impl Future>; - - /// Get the latest response from the Discover Identity command targeting SOP'. - fn get_discover_identity_sop_prime_response( - &mut self, - port: LocalPortId, - ) -> impl Future>; -} diff --git a/type-c-interface/src/controller/hard_reset.rs b/type-c-interface/src/controller/hard_reset.rs deleted file mode 100644 index cdc6709e..00000000 --- a/type-c-interface/src/controller/hard_reset.rs +++ /dev/null @@ -1,9 +0,0 @@ -use embedded_usb_pd::{LocalPortId, PdError}; - -use crate::controller::pd::Pd; - -/// Functionality related to executing a Hard Reset on a port. -pub trait HardReset: Pd { - /// Execute a Hard Reset on the given port. - fn hard_reset(&mut self, port: LocalPortId) -> impl Future>; -} diff --git a/type-c-interface/src/controller/mod.rs b/type-c-interface/src/controller/mod.rs index 8c38350c..9268ba28 100644 --- a/type-c-interface/src/controller/mod.rs +++ b/type-c-interface/src/controller/mod.rs @@ -3,14 +3,11 @@ use embedded_services::named::Named; use embedded_usb_pd::PdError; -pub mod discover_identity; pub mod electrical_disconnect; -pub mod hard_reset; pub mod max_sink_voltage; pub mod pd; pub mod power; pub mod retimer; -pub mod svid; pub mod type_c; /// Controller ID diff --git a/type-c-interface/src/controller/pd.rs b/type-c-interface/src/controller/pd.rs index 4e20afd9..287fef71 100644 --- a/type-c-interface/src/controller/pd.rs +++ b/type-c-interface/src/controller/pd.rs @@ -1,9 +1,11 @@ use embedded_services::named::Named; +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; use embedded_usb_pd::{LocalPortId, PdError, ado::Ado}; use crate::control::{ dp::{DpConfig, DpStatus}, pd::{PdStateMachineConfig, PortStatus}, + svid::DiscoveredSvids, tbt::TbtConfig, usb::UsbControlConfig, vdm::{AttnVdm, OtherVdm, SendVdm}, @@ -38,6 +40,8 @@ pub trait Pd: Named { fn send_vdm(&mut self, port: LocalPortId, tx_vdm: SendVdm) -> impl Future>; /// Execute PD Data Reset for the given port fn execute_drst(&mut self, port: LocalPortId) -> impl Future>; + /// Execute a Hard Reset on the given port. + fn hard_reset(&mut self, port: LocalPortId) -> impl Future>; /// Get DisplayPort status for the given port fn get_dp_status(&mut self, port: LocalPortId) -> impl Future>; @@ -53,6 +57,21 @@ pub trait Pd: Named { port: LocalPortId, config: UsbControlConfig, ) -> impl Future>; + + /// Get the given port's discovered SVIDs + fn get_discovered_svids(&mut self, port: LocalPortId) -> impl Future>; + + /// Get the latest response from the Discover Identity command targeting SOP. + fn get_discover_identity_sop_response( + &mut self, + port: LocalPortId, + ) -> impl Future>; + + /// Get the latest response from the Discover Identity command targeting SOP'. + fn get_discover_identity_sop_prime_response( + &mut self, + port: LocalPortId, + ) -> impl Future>; } /// PD state machine related controller functionality diff --git a/type-c-interface/src/controller/svid.rs b/type-c-interface/src/controller/svid.rs deleted file mode 100644 index 2b5ada5e..00000000 --- a/type-c-interface/src/controller/svid.rs +++ /dev/null @@ -1,9 +0,0 @@ -use embedded_usb_pd::{LocalPortId, PdError}; - -use crate::{control::svid::DiscoveredSvids, controller::pd::Pd}; - -/// Functionality related to getting a port's discovered SVIDs. -pub trait SvidDiscovery: Pd { - /// Get a port's discovered SVIDs - fn get_discovered_svids(&mut self, port: LocalPortId) -> impl Future>; -} diff --git a/type-c-interface/src/port/discover_identity.rs b/type-c-interface/src/port/discover_identity.rs deleted file mode 100644 index 2f140236..00000000 --- a/type-c-interface/src/port/discover_identity.rs +++ /dev/null @@ -1,15 +0,0 @@ -use embedded_usb_pd::PdError; -use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; - -use crate::port::pd::Pd; - -/// Functionality related to getting this port's Discover Identity responses. -pub trait DiscoverIdentity: Pd { - /// Get the latest response from the Discover Identity command targeting SOP. - fn get_discover_identity_sop_response(&mut self) -> impl Future>; - - /// Get the latest response from the Discover Identity command targeting SOP'. - fn get_discover_identity_sop_prime_response( - &mut self, - ) -> impl Future>; -} diff --git a/type-c-interface/src/port/hard_reset.rs b/type-c-interface/src/port/hard_reset.rs deleted file mode 100644 index 657c414a..00000000 --- a/type-c-interface/src/port/hard_reset.rs +++ /dev/null @@ -1,9 +0,0 @@ -use embedded_usb_pd::PdError; - -use crate::port::pd::Pd; - -/// Functionality related to executing a Hard Reset on this port. -pub trait HardReset: Pd { - /// Execute a Hard Reset on this port. - fn hard_reset(&mut self) -> impl Future>; -} diff --git a/type-c-interface/src/port/mod.rs b/type-c-interface/src/port/mod.rs index 99af9c2c..7920f6db 100644 --- a/type-c-interface/src/port/mod.rs +++ b/type-c-interface/src/port/mod.rs @@ -1,11 +1,8 @@ //! Type-C port related code -pub mod discover_identity; pub mod electrical_disconnect; pub mod event; -pub mod hard_reset; pub mod max_sink_voltage; pub mod pd; pub mod power; pub mod retimer; -pub mod svid; pub mod type_c; diff --git a/type-c-interface/src/port/pd.rs b/type-c-interface/src/port/pd.rs index 547f948b..3cf613a0 100644 --- a/type-c-interface/src/port/pd.rs +++ b/type-c-interface/src/port/pd.rs @@ -1,9 +1,11 @@ use embedded_services::named::Named; +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; use embedded_usb_pd::{PdError, ado::Ado}; use crate::control::{ dp::{DpConfig, DpStatus}, pd::{PdStateMachineConfig, PortStatus}, + svid::DiscoveredSvids, tbt::TbtConfig, usb::UsbControlConfig, vdm::{AttnVdm, OtherVdm, SendVdm}, @@ -34,6 +36,8 @@ pub trait Pd: Named { fn send_vdm(&mut self, tx_vdm: SendVdm) -> impl Future>; /// Execute PD Data Reset for this port fn execute_drst(&mut self) -> impl Future>; + /// Execute a Hard Reset on this port. + fn hard_reset(&mut self) -> impl Future>; /// Get DisplayPort status for this port fn get_dp_status(&mut self) -> impl Future>; @@ -45,6 +49,17 @@ pub trait Pd: Named { /// Set USB control configuration for this port fn set_usb_control(&mut self, config: UsbControlConfig) -> impl Future>; + + /// Get this port's discovered SVIDs + fn get_discovered_svids(&mut self) -> impl Future>; + + /// Get the latest response from the Discover Identity command targeting SOP. + fn get_discover_identity_sop_response(&mut self) -> impl Future>; + + /// Get the latest response from the Discover Identity command targeting SOP'. + fn get_discover_identity_sop_prime_response( + &mut self, + ) -> impl Future>; } /// PD state machine related controller functionality diff --git a/type-c-interface/src/port/svid.rs b/type-c-interface/src/port/svid.rs deleted file mode 100644 index 9ad7f696..00000000 --- a/type-c-interface/src/port/svid.rs +++ /dev/null @@ -1,9 +0,0 @@ -use embedded_usb_pd::PdError; - -use crate::{control::svid::DiscoveredSvids, port::pd::Pd}; - -/// Functionality related to getting this port's discovered SVIDs. -pub trait SvidDiscovery: Pd { - /// Get this port's discovered SVIDs - fn get_discovered_svids(&mut self) -> impl Future>; -} diff --git a/type-c-service/src/controller/discover_identity.rs b/type-c-service/src/controller/discover_identity.rs deleted file mode 100644 index 6d7887bb..00000000 --- a/type-c-service/src/controller/discover_identity.rs +++ /dev/null @@ -1,35 +0,0 @@ -//! Discover Identity port trait implementation -use embedded_services::{event::Sender, sync::Lockable}; -use embedded_usb_pd::PdError; -use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; -use type_c_interface::controller::discover_identity::DiscoverIdentity; - -use super::*; -use crate::controller::state::SharedState; - -impl< - 'device, - C: Lockable, - Shared: Lockable, - TypeCSender: Sender, - PowerSender: Sender, - LoopbackSender: Sender, -> type_c_interface::port::discover_identity::DiscoverIdentity - for Port<'device, C, Shared, TypeCSender, PowerSender, LoopbackSender> -{ - async fn get_discover_identity_sop_response(&mut self) -> Result { - self.controller - .lock() - .await - .get_discover_identity_sop_response(self.port) - .await - } - - async fn get_discover_identity_sop_prime_response(&mut self) -> Result { - self.controller - .lock() - .await - .get_discover_identity_sop_prime_response(self.port) - .await - } -} diff --git a/type-c-service/src/controller/hard_reset.rs b/type-c-service/src/controller/hard_reset.rs deleted file mode 100644 index 7c8ef039..00000000 --- a/type-c-service/src/controller/hard_reset.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! Hard Reset port trait implementation -use embedded_services::{event::Sender, sync::Lockable}; -use embedded_usb_pd::PdError; -use type_c_interface::controller::hard_reset::HardReset; - -use super::*; -use crate::controller::state::SharedState; - -impl< - 'device, - C: Lockable, - Shared: Lockable, - TypeCSender: Sender, - PowerSender: Sender, - LoopbackSender: Sender, -> type_c_interface::port::hard_reset::HardReset for Port<'device, C, Shared, TypeCSender, PowerSender, LoopbackSender> -{ - async fn hard_reset(&mut self) -> Result<(), PdError> { - self.controller.lock().await.hard_reset(self.port).await - } -} diff --git a/type-c-service/src/controller/mod.rs b/type-c-service/src/controller/mod.rs index eb7bfb7d..e81cff9b 100644 --- a/type-c-service/src/controller/mod.rs +++ b/type-c-service/src/controller/mod.rs @@ -12,18 +12,15 @@ use crate::controller::event::{Event, Loopback}; use crate::controller::state::SharedState; pub mod config; -pub mod discover_identity; pub mod electrical_disconnect; pub mod event; pub mod event_receiver; -pub mod hard_reset; pub mod macros; pub mod max_sink_voltage; mod pd; mod power; pub mod retimer; pub mod state; -pub mod svid; pub mod type_c; pub mod ucsi; diff --git a/type-c-service/src/controller/pd.rs b/type-c-service/src/controller/pd.rs index 2091c924..f3b862f5 100644 --- a/type-c-service/src/controller/pd.rs +++ b/type-c-service/src/controller/pd.rs @@ -2,9 +2,11 @@ use embedded_services::{event::Sender, sync::Lockable}; use embedded_usb_pd::PdError; use embedded_usb_pd::ado::Ado; +use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime}; use type_c_interface::control::{ dp::{DpConfig, DpStatus}, pd::{PdStateMachineConfig, PortStatus}, + svid::DiscoveredSvids, tbt::TbtConfig, usb::UsbControlConfig, vdm::{AttnVdm, OtherVdm, SendVdm}, @@ -130,6 +132,30 @@ impl< async fn set_usb_control(&mut self, config: UsbControlConfig) -> Result<(), PdError> { self.controller.lock().await.set_usb_control(self.port, config).await } + + async fn hard_reset(&mut self) -> Result<(), PdError> { + self.controller.lock().await.hard_reset(self.port).await + } + + async fn get_discovered_svids(&mut self) -> Result { + self.controller.lock().await.get_discovered_svids(self.port).await + } + + async fn get_discover_identity_sop_response(&mut self) -> Result { + self.controller + .lock() + .await + .get_discover_identity_sop_response(self.port) + .await + } + + async fn get_discover_identity_sop_prime_response(&mut self) -> Result { + self.controller + .lock() + .await + .get_discover_identity_sop_prime_response(self.port) + .await + } } impl< diff --git a/type-c-service/src/controller/svid.rs b/type-c-service/src/controller/svid.rs deleted file mode 100644 index 4a4c8bea..00000000 --- a/type-c-service/src/controller/svid.rs +++ /dev/null @@ -1,21 +0,0 @@ -//! SvidDiscovery port trait implementation -use embedded_services::{event::Sender, sync::Lockable}; -use embedded_usb_pd::PdError; -use type_c_interface::{control::svid::DiscoveredSvids, controller::svid::SvidDiscovery}; - -use super::*; -use crate::controller::state::SharedState; - -impl< - 'device, - C: Lockable, - Shared: Lockable, - TypeCSender: Sender, - PowerSender: Sender, - LoopbackSender: Sender, -> type_c_interface::port::svid::SvidDiscovery for Port<'device, C, Shared, TypeCSender, PowerSender, LoopbackSender> -{ - async fn get_discovered_svids(&mut self) -> Result { - self.controller.lock().await.get_discovered_svids(self.port).await - } -} diff --git a/type-c-service/src/driver/tps6699x.rs b/type-c-service/src/driver/tps6699x.rs index 8fccdfd1..943653bd 100644 --- a/type-c-service/src/driver/tps6699x.rs +++ b/type-c-service/src/driver/tps6699x.rs @@ -721,6 +721,76 @@ impl Pd for Tps6699x<'_, M, B> { { self.tps6699x.lock_inner().await.set_tbt_config(port, config_reg).await }.map_err(|e| self.log_error(e)) } + + async fn hard_reset(&mut self, port: LocalPortId) -> Result<(), PdError> { + self.guard_no_fw_update_active()?; + match self.tps6699x.execute_hrst(port).await.map_err(|e| self.log_error(e))? { + ReturnValue::Success => Ok(()), + r => { + debug!("Error executing hard reset on port {}: {:#?}", port.0, r); + Err(PdError::InvalidResponse) + } + } + } + + async fn get_discovered_svids(&mut self, port: LocalPortId) -> Result { + self.guard_no_fw_update_active()?; + let svids = self + .tps6699x + .get_discovered_svids(port) + .await + .map_err(|e| self.log_error(e))?; + debug!("{:?} discovered SVIDs: {:?}", port, svids); + let mut sop = Vec::new(); + for svid in svids.svid_sop().take(sop.capacity()) { + let _ = sop.push(svid); + } + + let mut sop_prime = Vec::new(); + for svid in svids.svid_sop_prime().take(sop_prime.capacity()) { + let _ = sop_prime.push(svid); + } + + Ok(DiscoveredSvids::new(sop, sop_prime)) + } + + async fn get_discover_identity_sop_response( + &mut self, + port: LocalPortId, + ) -> Result { + self.guard_no_fw_update_active()?; + let data = self + .tps6699x + .get_received_sop_identity_data(port) + .await + .map_err(|e| self.log_error(e))?; + match data.try_into() { + Ok(vdos) => Ok(vdos), + Err(e) => { + debug!("Error deserializing Received SOP Identity Data: {:?}", e); + Err(PdError::Serialize) + } + } + } + + async fn get_discover_identity_sop_prime_response( + &mut self, + port: LocalPortId, + ) -> Result { + self.guard_no_fw_update_active()?; + let data = self + .tps6699x + .get_received_sop_prime_identity_data(port) + .await + .map_err(|e| self.log_error(e))?; + match data.try_into() { + Ok(vdos) => Ok(vdos), + Err(e) => { + debug!("Error deserializing Received SOP Prime Identity Data: {:?}", e); + Err(PdError::Serialize) + } + } + } } impl Retimer for Tps6699x<'_, M, B> { @@ -890,83 +960,6 @@ impl type_c_interface::controller::max_sink_voltage::MaxSin } } -impl type_c_interface::controller::svid::SvidDiscovery for Tps6699x<'_, M, B> { - async fn get_discovered_svids(&mut self, port: LocalPortId) -> Result { - self.guard_no_fw_update_active()?; - let svids = self - .tps6699x - .get_discovered_svids(port) - .await - .map_err(|e| self.log_error(e))?; - debug!("{:?} discovered SVIDs: {:?}", port, svids); - let mut sop = Vec::new(); - for svid in svids.svid_sop().take(sop.capacity()) { - let _ = sop.push(svid); - } - - let mut sop_prime = Vec::new(); - for svid in svids.svid_sop_prime().take(sop_prime.capacity()) { - let _ = sop_prime.push(svid); - } - - let svids = DiscoveredSvids::new(sop, sop_prime); - Ok(svids) - } -} - -impl type_c_interface::controller::hard_reset::HardReset for Tps6699x<'_, M, B> { - async fn hard_reset(&mut self, port: LocalPortId) -> Result<(), PdError> { - self.guard_no_fw_update_active()?; - match self.tps6699x.execute_hrst(port).await.map_err(|e| self.log_error(e))? { - ReturnValue::Success => Ok(()), - r => { - debug!("Error executing hard reset on port {}: {:#?}", port.0, r); - Err(PdError::InvalidResponse) - } - } - } -} - -impl type_c_interface::controller::discover_identity::DiscoverIdentity for Tps6699x<'_, M, B> { - async fn get_discover_identity_sop_response( - &mut self, - port: LocalPortId, - ) -> Result { - self.guard_no_fw_update_active()?; - let data = self - .tps6699x - .get_received_sop_identity_data(port) - .await - .map_err(|e| self.log_error(e))?; - match data.try_into() { - Ok(vdos) => Ok(vdos), - Err(e) => { - debug!("Error deserializing Received SOP Identity Data: {:?}", e); - Err(PdError::Serialize) - } - } - } - - async fn get_discover_identity_sop_prime_response( - &mut self, - port: LocalPortId, - ) -> Result { - self.guard_no_fw_update_active()?; - let data = self - .tps6699x - .get_received_sop_prime_identity_data(port) - .await - .map_err(|e| self.log_error(e))?; - match data.try_into() { - Ok(vdos) => Ok(vdos), - Err(e) => { - debug!("Error deserializing Received SOP Prime Identity Data: {:?}", e); - Err(PdError::Serialize) - } - } - } -} - impl<'a, M: RawMutex, BUS: I2c> AsRef> for Tps6699x<'a, M, BUS> { fn as_ref(&self) -> &tps6699x_drv::Tps6699x<'a, M, BUS> { &self.tps6699x From 5cb30eab2ee6da0e498c03afd0f60451ab33a2b2 Mon Sep 17 00:00:00 2001 From: matteotullo Date: Mon, 18 May 2026 16:44:22 -0700 Subject: [PATCH 5/5] Make NUM_SVIDS public in DiscoveredSvids and change debug to error for hard reset logging --- type-c-interface/src/control/svid.rs | 2 +- type-c-service/src/driver/tps6699x.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/type-c-interface/src/control/svid.rs b/type-c-interface/src/control/svid.rs index 699c8742..259b2f53 100644 --- a/type-c-interface/src/control/svid.rs +++ b/type-c-interface/src/control/svid.rs @@ -15,7 +15,7 @@ pub struct DiscoveredSvids { impl DiscoveredSvids { /// The number of SVIDs that can be reported in a single DiscoveredSvids response. - const NUM_SVIDS: usize = 8; + pub const NUM_SVIDS: usize = 8; /// Create a new response object from `sop` and `sop_prime`. pub fn new(sop: Vec, sop_prime: Vec) -> Self { diff --git a/type-c-service/src/driver/tps6699x.rs b/type-c-service/src/driver/tps6699x.rs index 943653bd..caa01909 100644 --- a/type-c-service/src/driver/tps6699x.rs +++ b/type-c-service/src/driver/tps6699x.rs @@ -727,7 +727,7 @@ impl Pd for Tps6699x<'_, M, B> { match self.tps6699x.execute_hrst(port).await.map_err(|e| self.log_error(e))? { ReturnValue::Success => Ok(()), r => { - debug!("Error executing hard reset on port {}: {:#?}", port.0, r); + error!("Error executing hard reset on port {}: {:#?}", port.0, r); Err(PdError::InvalidResponse) } } @@ -767,7 +767,7 @@ impl Pd for Tps6699x<'_, M, B> { match data.try_into() { Ok(vdos) => Ok(vdos), Err(e) => { - debug!("Error deserializing Received SOP Identity Data: {:?}", e); + error!("Error deserializing Received SOP Identity Data: {:?}", e); Err(PdError::Serialize) } } @@ -786,7 +786,7 @@ impl Pd for Tps6699x<'_, M, B> { match data.try_into() { Ok(vdos) => Ok(vdos), Err(e) => { - debug!("Error deserializing Received SOP Prime Identity Data: {:?}", e); + error!("Error deserializing Received SOP Prime Identity Data: {:?}", e); Err(PdError::Serialize) } }