Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ embedded-hal = "1.0"
embedded-hal-async = "1.0"
embedded-services = { path = "./embedded-service" }
embedded-storage-async = "0.4.1"
embedded-usb-pd = { git = "https://github.com/OpenDevicePartnership/embedded-usb-pd", tag = "v0.1.0", default-features = false }
embedded-usb-pd = { git = "https://github.com/OpenDevicePartnership/embedded-usb-pd", tag = "v0.1.1", default-features = false }
fw-update-interface = { path = "./fw-update-interface" }
fw-update-interface-test-mocks = { path = "./fw-update-interface-test-mocks" }
generic-array = "1.4.1"
Expand Down
20 changes: 16 additions & 4 deletions examples/rt685s-evk/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 14 additions & 3 deletions examples/std/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 40 additions & 6 deletions examples/std/src/lib/type_c/mock_controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@ 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::{LocalPortId, PdError, pdo};
use embedded_usb_pd::{PowerRole, type_c::Current};
use embedded_usb_pd::{type_c::ConnectionState, ucsi::lpm};
use log::{debug, info};

use power_policy_interface::capability::PowerCapability;
use type_c_interface::control::dp::{DpConfig, DpPinConfig, DpStatus};
use type_c_interface::control::pd::{PdStateMachineConfig, PortStatus};
use type_c_interface::control::pd::{
PdSinkInfo, PdSourceInfo, PdStateMachineConfig, PortStatus, SinkContract, SourceContract,
};
use type_c_interface::control::power::SystemPowerState;
use type_c_interface::control::retimer::RetimerFwUpdateState;
use type_c_interface::control::svid::DiscoveredSvids;
Expand Down Expand Up @@ -55,13 +57,45 @@ impl ControllerState {
let mut events = PortEventBitfield::none();
match role {
PowerRole::Source => {
status.available_source_contract = Some(capability);
status.unconstrained_power = unconstrained;
let pdo = pdo::source::Pdo::Fixed(pdo::source::FixedData {
voltage_mv: capability.voltage_mv,
current_ma: capability.current_ma,
..Default::default()
});
status.available_source_contract = Some(SourceContract {
capability,
pd: pdo::Rdo::for_pdo(0, pdo).map(|rdo| PdSourceInfo {
rx_fixed_5v_data: Some(pdo::sink::FixedData {
voltage_mv: capability.voltage_mv,
operational_current_ma: capability.current_ma,
unconstrained_power: unconstrained,
..Default::default()
}),
pdo,
rdo,
}),
});
events.status.set_new_power_contract_as_provider(true);
}
PowerRole::Sink => {
status.available_sink_contract = Some(capability);
status.unconstrained_power = unconstrained;
let pdo = pdo::sink::Pdo::Fixed(pdo::sink::FixedData {
voltage_mv: capability.voltage_mv,
operational_current_ma: capability.current_ma,
..Default::default()
});
status.available_sink_contract = Some(SinkContract {
capability,
pd: pdo::Rdo::for_pdo(0, pdo).map(|rdo| PdSinkInfo {
rx_fixed_5v_data: pdo::source::FixedData {
voltage_mv: capability.voltage_mv,
current_ma: capability.current_ma,
unconstrained_power: unconstrained,
..Default::default()
},
pdo,
rdo,
}),
});
events.status.set_new_power_contract_as_consumer(true);
events.status.set_sink_ready(true);
}
Expand Down
47 changes: 41 additions & 6 deletions type-c-interface-mocks/src/port/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ use embedded_services::error;
use embedded_services::event::NonBlockingSender;
use embedded_services::named::Named;
use embedded_usb_pd::vdm::structured::command::discover_identity::{sop, sop_prime};
use embedded_usb_pd::{PdError, PlugOrientation, PowerRole, ado::Ado, type_c::ConnectionState};
use embedded_usb_pd::{PdError, PlugOrientation, PowerRole, ado::Ado, pdo, type_c::ConnectionState};
use power_policy_interface::capability::{
ConsumerFlags, ConsumerPowerCapability, PowerCapability, ProviderFlags, ProviderPowerCapability, PsuType,
};
use power_policy_interface::psu::{Error as PsuError, Psu, State};
use type_c_interface::control::{
dp::{DpConfig, DpStatus},
pd::PortStatus,
pd::{PdSinkInfo, PdSourceInfo, PortStatus, SinkContract, SourceContract},
svid::DiscoveredSvids,
tbt::TbtConfig,
usb::UsbControlConfig,
Expand Down Expand Up @@ -100,7 +100,6 @@ where
) -> Result<(), PsuError> {
let mut status = PortStatus::new();
status.connection_state = Some(ConnectionState::Attached);
status.dual_power = config.dual_power;
status.plug_orientation = config.plug_orientation;
status.power_role = role;
self.psu_state.attach()?;
Expand All @@ -121,7 +120,24 @@ where
PowerRole::Sink => {
status_event.set_new_power_contract_as_consumer(true);
status_event.set_sink_ready(true);
status.available_sink_contract = Some(capability);
let pdo = pdo::sink::Pdo::Fixed(pdo::sink::FixedData {
voltage_mv: capability.voltage_mv,
operational_current_ma: capability.current_ma,
..Default::default()
});
status.available_sink_contract = Some(SinkContract {
capability,
pd: pdo::Rdo::for_pdo(0, pdo).map(|rdo| PdSinkInfo {
rx_fixed_5v_data: pdo::source::FixedData {
dual_role_power: config.dual_power,
voltage_mv: capability.voltage_mv,
current_ma: capability.current_ma,
..Default::default()
},
pdo,
rdo,
}),
});
self.psu_state
.update_consumer_power_capability(Some(ConsumerPowerCapability {
capability,
Expand All @@ -133,7 +149,24 @@ where
}
PowerRole::Source => {
status_event.set_new_power_contract_as_provider(true);
status.available_source_contract = Some(capability);
let pdo = pdo::source::Pdo::Fixed(pdo::source::FixedData {
voltage_mv: capability.voltage_mv,
current_ma: capability.current_ma,
..Default::default()
});
status.available_source_contract = Some(SourceContract {
capability,
pd: pdo::Rdo::for_pdo(0, pdo).map(|rdo| PdSourceInfo {
rx_fixed_5v_data: Some(pdo::sink::FixedData {
dual_role_power: config.dual_power,
voltage_mv: capability.voltage_mv,
operational_current_ma: capability.current_ma,
..Default::default()
}),
pdo,
rdo,
}),
});
self.psu_state
.update_requested_provider_power_capability(Some(ProviderPowerCapability {
capability,
Expand Down Expand Up @@ -240,7 +273,9 @@ where
}

fn reports_unconstrained_power(&self) -> bool {
self.status.available_sink_contract.is_some() && self.status.unconstrained_power
self.status
.available_sink_contract
.is_some_and(|contract| contract.unconstrained_power())
}

async fn get_other_vdm(&mut self) -> Result<OtherVdm, PdError> {
Expand Down
20 changes: 17 additions & 3 deletions type-c-interface-mocks/tests/connect_disconnect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,18 @@ async fn test_plug_sink_broadcasts_events() {
assert!(!data.previous_status.is_connected());
assert!(data.current_status.is_connected());
assert_eq!(data.current_status.connection_state, Some(ConnectionState::Attached));
assert_eq!(data.current_status.available_sink_contract, Some(TEST_CAPABILITY));
assert_eq!(
data.current_status
.available_sink_contract
.map(|contract| contract.capability),
Some(TEST_CAPABILITY)
);
assert_eq!(data.current_status.power_role, PowerRole::Sink);
assert!(data.current_status.dual_power);
assert!(
data.current_status
.available_sink_contract
.is_some_and(|contract| contract.dual_role_power())
);
assert_eq!(data.current_status.plug_orientation, PlugOrientation::CC2);
assert!(type_c_channel.try_receive().is_err());

Expand Down Expand Up @@ -90,7 +99,12 @@ async fn test_plug_source_broadcasts_events() {
};
assert!(data.status_event.plug_inserted_or_removed());
assert!(data.status_event.new_power_contract_as_provider());
assert_eq!(data.current_status.available_source_contract, Some(TEST_CAPABILITY));
assert_eq!(
data.current_status
.available_source_contract
.map(|contract| contract.capability),
Some(TEST_CAPABILITY)
);
assert_eq!(data.current_status.power_role, PowerRole::Source);

// State should be Idle since power policy hasn't directed us to connect yet
Expand Down
Loading
Loading