Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixing pounder bootup issues #748

Merged
merged 4 commits into from
Jul 7, 2023

Simplifying changes

3c18a7f
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Merged

Fixing pounder bootup issues #748

Simplifying changes
3c18a7f
Select commit
Loading
Failed to load commit list.
This check has been archived and is scheduled for deletion. Learn more about checks retention
GitHub Actions / clippy succeeded Jul 7, 2023 in 0s

clippy

13 warnings

Details

Results

Message level Amount
Internal compiler error 0
Error 0
Warning 13
Note 0
Help 0

Versions

  • rustc 1.70.0 (90c541806 2023-05-31)
  • cargo 1.70.0 (ec8a8a0ca 2023-04-25)
  • clippy 0.1.70 (90c5418 2023-05-31)

Annotations

Check warning on line 367 in src/net/data_stream.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

manual slice size calculation

warning: manual slice size calculation
   --> src/net/data_stream.rs:367:29
    |
367 | ...                   buf.len() * core::mem::size_of::<MaybeUninit<u8>>(),
    |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: consider using std::mem::size_of_value instead
    = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_slice_size_calculation
    = note: `#[warn(clippy::manual_slice_size_calculation)]` on by default

Check warning on line 12 in src/net/telemetry.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
  --> src/net/telemetry.rs:1:1
   |
1  | / ///! Stabilizer Telemetry Capabilities
2  | | ///!
3  | | ///! # Design
4  | | ///! Telemetry is reported regularly using an MQTT client. All telemetry is reported in SI units
...  |
11 | | ///! required immediately before transmission. This ensures that any slower computation required
12 | | ///! for unit conversion can be off-loaded to lower priority tasks.
   | |___________________________________________________________________^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
   |
1  + //! Stabilizer Telemetry Capabilities
2  + //!
3  + //! # Design
4  + //! Telemetry is reported regularly using an MQTT client. All telemetry is reported in SI units
5  + //! using standard JSON format.
6  + //!
7  + //! In order to report ADC/DAC codes generated during the DSP routines, a telemetry buffer is
8  + //! employed to track the latest codes. Converting these codes to SI units would result in
9  + //! repetitive and unnecessary calculations within the DSP routine, slowing it down and limiting
10 + //! sampling frequency. Instead, the raw codes are stored and the telemetry is generated as
11 + //! required immediately before transmission. This ensures that any slower computation required
12 + //! for unit conversion can be off-loaded to lower priority tasks.
   |

Check warning on line 5 in src/net/network_processor.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
 --> src/net/network_processor.rs:1:1
  |
1 | / ///! Task to process network hardware.
2 | | ///!
3 | | ///! # Design
4 | | ///! The network processir is a small taks to regularly process incoming data over ethernet, handle
5 | | ///! the ethernet PHY state, and reset the network as appropriate.
  | |__________________________________________________________________^
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
  |
1 + //! Task to process network hardware.
2 + //!
3 + //! # Design
4 + //! The network processir is a small taks to regularly process incoming data over ethernet, handle
5 + //! the ethernet PHY state, and reset the network as appropriate.
  |

Check warning on line 7 in src/net/mod.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
 --> src/net/mod.rs:1:1
  |
1 | / ///! Stabilizer network management module
2 | | ///!
3 | | ///! # Design
4 | | ///! The stabilizer network architecture supports numerous layers to permit transmission of
5 | | ///! telemetry (via MQTT), configuration of run-time settings (via MQTT + Miniconf), and live data
6 | | ///! streaming over raw UDP/TCP sockets. This module encompasses the main processing routines
7 | | ///! related to Stabilizer networking operations.
  | |_________________________________________________^
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
  |
1 + //! Stabilizer network management module
2 + //!
3 + //! # Design
4 + //! The stabilizer network architecture supports numerous layers to permit transmission of
5 + //! telemetry (via MQTT), configuration of run-time settings (via MQTT + Miniconf), and live data
6 + //! streaming over raw UDP/TCP sockets. This module encompasses the main processing routines
7 + //! related to Stabilizer networking operations.
  |

Check warning on line 1 in src/hardware/timers.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
 --> src/hardware/timers.rs:1:1
  |
1 | ///! The sampling timer is used for managing ADC sampling and external reference timestamping.
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
  |
1 | //! The sampling timer is used for managing ADC sampling and external reference timestamping.
  |

Check warning on line 3 in src/hardware/setup.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
 --> src/hardware/setup.rs:1:1
  |
1 | / ///! Stabilizer hardware configuration
2 | | ///!
3 | | ///! This file contains all of the hardware-specific configuration of Stabilizer.
  | |_________________________________________________________________________________^
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
  |
1 + //! Stabilizer hardware configuration
2 + //!
3 + //! This file contains all of the hardware-specific configuration of Stabilizer.
  |

Check warning on line 18 in src/hardware/pounder/timestamp.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
  --> src/hardware/pounder/timestamp.rs:1:1
   |
1  | / ///! ADC sample timestamper using external Pounder reference clock.
2  | | ///!
3  | | ///! # Design
4  | | ///!
...  |
17 | | ///! batch size. This results in the input capture triggering identically to when the ADC samples
18 | | ///! the last sample of the batch. That sample is then available for processing by the user.
   | |____________________________________________________________________________________________^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
   |
1  + //! ADC sample timestamper using external Pounder reference clock.
2  + //!
3  + //! # Design
4  + //!
5  + //! The pounder timestamper utilizes the pounder SYNC_CLK output as a fast external reference clock
6  + //! for recording a timestamp for each of the ADC samples.
7  + //!
8  + //! To accomplish this, a timer peripheral is configured to be driven by an external clock input.
9  + //! Due to the limitations of clock frequencies allowed by the timer peripheral, the SYNC_CLK input
10 + //! is divided by 4. This clock then clocks the timer peripheral in a free-running mode with an ARR
11 + //! (max count register value) configured to overflow once per ADC sample batch.
12 + //!
13 + //! Once the timer is configured, an input capture is configured to record the timer count
14 + //! register. The input capture is configured to utilize an internal trigger for the input capture.
15 + //! The internal trigger is selected such that when a sample is generated on ADC0, the input
16 + //! capture is simultaneously triggered. That trigger is prescaled (its rate is divided) by the
17 + //! batch size. This results in the input capture triggering identically to when the ADC samples
18 + //! the last sample of the batch. That sample is then available for processing by the user.
   |

Check warning on line 1 in src/hardware/pounder/hrtimer.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
 --> src/hardware/pounder/hrtimer.rs:1:1
  |
1 | ///! The HRTimer (High Resolution Timer) is used to generate IO_Update pulses to the Pounder DDS.
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
  |
1 | //! The HRTimer (High Resolution Timer) is used to generate IO_Update pulses to the Pounder DDS.
  |

Check warning on line 54 in src/hardware/pounder/dds_output.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
  --> src/hardware/pounder/dds_output.rs:1:1
   |
1  | / ///! The DdsOutput is used as an output stream to the pounder DDS.
2  | | ///!
3  | | ///! # Design
4  | | ///!
...  |
53 | | ///! process can be done once and then register values can be written into a pre-computed serialized
54 | | ///! buffer to avoid the software overhead of much of the serialization process.
   | |________________________________________________________________________________^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
   |
1  + //! The DdsOutput is used as an output stream to the pounder DDS.
2  + //!
3  + //! # Design
4  + //!
5  + //! The DDS stream interface is a means of quickly updating pounder DDS (direct digital synthesis)
6  + //! outputs of the AD9959 DDS chip. The DDS communicates via a quad-SPI interface and a single
7  + //! IO-update output pin.
8  + //!
9  + //! In order to update the DDS interface, the frequency tuning word, amplitude control word, and
10 + //! the phase offset word for a channel can be modified to change the frequency, amplitude, or
11 + //! phase on any of the 4 available output channels. Changes do not propagate to DDS outputs until
12 + //! the IO-update pin is toggled high to activate the new configurations. This allows multiple
13 + //! channels or parameters to be updated and then effects can take place simultaneously.
14 + //!
15 + //! In this implementation, the phase, frequency, or amplitude can be updated for any single
16 + //! collection of outputs simultaneously. This is done by serializing the register writes to the
17 + //! DDS into a single buffer of data and then writing the data over QSPI to the DDS.
18 + //!
19 + //! In order to minimize software overhead, data is written directly into the QSPI output FIFO. In
20 + //! order to accomplish this most efficiently, serialized data is written as 32-bit words to
21 + //! minimize the number of bus cycles necessary to write to the peripheral FIFO. A consequence of
22 + //! this is that additional unneeded register writes may be appended to align a transfer to 32-bit
23 + //! word sizes.
24 + //!
25 + //! In order to pulse the IO-update signal, the high-resolution timer output is used. The timer is
26 + //! configured to assert the IO-update signal after a predefined delay and then de-assert the
27 + //! signal after a predefined assertion duration. This allows for the actual QSPI transfer and
28 + //! IO-update toggle to be completed asynchronously to the rest of software processing - that is,
29 + //! software can schedule the DDS updates and then continue data processing. DDS updates then take
30 + //! place in the future when the IO-update is toggled by hardware.
31 + //!
32 + //!
33 + //! # Limitations
34 + //!
35 + //! The QSPI output FIFO is used as an intermediate buffer for holding pending QSPI writes. Because
36 + //! of this, the implementation only supports up to 16 serialized bytes (the QSPI FIFO is 8 32-bit
37 + //! words, or 32 bytes, wide) in a single update.
38 + //!
39 + //! There is currently no synchronization between completion of the QSPI data write and the
40 + //! IO-update signal. It is currently assumed that the QSPI transfer will always complete within a
41 + //! predefined delay (the pre-programmed IO-update timer delay).
42 + //!
43 + //!
44 + //! # Future Improvement
45 + //!
46 + //! In the future, it would be possible to utilize a DMA transfer to complete the QSPI transfer.
47 + //! Once the QSPI transfer completed, this could trigger the IO-update timer to start to
48 + //! asynchronously complete IO-update automatically. This would allow for arbitrary profile sizes
49 + //! and ensure that IO-update was in-sync with the QSPI transfer.
50 + //!
51 + //! Currently, serialization is performed on each processing cycle. If there is a
52 + //! compile-time-known register update sequence needed for the application, the serialization
53 + //! process can be done once and then register values can be written into a pre-computed serialized
54 + //! buffer to avoid the software overhead of much of the serialization process.
   |

Check warning on line 26 in src/hardware/input_stamper.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
  --> src/hardware/input_stamper.rs:1:1
   |
1  | / ///! Digital Input 0 (DI0) reference clock timestamper
2  | | ///!
3  | | ///! This module provides a means of timestamping the rising edges of an external reference clock on
4  | | ///! the DI0 with a timer value from TIM5.
...  |
25 | | ///! This module only supports DI0 for timestamping due to trigger constraints on the DIx pins. If
26 | | ///! timestamping is desired in DI1, a separate timer + capture channel will be necessary.
   | |__________________________________________________________________________________________^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
   |
1  + //! Digital Input 0 (DI0) reference clock timestamper
2  + //!
3  + //! This module provides a means of timestamping the rising edges of an external reference clock on
4  + //! the DI0 with a timer value from TIM5.
5  + //!
6  + //! # Design
7  + //! An input capture channel is configured on DI0 and fed into TIM5's capture channel 4. TIM5 is
8  + //! then run in a free-running mode with a configured tick rate (PSC) and maximum count value
9  + //! (ARR). Whenever an edge on DI0 triggers, the current TIM5 counter value is captured and
10 + //! recorded as a timestamp. This timestamp can be either directly read from the timer channel or
11 + //! can be collected asynchronously via DMA collection.
12 + //!
13 + //! To prevent silently discarding timestamps, the TIM5 input capture over-capture flag is
14 + //! continually checked. Any over-capture event (which indicates an overwritten timestamp) then
15 + //! triggers a panic to indicate the dropped timestamp so that design parameters can be adjusted.
16 + //!
17 + //! # Tradeoffs
18 + //! It appears that DMA transfers can take a significant amount of time to disable (400ns) if they
19 + //! are being prematurely stopped (such is the case here). As such, for a sample batch size of 1,
20 + //! this can take up a significant amount of the total available processing time for the samples.
21 + //! This module checks for any captured timestamps from the timer capture channel manually. In
22 + //! this mode, the maximum input clock frequency supported is dependant on the sampling rate and
23 + //! batch size.
24 + //!
25 + //! This module only supports DI0 for timestamping due to trigger constraints on the DIx pins. If
26 + //! timestamping is desired in DI1, a separate timer + capture channel will be necessary.
   |

Check warning on line 52 in src/hardware/dac.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
  --> src/hardware/dac.rs:1:1
   |
1  | / ///! Stabilizer DAC management interface
2  | | ///!
3  | | ///! # Design
4  | | ///!
...  |
51 | | ///! for re-use of a previously provided DAC output buffer. It is assumed that the DMA request is
52 | | ///! served promptly after the transfer completes.
   | |__________________________________________________^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
   |
1  + //! Stabilizer DAC management interface
2  + //!
3  + //! # Design
4  + //!
5  + //! Stabilizer DACs are connected to the MCU via a simplex, SPI-compatible interface. Each DAC
6  + //! accepts a 16-bit output code.
7  + //!
8  + //! In order to maximize CPU processing time, the DAC code updates are offloaded to hardware using
9  + //! a timer compare channel, DMA stream, and the DAC SPI interface.
10 + //!
11 + //! The timer comparison channel is configured to generate a DMA request whenever the comparison
12 + //! occurs. Thus, whenever a comparison happens, a single DAC code can be written to the output. By
13 + //! configuring a DMA stream for a number of successive DAC codes, hardware can regularly update
14 + //! the DAC without requiring the CPU.
15 + //!
16 + //! In order to ensure alignment between the ADC sample batches and DAC output code batches, a DAC
17 + //! output batch is always exactly 3 batches after the ADC batch that generated it.
18 + //!
19 + //! The DMA transfer for the DAC output codes utilizes a double-buffer mode to avoid losing any
20 + //! transfer events generated by the timer (for example, when 2 update cycles occur before the DMA
21 + //! transfer completion is handled). In this mode, by the time DMA swaps buffers, there is always a valid buffer in the
22 + //! "next-transfer" double-buffer location for the DMA transfer. Once a transfer completes,
23 + //! software then has exactly one batch duration to fill the next buffer before its
24 + //! transfer begins. If software does not meet this deadline, old data will be repeatedly generated
25 + //! on the output and output will be shifted by one batch.
26 + //!
27 + //! ## Multiple Samples to Single DAC Codes
28 + //!
29 + //! For some applications, it may be desirable to generate a single DAC code from multiple ADC
30 + //! samples. In order to maintain timing characteristics between ADC samples and DAC code outputs,
31 + //! applications are required to generate one DAC code for each ADC sample. To accomodate mapping
32 + //! multiple inputs to a single output, the output code can be repeated a number of times in the
33 + //! output buffer corresponding with the number of input samples that were used to generate it.
34 + //!
35 + //!
36 + //! # Note
37 + //!
38 + //! There is a very small amount of latency between updating the two DACs due to bus matrix
39 + //! priority. As such, one of the DACs will be updated marginally earlier before the other because
40 + //! the DMA requests are generated simultaneously. This can be avoided by providing a known offset
41 + //! to other DMA requests, which can be completed by setting e.g. DAC0's comparison to a
42 + //! counter value of 2 and DAC1's comparison to a counter value of 3. This will have the effect of
43 + //! generating the DAC updates with a known latency of 1 timer tick to each other and prevent the
44 + //! DMAs from racing for the bus. As implemented, the DMA channels utilize natural priority of the
45 + //! DMA channels to arbitrate which transfer occurs first.
46 + //!
47 + //!
48 + //! # Limitations
49 + //!
50 + //! While double-buffered mode is used for DMA to avoid lost DAC-update events, there is no check
51 + //! for re-use of a previously provided DAC output buffer. It is assumed that the DMA request is
52 + //! served promptly after the transfer completes.
   |

Check warning on line 67 in src/hardware/adc.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
  --> src/hardware/adc.rs:1:1
   |
1  | / ///! Stabilizer ADC management interface
2  | | ///!
3  | | ///! # Design
4  | | ///!
...  |
66 | | ///! have finite depth, FIFO access is slower than AXISRAM access, and because the single
67 | | ///! buffer mode DMA disable/enable and buffer update sequence is slow.
   | |_______________________________________________________________________^
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
help: use an inner doc comment to document the parent module or crate
   |
1  + //! Stabilizer ADC management interface
2  + //!
3  + //! # Design
4  + //!
5  + //! Stabilizer ADCs are connected to the MCU via a simplex, SPI-compatible interface. The ADCs
6  + //! require a setup conversion time after asserting the CSn (convert) signal to generate the ADC
7  + //! code from the sampled level. Once the setup time has elapsed, the ADC data is clocked out of
8  + //! MISO. The internal setup time is managed by the SPI peripheral via a CSn setup time parameter
9  + //! during SPI configuration, which allows offloading the management of the setup time to hardware.
10 + //!
11 + //! Because of the SPI-compatibility of the ADCs, a single SPI peripheral + DMA is used to automate
12 + //! the collection of multiple ADC samples without requiring processing by the CPU, which reduces
13 + //! overhead and provides the CPU with more time for processing-intensive tasks, like DSP.
14 + //!
15 + //! The automation of sample collection utilizes three DMA streams, the SPI peripheral, and two
16 + //! timer compare channel for each ADC. One timer comparison channel is configured to generate a
17 + //! comparison event every time the timer is equal to a specific value. Each comparison then
18 + //! generates a DMA transfer event to write into the SPI CR1 register to initiate the transfer.
19 + //! This allows the SPI interface to periodically read a single sample. The other timer comparison
20 + //! channel is configured to generate a comparison event slightly before the first (~10 timer
21 + //! cycles). This channel triggers a separate DMA stream to clear the EOT flag within the SPI
22 + //! peripheral. The EOT flag must be cleared after each transfer or the SPI peripheral will not
23 + //! properly complete the single conversion. Thus, by using two DMA streams and timer comparison
24 + //! channels, the SPI can regularly acquire ADC samples.
25 + //!
26 + //! In order to collect the acquired ADC samples into a RAM buffer, a final DMA transfer is
27 + //! configured to read from the SPI RX FIFO into RAM. The request for this transfer is connected to
28 + //! the SPI RX data signal, so the SPI peripheral will request to move data into RAM whenever it is
29 + //! available. When enough samples have been collected, a transfer-complete interrupt is generated
30 + //! and the ADC samples are available for processing.
31 + //!
32 + //! After a complete transfer of a batch of samples, the inactive buffer is available to the
33 + //! user for processing. The processing must complete before the DMA transfer of the next batch
34 + //! completes.
35 + //!
36 + //! ## Starting Data Collection
37 + //!
38 + //! Because the DMA data collection is automated via timer count comparisons and DMA transfers, the
39 + //! ADCs can be initialized and configured, but will not begin sampling the external ADCs until the
40 + //! sampling timer is enabled. As such, the sampling timer should be enabled after all
41 + //! initialization has completed and immediately before the embedded processing loop begins.
42 + //!
43 + //!
44 + //! ## Batch Sizing
45 + //!
46 + //! The ADCs collect a group of N samples, which is referred to as a batch. The size of the batch
47 + //! is configured by the user at compile-time to allow for a custom-tailored implementation. Larger
48 + //! batch sizes generally provide for lower overhead and more processing time per sample, but come
49 + //! at the expense of increased input -> output latency.
50 + //!
51 + //!
52 + //! # Note
53 + //!
54 + //! While there are two ADCs, only a single ADC is configured to generate transfer-complete
55 + //! interrupts. This is done because it is assumed that the ADCs will always be sampled
56 + //! simultaneously. If only a single ADC is used, it must always be ADC0, as ADC1 will not generate
57 + //! transfer-complete interrupts.
58 + //!
59 + //! There is a very small amount of latency between sampling of ADCs due to bus matrix priority. As
60 + //! such, one of the ADCs will be sampled marginally earlier before the other because the DMA
61 + //! requests are generated simultaneously. This can be avoided by providing a known offset to the
62 + //! sample DMA requests, which can be completed by setting e.g. ADC0's comparison to a counter
63 + //! value of 0 and ADC1's comparison to a counter value of 1.
64 + //!
65 + //! In this implementation, double buffer mode DMA transfers are used because the SPI RX FIFOs
66 + //! have finite depth, FIFO access is slower than AXISRAM access, and because the single
67 + //! buffer mode DMA disable/enable and buffer update sequence is slow.
   |

Check warning on line 2 in src/hardware/mod.rs

See this annotation in the file changed.

@github-actions github-actions / clippy

this is an outer doc comment and does not apply to the parent module or crate

warning: this is an outer doc comment and does not apply to the parent module or crate
 --> src/hardware/mod.rs:2:1
  |
2 | ///! Module for all hardware-specific setup of Stabilizer
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#suspicious_doc_comments
  = note: `#[warn(clippy::suspicious_doc_comments)]` on by default
help: use an inner doc comment to document the parent module or crate
  |
2 | //! Module for all hardware-specific setup of Stabilizer
  |