From 198ef8183e74543d013acd6b45d0efa861bb33fa Mon Sep 17 00:00:00 2001 From: Adam Greig Date: Sun, 3 Dec 2023 02:05:55 +0000 Subject: [PATCH] STM32: Add UID driver --- embassy-stm32/src/lib.rs | 2 ++ embassy-stm32/src/uid.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 embassy-stm32/src/uid.rs diff --git a/embassy-stm32/src/lib.rs b/embassy-stm32/src/lib.rs index 7ce801a0..13e189da 100644 --- a/embassy-stm32/src/lib.rs +++ b/embassy-stm32/src/lib.rs @@ -63,6 +63,8 @@ pub mod sai; pub mod sdmmc; #[cfg(spi)] pub mod spi; +#[cfg(uid)] +pub mod uid; #[cfg(usart)] pub mod usart; #[cfg(usb)] diff --git a/embassy-stm32/src/uid.rs b/embassy-stm32/src/uid.rs new file mode 100644 index 00000000..6dcfcb96 --- /dev/null +++ b/embassy-stm32/src/uid.rs @@ -0,0 +1,29 @@ +/// Get this device's unique 96-bit ID. +pub fn uid() -> &'static [u8; 12] { + unsafe { &*crate::pac::UID.uid(0).as_ptr().cast::<[u8; 12]>() } +} + +/// Get this device's unique 96-bit ID, encoded into a string of 24 hexadecimal ASCII digits. +pub fn uid_hex() -> &'static str { + unsafe { core::str::from_utf8_unchecked(uid_hex_bytes()) } +} + +/// Get this device's unique 96-bit ID, encoded into 24 hexadecimal ASCII bytes. +pub fn uid_hex_bytes() -> &'static [u8; 24] { + const HEX: &[u8; 16] = b"0123456789ABCDEF"; + static mut UID_HEX: [u8; 24] = [0; 24]; + static mut LOADED: bool = false; + critical_section::with(|_| unsafe { + if !LOADED { + let uid = uid(); + for (idx, v) in uid.iter().enumerate() { + let lo = v & 0x0f; + let hi = (v & 0xf0) >> 4; + UID_HEX[idx * 2] = HEX[hi as usize]; + UID_HEX[idx * 2 + 1] = HEX[lo as usize]; + } + LOADED = true; + } + }); + unsafe { &UID_HEX } +}