mirror of
https://github.com/embassy-rs/embassy.git
synced 2024-11-25 16:23:10 +00:00
[UCPD] Disable dead-battery resistor for all families
Using the code from PR #2683, thank you @ExplodingWaffle Removes the dead-battery as selectable option because its unclear if it can be re-enabled. Also there is no use case for it because the same resistor can be configured with the sink option.
This commit is contained in:
parent
eeb033caf0
commit
30cdc6c9c5
@ -283,9 +283,8 @@ pub fn init(config: Config) -> Peripherals {
|
||||
}
|
||||
|
||||
unsafe {
|
||||
// TODO: refactor into mod ucpd
|
||||
#[cfg(ucpd)]
|
||||
ucpd_init(
|
||||
ucpd::init(
|
||||
cs,
|
||||
#[cfg(peri_ucpd1)]
|
||||
config.enable_ucpd1_dead_battery,
|
||||
@ -334,41 +333,3 @@ pub fn init(config: Config) -> Peripherals {
|
||||
p
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(ucpd)]
|
||||
/// Safety: must only be called when all UCPDs are disabled (e.g. at startup)
|
||||
unsafe fn ucpd_init(
|
||||
_cs: critical_section::CriticalSection,
|
||||
#[cfg(peri_ucpd1)] ucpd1_db_enable: bool,
|
||||
#[cfg(peri_ucpd2)] ucpd2_db_enable: bool,
|
||||
) {
|
||||
#[cfg(stm32g0x1)]
|
||||
{
|
||||
// according to RM0444 (STM32G0x1) section 8.1.1:
|
||||
// when UCPD is disabled setting the strobe will disable dead battery
|
||||
// (which is enabled after reset) but if UCPD is enabled, setting the
|
||||
// strobe will apply the CC pin configuration from the control register
|
||||
// (which is why we need to be careful about when we call this)
|
||||
crate::pac::SYSCFG.cfgr1().modify(|w| {
|
||||
w.set_ucpd1_strobe(ucpd1_db_enable);
|
||||
w.set_ucpd2_strobe(ucpd2_db_enable);
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(any(stm32g4, stm32l5))]
|
||||
{
|
||||
crate::pac::PWR.cr3().modify(|w| {
|
||||
#[cfg(stm32g4)]
|
||||
w.set_ucpd1_dbdis(!ucpd1_db_enable);
|
||||
#[cfg(stm32l5)]
|
||||
w.set_ucpd_dbdis(!ucpd1_db_enable);
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(any(stm32h5, stm32u5))]
|
||||
{
|
||||
crate::pac::PWR.ucpdr().modify(|w| {
|
||||
w.set_ucpd_dbdis(!ucpd1_db_enable);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,42 @@ use crate::pac::ucpd::vals::{Anamode, Ccenable, PscUsbpdclk, Txmode};
|
||||
pub use crate::pac::ucpd::vals::{Phyccsel as CcSel, TypecVstateCc as CcVState};
|
||||
use crate::rcc::RccPeripheral;
|
||||
|
||||
pub(crate) fn init(
|
||||
_cs: critical_section::CriticalSection,
|
||||
#[cfg(peri_ucpd1)] ucpd1_db_enable: bool,
|
||||
#[cfg(peri_ucpd2)] ucpd2_db_enable: bool,
|
||||
) {
|
||||
#[cfg(stm32g0x1)]
|
||||
{
|
||||
// according to RM0444 (STM32G0x1) section 8.1.1:
|
||||
// when UCPD is disabled setting the strobe will disable dead battery
|
||||
// (which is enabled after reset) but if UCPD is enabled, setting the
|
||||
// strobe will apply the CC pin configuration from the control register
|
||||
// (which is why we need to be careful about when we call this)
|
||||
crate::pac::SYSCFG.cfgr1().modify(|w| {
|
||||
w.set_ucpd1_strobe(ucpd1_db_enable);
|
||||
w.set_ucpd2_strobe(ucpd2_db_enable);
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(any(stm32g4, stm32l5))]
|
||||
{
|
||||
crate::pac::PWR.cr3().modify(|w| {
|
||||
#[cfg(stm32g4)]
|
||||
w.set_ucpd1_dbdis(!ucpd1_db_enable);
|
||||
#[cfg(stm32l5)]
|
||||
w.set_ucpd_dbdis(!ucpd1_db_enable);
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(any(stm32h5, stm32u5))]
|
||||
{
|
||||
crate::pac::PWR.ucpdr().modify(|w| {
|
||||
w.set_ucpd_dbdis(!ucpd1_db_enable);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// Pull-up or Pull-down resistor state of both CC lines.
|
||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
||||
@ -35,9 +71,6 @@ pub enum CcPull {
|
||||
/// Analog PHY for CC pin disabled.
|
||||
Disabled,
|
||||
|
||||
/// Rd=5.1k pull-down resistor enabled when the corresponding DBCC pin is high.
|
||||
SinkDeadBattery,
|
||||
|
||||
/// Rd=5.1k pull-down resistor.
|
||||
Sink,
|
||||
|
||||
@ -192,20 +225,21 @@ impl<'d, T: Instance> CcPhy<'d, T> {
|
||||
CcPull::Source3_0A => 3,
|
||||
_ => 0,
|
||||
});
|
||||
w.set_ccenable(if cc_pull != CcPull::SinkDeadBattery {
|
||||
Ccenable::BOTH
|
||||
} else {
|
||||
w.set_ccenable(if cc_pull == CcPull::Disabled {
|
||||
Ccenable::DISABLED
|
||||
} else {
|
||||
Ccenable::BOTH
|
||||
});
|
||||
});
|
||||
|
||||
// Disable dead-battery pull-down resistors which are enabled by default on boot.
|
||||
critical_section::with(|_| {
|
||||
// TODO: other families
|
||||
#[cfg(stm32g4)]
|
||||
crate::pac::PWR
|
||||
.cr3()
|
||||
.modify(|w| w.set_ucpd1_dbdis(cc_pull != CcPull::SinkDeadBattery));
|
||||
critical_section::with(|cs| {
|
||||
init(
|
||||
cs,
|
||||
false,
|
||||
#[cfg(peri_ucpd2)]
|
||||
false,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user