Skip to content

Commit accc603

Browse files
committed
Now with RX timestamps
1 parent 886c6ba commit accc603

File tree

3 files changed

+59
-10
lines changed

3 files changed

+59
-10
lines changed

src/dma/rx/h_desc.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ mod consts {
2020
pub const RXDESC_3_BUF1V: u32 = 1 << 24;
2121

2222
// Write-back bits
23+
/// Timestamp Dropped
24+
pub const RXDESC_1_TD: u32 = 1 << 16;
25+
/// Timestamp Avaialble
26+
pub const RXDESC_1_TSA: u32 = 1 << 14;
2327
/// Context Descriptor
2428
pub const RXDESC_3_CTXT: u32 = 1 << 30;
2529
/// First Descriptor
@@ -102,7 +106,7 @@ impl RxDescriptor {
102106
}
103107

104108
/// Is owned by the DMA engine?
105-
fn is_owned(&self) -> bool {
109+
pub(super) fn is_owned(&self) -> bool {
106110
(self.inner_raw.read(3) & RXDESC_3_OWN) == RXDESC_3_OWN
107111
}
108112

@@ -122,6 +126,10 @@ impl RxDescriptor {
122126
self.inner_raw.read(3) & RXDESC_3_CTXT == RXDESC_3_CTXT
123127
}
124128

129+
pub(super) fn has_timestamp(&self) -> bool {
130+
(self.inner_raw.read(1) & RXDESC_1_TSA) == RXDESC_1_TSA && self.is_last()
131+
}
132+
125133
pub(super) fn frame_length(&self) -> usize {
126134
if self.is_owned() {
127135
0
@@ -200,10 +208,6 @@ impl RxDescriptor {
200208

201209
self.packet_id = packet_id;
202210

203-
// Cache the PTP timestamps if PTP is enabled.
204-
#[cfg(feature = "ptp")]
205-
self.attach_timestamp();
206-
207211
Ok(())
208212
} else {
209213
self.set_owned(buffer);
@@ -216,11 +220,16 @@ impl RxDescriptor {
216220
impl RxDescriptor {
217221
/// Get PTP timestamps if available
218222
pub(super) fn read_timestamp(&self) -> Option<Timestamp> {
219-
todo!();
223+
if self.is_context() && !self.is_owned() {
224+
let (high, low) = (self.inner_raw.read(1), self.inner_raw.read(0));
225+
Some(Timestamp::from_parts(high, low))
226+
} else {
227+
None
228+
}
220229
}
221230

222-
fn attach_timestamp(&mut self) {
223-
self.cached_timestamp = self.read_timestamp();
231+
pub(super) fn attach_timestamp(&mut self, timestamp: Option<Timestamp>) {
232+
self.cached_timestamp = timestamp;
224233
}
225234

226235
pub(super) fn timestamp(&self) -> Option<&Timestamp> {

src/dma/rx/mod.rs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,17 +199,54 @@ impl<'data> RxRing<'data, Running> {
199199
self.demand_poll(eth_dma);
200200
}
201201

202+
let entry = self.next_entry;
202203
let entries_len = self.ring.len();
203-
let (descriptor, buffer) = self.ring.get(self.next_entry);
204+
let (descriptor, buffer) = self.ring.get(entry);
204205

205206
let mut res = descriptor.take_received(packet_id, buffer);
206207

207208
if res.as_mut().err() != Some(&mut RxError::WouldBlock) {
208209
self.next_entry = (self.next_entry + 1) % entries_len;
209210
}
210211

212+
#[cfg(all(feature = "ptp", feature = "stm32h7xx-hal"))]
213+
let (timestamp, descriptor, buffer) = {
214+
if res.as_mut().err() != Some(&mut RxError::WouldBlock) {
215+
let desc_has_timestamp = descriptor.has_timestamp();
216+
217+
drop(descriptor);
218+
drop(buffer);
219+
220+
// On H7's, the timestamp is stored in the next Context
221+
// descriptor.
222+
let timestamp = if desc_has_timestamp {
223+
let (ctx_descriptor, ctx_des_buffer) = self.ring.get(self.next_entry);
224+
if let Some(timestamp) = ctx_descriptor.read_timestamp() {
225+
ctx_descriptor.set_owned(ctx_des_buffer);
226+
// Advance over this buffer
227+
self.next_entry = (self.next_entry + 1) % entries_len;
228+
Some(timestamp)
229+
} else {
230+
None
231+
}
232+
} else {
233+
None
234+
};
235+
236+
let (descriptor, buffer) = self.ring.get(entry);
237+
238+
descriptor.attach_timestamp(timestamp);
239+
240+
(timestamp, descriptor, buffer)
241+
} else {
242+
let (descriptor, buffer) = self.ring.get(entry);
243+
descriptor.attach_timestamp(None);
244+
(None, descriptor, buffer)
245+
}
246+
};
247+
211248
res.map(move |_| {
212-
#[cfg(feature = "ptp")]
249+
#[cfg(all(feature = "ptp", feature = "f-series"))]
213250
let timestamp = descriptor.read_timestamp();
214251

215252
RxPacket {

src/ptp/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ impl EthernetPTP {
130130
// Enable all timestamps
131131
.tsena()
132132
.set_bit()
133+
// Tell MAC to overwrite non-read timestamps
134+
.txtsstsm()
135+
.set_bit()
133136
});
134137

135138
// Set up the subsecond increment

0 commit comments

Comments
 (0)