Merge pull request #3084 from sjoerdsimons/ucpd-missing-packets

Improve stm32 ucpd packet reception
This commit is contained in:
Dario Nieuwenhuis 2024-06-16 19:57:14 +00:00 committed by GitHub
commit 1e268a4d3d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -169,6 +169,9 @@ impl<'d, T: Instance> Ucpd<'d, T> {
// Enable hard reset receive interrupt.
r.imr().modify(|w| w.set_rxhrstdetie(true));
// Enable PD packet reception
r.cr().modify(|w| w.set_phyrxen(true));
// Both parts must be dropped before the peripheral can be disabled.
T::state().drop_not_ready.store(true, Ordering::Relaxed);
@ -319,6 +322,7 @@ pub struct PdPhy<'d, T: Instance> {
impl<'d, T: Instance> Drop for PdPhy<'d, T> {
fn drop(&mut self) {
T::REGS.cr().modify(|w| w.set_phyrxen(false));
// Check if the Type-C part was dropped already.
let drop_not_ready = &T::state().drop_not_ready;
if drop_not_ready.load(Ordering::Relaxed) {
@ -343,17 +347,14 @@ impl<'d, T: Instance> PdPhy<'d, T> {
.read(r.rxdr().as_ptr() as *mut u8, buf, TransferOptions::default())
};
// Clear interrupt flags (possibly set from last receive).
r.icr().write(|w| {
w.set_rxorddetcf(true);
w.set_rxovrcf(true);
w.set_rxmsgendcf(true);
});
r.cr().modify(|w| w.set_phyrxen(true));
let _on_drop = OnDrop::new(|| {
r.cr().modify(|w| w.set_phyrxen(false));
Self::enable_rx_interrupt(false);
// Clear interrupt flags
r.icr().write(|w| {
w.set_rxorddetcf(true);
w.set_rxovrcf(true);
w.set_rxmsgendcf(true);
});
});
poll_fn(|cx| {