aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stm32-metapac-gen/src/lib.rs2
-rw-r--r--stm32-metapac/build.rs4
-rw-r--r--stm32-metapac/build_pregenerated.rs4
-rw-r--r--stm32-metapac/src/common.rs80
-rw-r--r--stm32-metapac/src/lib.rs4
5 files changed, 12 insertions, 82 deletions
diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs
index 14625097e..c959e1a61 100644
--- a/stm32-metapac-gen/src/lib.rs
+++ b/stm32-metapac-gen/src/lib.rs
@@ -332,7 +332,7 @@ impl Gen {
332 .unwrap(); 332 .unwrap();
333 fs::write( 333 fs::write(
334 self.opts.out_dir.join("src/common.rs"), 334 self.opts.out_dir.join("src/common.rs"),
335 include_bytes!("../../stm32-metapac/src/common.rs"), 335 chiptool::generate::COMMON_MODULE,
336 ) 336 )
337 .unwrap(); 337 .unwrap();
338 fs::write( 338 fs::write(
diff --git a/stm32-metapac/build.rs b/stm32-metapac/build.rs
index 44c10eced..32939eefe 100644
--- a/stm32-metapac/build.rs
+++ b/stm32-metapac/build.rs
@@ -58,6 +58,10 @@ fn main() {
58 out_dir.display(), 58 out_dir.display(),
59 chip_core_name 59 chip_core_name
60 ); 60 );
61 println!(
62 "cargo:rustc-env=STM32_METAPAC_COMMON_PATH={}/src/common.rs",
63 out_dir.display(),
64 );
61 65
62 println!("cargo:rerun-if-changed=build.rs"); 66 println!("cargo:rerun-if-changed=build.rs");
63} 67}
diff --git a/stm32-metapac/build_pregenerated.rs b/stm32-metapac/build_pregenerated.rs
index 2219acb55..660a95533 100644
--- a/stm32-metapac/build_pregenerated.rs
+++ b/stm32-metapac/build_pregenerated.rs
@@ -33,6 +33,10 @@ fn main() {
33 "cargo:rustc-env=STM32_METAPAC_METADATA_PATH=chips/{}/metadata.rs", 33 "cargo:rustc-env=STM32_METAPAC_METADATA_PATH=chips/{}/metadata.rs",
34 chip_core_name 34 chip_core_name
35 ); 35 );
36 println!(
37 "cargo:rustc-env=STM32_METAPAC_COMMON_PATH={}/src/common.rs",
38 crate_dir.display(),
39 );
36 40
37 println!("cargo:rerun-if-changed=build.rs"); 41 println!("cargo:rerun-if-changed=build.rs");
38} 42}
diff --git a/stm32-metapac/src/common.rs b/stm32-metapac/src/common.rs
deleted file mode 100644
index 568a98486..000000000
--- a/stm32-metapac/src/common.rs
+++ /dev/null
@@ -1,80 +0,0 @@
1use core::marker::PhantomData;
2
3#[derive(Copy, Clone, PartialEq, Eq)]
4pub struct RW;
5#[derive(Copy, Clone, PartialEq, Eq)]
6pub struct R;
7#[derive(Copy, Clone, PartialEq, Eq)]
8pub struct W;
9
10mod sealed {
11 use super::*;
12 pub trait Access {}
13 impl Access for R {}
14 impl Access for W {}
15 impl Access for RW {}
16}
17
18pub trait Access: sealed::Access + Copy {}
19impl Access for R {}
20impl Access for W {}
21impl Access for RW {}
22
23pub trait Read: Access {}
24impl Read for RW {}
25impl Read for R {}
26
27pub trait Write: Access {}
28impl Write for RW {}
29impl Write for W {}
30
31#[derive(Copy, Clone, PartialEq, Eq)]
32pub struct Reg<T: Copy, A: Access> {
33 ptr: *mut u8,
34 phantom: PhantomData<*mut (T, A)>,
35}
36unsafe impl<T: Copy, A: Access> Send for Reg<T, A> {}
37unsafe impl<T: Copy, A: Access> Sync for Reg<T, A> {}
38
39impl<T: Copy, A: Access> Reg<T, A> {
40 pub fn from_ptr(ptr: *mut u8) -> Self {
41 Self {
42 ptr,
43 phantom: PhantomData,
44 }
45 }
46
47 pub fn ptr(&self) -> *mut T {
48 self.ptr as _
49 }
50}
51
52impl<T: Copy, A: Read> Reg<T, A> {
53 pub unsafe fn read(&self) -> T {
54 (self.ptr as *mut T).read_volatile()
55 }
56}
57
58impl<T: Copy, A: Write> Reg<T, A> {
59 pub unsafe fn write_value(&self, val: T) {
60 (self.ptr as *mut T).write_volatile(val)
61 }
62}
63
64impl<T: Default + Copy, A: Write> Reg<T, A> {
65 pub unsafe fn write<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
66 let mut val = Default::default();
67 let res = f(&mut val);
68 self.write_value(val);
69 res
70 }
71}
72
73impl<T: Copy, A: Read + Write> Reg<T, A> {
74 pub unsafe fn modify<R>(&self, f: impl FnOnce(&mut T) -> R) -> R {
75 let mut val = self.read();
76 let res = f(&mut val);
77 self.write_value(val);
78 res
79 }
80}
diff --git a/stm32-metapac/src/lib.rs b/stm32-metapac/src/lib.rs
index 4eab29861..58a1c5e45 100644
--- a/stm32-metapac/src/lib.rs
+++ b/stm32-metapac/src/lib.rs
@@ -4,7 +4,9 @@
4#![allow(non_camel_case_types)] 4#![allow(non_camel_case_types)]
5#![doc(html_no_source)] 5#![doc(html_no_source)]
6 6
7pub mod common; 7pub mod common {
8 include!(env!("STM32_METAPAC_COMMON_PATH"));
9}
8 10
9#[cfg(feature = "pac")] 11#[cfg(feature = "pac")]
10include!(env!("STM32_METAPAC_PAC_PATH")); 12include!(env!("STM32_METAPAC_PAC_PATH"));