diff options
author | 2017-05-07 17:20:57 +0000 | |
---|---|---|
committer | 2017-05-07 17:29:43 +0000 | |
commit | 0e3dd2df58e52f9af80e47327a62a83511e010f9 (patch) | |
tree | 3ee6e57aa31c7d9973c0c8662121072f0bf796f3 /src | |
parent | a9967c544da4ddc7575135ed522dffd21ec28c19 (diff) | |
download | cortex-m-0e3dd2df58e52f9af80e47327a62a83511e010f9.tar.gz cortex-m-0e3dd2df58e52f9af80e47327a62a83511e010f9.tar.zst cortex-m-0e3dd2df58e52f9af80e47327a62a83511e010f9.zip |
Add an API to set FPU access mode.
Diffstat (limited to 'src')
-rw-r--r-- | src/peripheral/mod.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/peripheral/mod.rs b/src/peripheral/mod.rs index e7d0c18..e9fae08 100644 --- a/src/peripheral/mod.rs +++ b/src/peripheral/mod.rs @@ -424,6 +424,57 @@ pub struct Scb { pub cpacr: RW<u32>, } +/// FPU access mode +pub enum FpuAccessMode { + /// FPU is not accessible + Disabled, + /// FPU is accessible in Privileged and User mode + Enabled, + /// FPU is accessible in Privileged mode only + Privileged, +} + +const SCB_CPACR_FPU_MASK: u32 = 0x00780000; +const SCB_CPACR_FPU_ENABLE: u32 = 0x00280000; +const SCB_CPACR_FPU_USER: u32 = 0x00500000; + +impl Scb { + /// Gets FPU access mode + pub fn fpu_access_mode(&self) -> FpuAccessMode { + let cpacr = self.cpacr.read(); + if cpacr & (SCB_CPACR_FPU_ENABLE | SCB_CPACR_FPU_USER) != 0 { + FpuAccessMode::Enabled + } else if cpacr & SCB_CPACR_FPU_ENABLE != 0 { + FpuAccessMode::Privileged + } else { + FpuAccessMode::Disabled + } + } + + /// Sets FPU access mode + pub fn set_fpu_access_mode(&self, mode: FpuAccessMode) { + let mut cpacr = self.cpacr.read() & !SCB_CPACR_FPU_MASK; + match mode { + FpuAccessMode::Disabled => (), + FpuAccessMode::Privileged => + cpacr |= SCB_CPACR_FPU_ENABLE, + FpuAccessMode::Enabled => + cpacr |= SCB_CPACR_FPU_ENABLE | SCB_CPACR_FPU_USER, + } + unsafe { self.cpacr.write(cpacr) } + } + + /// Shorthand for `set_fpu_access_mode(FpuAccessMode::Enabled)` + pub fn enable_fpu(&self) { + self.set_fpu_access_mode(FpuAccessMode::Enabled) + } + + /// Shorthand for `set_fpu_access_mode(FpuAccessMode::Disabled)` + pub fn disable_fpu(&self) { + self.set_fpu_access_mode(FpuAccessMode::Disabled) + } +} + /// SysTick register block #[repr(C)] pub struct Syst { |