aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Salzedo <[email protected]>2021-09-26 18:26:20 -0700
committerJoshua Salzedo <[email protected]>2021-09-26 18:26:20 -0700
commitafef19d813d7301631e98f432621ceaa963d253e (patch)
treefae73fcd985d7d4f4b153808f7979af8004f0bcb
parent7899d733590ad373e0dea215d0b084f32412a816 (diff)
Start work towards CRC_V2
-rw-r--r--embassy-stm32/src/crc/mod.rs9
-rw-r--r--embassy-stm32/src/crc/v2.rs86
2 files changed, 92 insertions, 3 deletions
diff --git a/embassy-stm32/src/crc/mod.rs b/embassy-stm32/src/crc/mod.rs
index d8de4bd09..42f131af7 100644
--- a/embassy-stm32/src/crc/mod.rs
+++ b/embassy-stm32/src/crc/mod.rs
@@ -1,6 +1,9 @@
1#[cfg_attr(crc_v1, path = "v1.rs")] 1use crate::peripherals::CRC;
2#[cfg_attr(crc_v2, path = "v2.rs")] 2
3
4#[cfg_attr(crc_v2, path = "v1.rs")]
5#[cfg_attr(crc_v1, path = "v2.rs")]
3#[cfg_attr(crc_v3, path = "v3.rs")] 6#[cfg_attr(crc_v3, path = "v3.rs")]
4mod _version; 7mod _version;
5 8
6pub use _version::Crc; 9pub use _version::Crc; \ No newline at end of file
diff --git a/embassy-stm32/src/crc/v2.rs b/embassy-stm32/src/crc/v2.rs
index 8b1378917..523bad10f 100644
--- a/embassy-stm32/src/crc/v2.rs
+++ b/embassy-stm32/src/crc/v2.rs
@@ -1 +1,87 @@
1use crate::pac::CRC as PAC_CRC;
2use crate::pac::crc::vals;
3use crate::peripherals::CRC;
4use crate::rcc::sealed::RccPeripheral;
1 5
6pub struct Crc {
7 _peripheral: CRC,
8 _config: CrcConfig,
9}
10
11pub enum CrcConfigError {
12 InvalidPolynomial
13}
14
15pub struct CrcConfig {
16 reverse_in: CrcInputReverseConfig,
17 reverse_out: bool,
18 poly_size: PolySize,
19 crc_init_value: u32,
20 crc_poly: u32,
21}
22
23pub enum CrcInputReverseConfig {
24 None,
25 Byte,
26 Halfword,
27 Word,
28}
29
30impl CrcConfig {
31 pub fn new(reverse_in: CrcInputReverseConfig, reverse_out: bool, poly_size: PolySize, crc_init_value: u32, crc_poly: u32) -> Result<Self, CrcConfigError> {
32 // As Per RM0091 (DocID018940 Rev 9), Even polynomials are not supported.
33 if crc_poly % 2 == 0 {
34 Err(CrcConfigError::InvalidPolynomial)
35 } else {
36 Ok(CrcConfig { reverse_in, reverse_out, poly_size, crc_init_value, crc_poly })
37 }
38 }
39}
40
41pub enum PolySize {
42 Width7,
43 Width8,
44 Width16,
45 Width32,
46}
47
48impl Crc {
49 /// Instantiates the CRC32 peripheral and initializes it to default values.
50 pub fn new(peripheral: CRC, init_value: u32, config: CrcConfig) -> Self {
51 // Note: enable and reset come from RccPeripheral.
52 // enable CRC clock in RCC.
53 CRC::enable();
54 // Reset CRC to default values.
55 CRC::reset();
56 let mut instance = Self {
57 _peripheral: peripheral,
58 };
59 instance.init();
60 instance
61 }
62
63 // Configure device settings
64 fn configure_revout(&mut self) {
65 unsafe {
66 PAC_CRC.cr().modify(|w| {w.set_rev_out(
67 match self._config.reverse_out {
68 true => {vals::RevOut::REVERSED}
69 false => {vals::RevOut::NORMAL}
70 }
71 )})
72 }
73 }
74
75 fn configure_revin(&mut self) {
76 unsafe {
77 PAC_CRC.cr().modify(|w| {w.set_rev_in(
78 match self._config.reverse_in {
79 CrcInputReverseConfig::None => {vals::RevIn::NORMAL}
80 CrcInputReverseConfig::Byte => {vals::RevIn::BYTE}
81 CrcInputReverseConfig::Halfword => {vals::RevIn::HALFWORD}
82 CrcInputReverseConfig::Word => {vals::RevIn::WORD}
83 }
84 )})
85 }
86 }
87} \ No newline at end of file