aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-07-07 01:58:39 +0000
committerGitHub <[email protected]>2023-07-07 01:58:39 +0000
commite196387e695da96b44609079a84ede77ef9ba7af (patch)
tree21739c58a3aedc716d28b485b4c94c3158227426
parentffeb40ff43ea52d0df5d5e6e807ecb87eafdf0c8 (diff)
parentf8d608093f51ab6fe97b32c7a23bf131a10b6f9c (diff)
Merge pull request #1626 from embassy-rs/otg-read-disable
stm32/otg: implement `EndpointError::Disabled` for reads.
-rw-r--r--embassy-stm32/src/usb_otg/usb.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/embassy-stm32/src/usb_otg/usb.rs b/embassy-stm32/src/usb_otg/usb.rs
index 492b77585..d0284746c 100644
--- a/embassy-stm32/src/usb_otg/usb.rs
+++ b/embassy-stm32/src/usb_otg/usb.rs
@@ -1154,14 +1154,22 @@ impl<'d, T: Instance> embassy_usb_driver::EndpointOut for Endpoint<'d, T, Out> {
1154 trace!("read start len={}", buf.len()); 1154 trace!("read start len={}", buf.len());
1155 1155
1156 poll_fn(|cx| { 1156 poll_fn(|cx| {
1157 let r = T::regs();
1157 let index = self.info.addr.index(); 1158 let index = self.info.addr.index();
1158 let state = T::state(); 1159 let state = T::state();
1159 1160
1160 state.ep_out_wakers[index].register(cx.waker()); 1161 state.ep_out_wakers[index].register(cx.waker());
1161 1162
1163 let doepctl = r.doepctl(index).read();
1164 trace!("read ep={:?}: doepctl {:08x}", self.info.addr, doepctl.0,);
1165 if !doepctl.usbaep() {
1166 trace!("read ep={:?} error disabled", self.info.addr);
1167 return Poll::Ready(Err(EndpointError::Disabled));
1168 }
1169
1162 let len = state.ep_out_size[index].load(Ordering::Relaxed); 1170 let len = state.ep_out_size[index].load(Ordering::Relaxed);
1163 if len != EP_OUT_BUFFER_EMPTY { 1171 if len != EP_OUT_BUFFER_EMPTY {
1164 trace!("read done len={}", len); 1172 trace!("read ep={:?} done len={}", self.info.addr, len);
1165 1173
1166 if len as usize > buf.len() { 1174 if len as usize > buf.len() {
1167 return Poll::Ready(Err(EndpointError::BufferOverflow)); 1175 return Poll::Ready(Err(EndpointError::BufferOverflow));
@@ -1214,7 +1222,12 @@ impl<'d, T: Instance> embassy_usb_driver::EndpointIn for Endpoint<'d, T, In> {
1214 1222
1215 let diepctl = r.diepctl(index).read(); 1223 let diepctl = r.diepctl(index).read();
1216 let dtxfsts = r.dtxfsts(index).read(); 1224 let dtxfsts = r.dtxfsts(index).read();
1217 trace!("diepctl {:08x} ftxfsts {:08x}", diepctl.0, dtxfsts.0); 1225 trace!(
1226 "write ep={:?}: diepctl {:08x} ftxfsts {:08x}",
1227 self.info.addr,
1228 diepctl.0,
1229 dtxfsts.0
1230 );
1218 if !diepctl.usbaep() { 1231 if !diepctl.usbaep() {
1219 trace!("write ep={:?} wait for prev: error disabled", self.info.addr); 1232 trace!("write ep={:?} wait for prev: error disabled", self.info.addr);
1220 Poll::Ready(Err(EndpointError::Disabled)) 1233 Poll::Ready(Err(EndpointError::Disabled))