From ae285b84ed551aa5c81443fcacb73e788a6d36c2 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Wed, 3 Dec 2025 14:07:57 -0800 Subject: CRC Fixes #74 Signed-off-by: Felipe Balbi --- examples/mcxa/src/bin/crc.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 examples/mcxa/src/bin/crc.rs (limited to 'examples') diff --git a/examples/mcxa/src/bin/crc.rs b/examples/mcxa/src/bin/crc.rs new file mode 100644 index 000000000..417b4f865 --- /dev/null +++ b/examples/mcxa/src/bin/crc.rs @@ -0,0 +1,39 @@ +#![no_std] +#![no_main] + +use embassy_executor::Spawner; +use hal::config::Config; +use hal::crc::Crc; +use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let config = Config::default(); + let mut p = hal::init(config); + + defmt::info!("CRC example"); + + let buf = b"123456789"; + + let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); + let sum = crc.feed_bytes(buf); + assert_eq!(sum, 0x29b1); + + let mut crc = Crc::new_maxim(p.CRC0.reborrow()); + let sum = crc.feed_bytes(buf); + assert_eq!(sum, 0x44c2); + + let mut crc = Crc::new_kermit(p.CRC0.reborrow()); + let sum = crc.feed_bytes(buf); + assert_eq!(sum, 0x2189); + + let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); + let sum = crc.feed_bytes(buf); + assert_eq!(sum, 0xcbf4_3926); + + let mut crc = Crc::new_posix(p.CRC0.reborrow()); + let sum = crc.feed_bytes(buf); + assert_eq!(sum, 0x765e_7680); + + defmt::info!("CRC successful"); +} -- cgit From b943d71365ef05b23db7066727f8bb6158b1a624 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Fri, 5 Dec 2025 08:41:43 -0800 Subject: mcxa/crc: document the use of align_to --- examples/mcxa/src/bin/crc.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/crc.rs b/examples/mcxa/src/bin/crc.rs index 417b4f865..f963620cc 100644 --- a/examples/mcxa/src/bin/crc.rs +++ b/examples/mcxa/src/bin/crc.rs @@ -16,23 +16,23 @@ async fn main(_spawner: Spawner) { let buf = b"123456789"; let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); - let sum = crc.feed_bytes(buf); + let sum = crc.feed(buf); assert_eq!(sum, 0x29b1); let mut crc = Crc::new_maxim(p.CRC0.reborrow()); - let sum = crc.feed_bytes(buf); + let sum = crc.feed(buf); assert_eq!(sum, 0x44c2); let mut crc = Crc::new_kermit(p.CRC0.reborrow()); - let sum = crc.feed_bytes(buf); + let sum = crc.feed(buf); assert_eq!(sum, 0x2189); let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); - let sum = crc.feed_bytes(buf); + let sum = crc.feed(buf); assert_eq!(sum, 0xcbf4_3926); let mut crc = Crc::new_posix(p.CRC0.reborrow()); - let sum = crc.feed_bytes(buf); + let sum = crc.feed(buf); assert_eq!(sum, 0x765e_7680); defmt::info!("CRC successful"); -- cgit From c48aa4c1a9820d3875995ca707c3aa133f17d19e Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Fri, 5 Dec 2025 09:58:17 -0800 Subject: mcxa: crc: check all word types Signed-off-by: Felipe Balbi --- examples/mcxa/src/bin/crc.rs | 74 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 11 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/src/bin/crc.rs b/examples/mcxa/src/bin/crc.rs index f963620cc..12c423980 100644 --- a/examples/mcxa/src/bin/crc.rs +++ b/examples/mcxa/src/bin/crc.rs @@ -13,27 +13,79 @@ async fn main(_spawner: Spawner) { defmt::info!("CRC example"); - let buf = b"123456789"; + let buf_u8 = [0x00u8, 0x11, 0x22, 0x33]; + let buf_u16 = [0x0000u16, 0x1111, 0x2222, 0x3333]; + let buf_u32 = [0x0000_0000u32, 0x1111_1111, 0x2222_2222, 0x3333_3333]; + + // CCITT False + + let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u8); + assert_eq!(sum, 0x9627); let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); - let sum = crc.feed(buf); - assert_eq!(sum, 0x29b1); + let sum = crc.feed(&buf_u16); + assert_eq!(sum, 0xa467); + + let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u32); + assert_eq!(sum, 0xe5c7); + + // Maxim let mut crc = Crc::new_maxim(p.CRC0.reborrow()); - let sum = crc.feed(buf); - assert_eq!(sum, 0x44c2); + let sum = crc.feed(&buf_u8); + assert_eq!(sum, 0x4ff7); + + let mut crc = Crc::new_maxim(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u16); + assert_eq!(sum, 0x2afe); + + let mut crc = Crc::new_maxim(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u32); + assert_eq!(sum, 0x17d7); + + // Kermit + + let mut crc = Crc::new_kermit(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u8); + assert_eq!(sum, 0xccd2); let mut crc = Crc::new_kermit(p.CRC0.reborrow()); - let sum = crc.feed(buf); - assert_eq!(sum, 0x2189); + let sum = crc.feed(&buf_u16); + assert_eq!(sum, 0x66eb); + + let mut crc = Crc::new_kermit(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u32); + assert_eq!(sum, 0x75ea); + + // ISO HDLC + + let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u8); + assert_eq!(sum, 0x24c2_316d); + + let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u16); + assert_eq!(sum, 0x8a61_4178); let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); - let sum = crc.feed(buf); - assert_eq!(sum, 0xcbf4_3926); + let sum = crc.feed(&buf_u32); + assert_eq!(sum, 0xfab5_d04e); + + // POSIX + + let mut crc = Crc::new_posix(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u8); + assert_eq!(sum, 0xba8d_7868); + + let mut crc = Crc::new_posix(p.CRC0.reborrow()); + let sum = crc.feed(&buf_u16); + assert_eq!(sum, 0x6d76_4f58); let mut crc = Crc::new_posix(p.CRC0.reborrow()); - let sum = crc.feed(buf); - assert_eq!(sum, 0x765e_7680); + let sum = crc.feed(&buf_u32); + assert_eq!(sum, 0x2a5b_cb90); defmt::info!("CRC successful"); } -- cgit From cc34871ebef2513f69ce52f8f8f717473e701ec2 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Mon, 8 Dec 2025 08:44:50 -0800 Subject: review comments --- examples/mcxa/Cargo.toml | 1 + examples/mcxa/src/bin/crc.rs | 103 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 84 insertions(+), 20 deletions(-) (limited to 'examples') diff --git a/examples/mcxa/Cargo.toml b/examples/mcxa/Cargo.toml index 4d0459f41..19d8d8657 100644 --- a/examples/mcxa/Cargo.toml +++ b/examples/mcxa/Cargo.toml @@ -8,6 +8,7 @@ publish = false [dependencies] cortex-m = { version = "0.7", features = ["critical-section-single-core"] } cortex-m-rt = { version = "0.7", features = ["set-sp", "set-vtor"] } +crc = "3.4.0" critical-section = "1.2.0" defmt = "1.0" defmt-rtt = "1.0" diff --git a/examples/mcxa/src/bin/crc.rs b/examples/mcxa/src/bin/crc.rs index 12c423980..0125e625c 100644 --- a/examples/mcxa/src/bin/crc.rs +++ b/examples/mcxa/src/bin/crc.rs @@ -6,6 +6,28 @@ use hal::config::Config; use hal::crc::Crc; use {defmt_rtt as _, embassy_mcxa as hal, panic_probe as _}; +const CCITT_FALSE: crc::Algorithm = crc::Algorithm { + width: 16, + poly: 0x1021, + init: 0xffff, + refin: false, + refout: false, + xorout: 0, + check: 0x29b1, + residue: 0x0000, +}; + +const POSIX: crc::Algorithm = crc::Algorithm { + width: 32, + poly: 0x04c1_1db7, + init: 0, + refin: false, + refout: false, + xorout: 0xffff_ffff, + check: 0x765e_7680, + residue: 0x0000, +}; + #[embassy_executor::main] async fn main(_spawner: Spawner) { let config = Config::default(); @@ -19,72 +41,113 @@ async fn main(_spawner: Spawner) { // CCITT False + let sw_crc = crc::Crc::::new(&CCITT_FALSE); + let mut digest = sw_crc.digest(); + digest.update(&buf_u8); + let sw_sum = digest.finalize(); + let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u8); - assert_eq!(sum, 0x9627); + crc.feed(&buf_u8); + let sum = crc.finalize(); + assert_eq!(sum, sw_sum); let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u16); + crc.feed(&buf_u16); + let sum = crc.finalize(); assert_eq!(sum, 0xa467); let mut crc = Crc::new_ccitt_false(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u32); + crc.feed(&buf_u32); + let sum = crc.finalize(); assert_eq!(sum, 0xe5c7); // Maxim + let sw_crc = crc::Crc::::new(&crc::CRC_16_MAXIM_DOW); + let mut digest = sw_crc.digest(); + digest.update(&buf_u8); + let sw_sum = digest.finalize(); + let mut crc = Crc::new_maxim(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u8); - assert_eq!(sum, 0x4ff7); + crc.feed(&buf_u8); + let sum = crc.finalize(); + assert_eq!(sum, sw_sum); let mut crc = Crc::new_maxim(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u16); + crc.feed(&buf_u16); + let sum = crc.finalize(); assert_eq!(sum, 0x2afe); let mut crc = Crc::new_maxim(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u32); + crc.feed(&buf_u32); + let sum = crc.finalize(); assert_eq!(sum, 0x17d7); // Kermit + let sw_crc = crc::Crc::::new(&crc::CRC_16_KERMIT); + let mut digest = sw_crc.digest(); + digest.update(&buf_u8); + let sw_sum = digest.finalize(); + let mut crc = Crc::new_kermit(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u8); - assert_eq!(sum, 0xccd2); + crc.feed(&buf_u8); + let sum = crc.finalize(); + assert_eq!(sum, sw_sum); let mut crc = Crc::new_kermit(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u16); + crc.feed(&buf_u16); + let sum = crc.finalize(); assert_eq!(sum, 0x66eb); let mut crc = Crc::new_kermit(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u32); + crc.feed(&buf_u32); + let sum = crc.finalize(); assert_eq!(sum, 0x75ea); // ISO HDLC + let sw_crc = crc::Crc::::new(&crc::CRC_32_ISO_HDLC); + let mut digest = sw_crc.digest(); + digest.update(&buf_u8); + let sw_sum = digest.finalize(); + let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u8); - assert_eq!(sum, 0x24c2_316d); + crc.feed(&buf_u8); + let sum = crc.finalize(); + assert_eq!(sum, sw_sum); let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u16); + crc.feed(&buf_u16); + let sum = crc.finalize(); assert_eq!(sum, 0x8a61_4178); let mut crc = Crc::new_iso_hdlc(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u32); + crc.feed(&buf_u32); + let sum = crc.finalize(); assert_eq!(sum, 0xfab5_d04e); // POSIX + let sw_crc = crc::Crc::::new(&POSIX); + let mut digest = sw_crc.digest(); + digest.update(&buf_u8); + let sw_sum = digest.finalize(); + let mut crc = Crc::new_posix(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u8); - assert_eq!(sum, 0xba8d_7868); + crc.feed(&buf_u8); + let sum = crc.finalize(); + + assert_eq!(sum, sw_sum); let mut crc = Crc::new_posix(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u16); + crc.feed(&buf_u16); + let sum = crc.finalize(); assert_eq!(sum, 0x6d76_4f58); let mut crc = Crc::new_posix(p.CRC0.reborrow()); - let sum = crc.feed(&buf_u32); + crc.feed(&buf_u32); + let sum = crc.finalize(); assert_eq!(sum, 0x2a5b_cb90); defmt::info!("CRC successful"); -- cgit