aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embassy-nrf/CHANGELOG.md1
-rw-r--r--embassy-nrf/src/lib.rs15
2 files changed, 13 insertions, 3 deletions
diff --git a/embassy-nrf/CHANGELOG.md b/embassy-nrf/CHANGELOG.md
index d26671674..2524464b0 100644
--- a/embassy-nrf/CHANGELOG.md
+++ b/embassy-nrf/CHANGELOG.md
@@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
30- added: expose PPI events available on SPIS peripheral 30- added: expose PPI events available on SPIS peripheral
31- added: add basic GRTC time driver support for nRF54L 31- added: add basic GRTC time driver support for nRF54L
32* added: support for nrf54l10 and nrf54l05 32* added: support for nrf54l10 and nrf54l05
33* added: expose uicr write functions
33 34
34## 0.8.0 - 2025-09-30 35## 0.8.0 - 2025-09-30
35 36
diff --git a/embassy-nrf/src/lib.rs b/embassy-nrf/src/lib.rs
index 4cb291626..b3a9c19d1 100644
--- a/embassy-nrf/src/lib.rs
+++ b/embassy-nrf/src/lib.rs
@@ -667,10 +667,11 @@ mod consts {
667 pub const APPROTECT_DISABLED: u32 = 0x0000_005a; 667 pub const APPROTECT_DISABLED: u32 = 0x0000_005a;
668} 668}
669 669
670/// Result from writing UICR.
670#[cfg(not(any(feature = "_nrf51", feature = "_nrf54l")))] 671#[cfg(not(any(feature = "_nrf51", feature = "_nrf54l")))]
671#[derive(Debug, Copy, Clone, Eq, PartialEq)] 672#[derive(Debug, Copy, Clone, Eq, PartialEq)]
672#[cfg_attr(feature = "defmt", derive(defmt::Format))] 673#[cfg_attr(feature = "defmt", derive(defmt::Format))]
673enum WriteResult { 674pub enum WriteResult {
674 /// Word was written successfully, needs reset. 675 /// Word was written successfully, needs reset.
675 Written, 676 Written,
676 /// Word was already set to the value we wanted to write, nothing was done. 677 /// Word was already set to the value we wanted to write, nothing was done.
@@ -679,13 +680,21 @@ enum WriteResult {
679 Failed, 680 Failed,
680} 681}
681 682
683/// Write the UICR value at the provided address, ensuring that flash
684/// settings are correctly apply to persist the value.
685///
686/// Safety: the address must be a valid UICR register.
682#[cfg(not(any(feature = "_nrf51", feature = "_nrf54l")))] 687#[cfg(not(any(feature = "_nrf51", feature = "_nrf54l")))]
683unsafe fn uicr_write(address: *mut u32, value: u32) -> WriteResult { 688pub unsafe fn uicr_write(address: *mut u32, value: u32) -> WriteResult {
684 uicr_write_masked(address, value, 0xFFFF_FFFF) 689 uicr_write_masked(address, value, 0xFFFF_FFFF)
685} 690}
686 691
687#[cfg(not(any(feature = "_nrf51", feature = "_nrf54l")))] 692#[cfg(not(any(feature = "_nrf51", feature = "_nrf54l")))]
688unsafe fn uicr_write_masked(address: *mut u32, value: u32, mask: u32) -> WriteResult { 693/// Write the UICR value at the provided address, ensuring that flash
694/// settings are correctly apply to persist the value.
695///
696/// Safety: the address must be a valid UICR register.
697pub unsafe fn uicr_write_masked(address: *mut u32, value: u32, mask: u32) -> WriteResult {
689 let curr_val = address.read_volatile(); 698 let curr_val = address.read_volatile();
690 if curr_val & mask == value & mask { 699 if curr_val & mask == value & mask {
691 return WriteResult::Noop; 700 return WriteResult::Noop;