aboutsummaryrefslogtreecommitdiff
path: root/embassy-mspm0/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-mspm0/build.rs')
-rw-r--r--embassy-mspm0/build.rs87
1 files changed, 81 insertions, 6 deletions
diff --git a/embassy-mspm0/build.rs b/embassy-mspm0/build.rs
index 08209df2a..409ce0621 100644
--- a/embassy-mspm0/build.rs
+++ b/embassy-mspm0/build.rs
@@ -7,7 +7,7 @@ use std::sync::LazyLock;
7use std::{env, fs}; 7use std::{env, fs};
8 8
9use common::CfgSet; 9use common::CfgSet;
10use mspm0_metapac::metadata::METADATA; 10use mspm0_metapac::metadata::{ALL_CHIPS, METADATA};
11use proc_macro2::{Ident, Literal, Span, TokenStream}; 11use proc_macro2::{Ident, Literal, Span, TokenStream};
12use quote::{format_ident, quote}; 12use quote::{format_ident, quote};
13 13
@@ -24,6 +24,27 @@ fn generate_code() {
24 24
25 cfgs.declare_all(&["gpio_pb", "gpio_pc", "int_group1"]); 25 cfgs.declare_all(&["gpio_pb", "gpio_pc", "int_group1"]);
26 26
27 let chip_name = match env::vars()
28 .map(|(a, _)| a)
29 .filter(|x| x.starts_with("CARGO_FEATURE_MSPM0") || x.starts_with("CARGO_FEATURE_MSPS"))
30 .get_one()
31 {
32 Ok(x) => x,
33 Err(GetOneError::None) => panic!("No mspm0xx/mspsxx Cargo feature enabled"),
34 Err(GetOneError::Multiple) => panic!("Multiple mspm0xx/mspsxx Cargo features enabled"),
35 }
36 .strip_prefix("CARGO_FEATURE_")
37 .unwrap()
38 .to_ascii_lowercase()
39 .replace('_', "-");
40
41 eprintln!("chip: {chip_name}");
42
43 cfgs.enable_all(&get_chip_cfgs(&chip_name));
44 for chip in ALL_CHIPS {
45 cfgs.declare_all(&get_chip_cfgs(&chip));
46 }
47
27 let mut singletons = get_singletons(&mut cfgs); 48 let mut singletons = get_singletons(&mut cfgs);
28 49
29 time_driver(&mut singletons, &mut cfgs); 50 time_driver(&mut singletons, &mut cfgs);
@@ -44,6 +65,60 @@ fn generate_code() {
44 rustfmt(&out_file); 65 rustfmt(&out_file);
45} 66}
46 67
68fn get_chip_cfgs(chip_name: &str) -> Vec<String> {
69 let mut cfgs = Vec::new();
70
71 // GPIO on C110x is special as it does not belong to an interrupt group.
72 if chip_name.starts_with("mspm0c110") || chip_name.starts_with("msps003f") {
73 cfgs.push("mspm0c110x".to_string());
74 }
75
76 // Family ranges (temporary until int groups are generated)
77 //
78 // TODO: Remove this once int group stuff is generated.
79 if chip_name.starts_with("mspm0g110") {
80 cfgs.push("mspm0g110x".to_string());
81 }
82
83 if chip_name.starts_with("mspm0g150") {
84 cfgs.push("mspm0g150x".to_string());
85 }
86
87 if chip_name.starts_with("mspm0g310") {
88 cfgs.push("mspm0g310x".to_string());
89 }
90
91 if chip_name.starts_with("mspm0g350") {
92 cfgs.push("mspm0g350x".to_string());
93 }
94
95 if chip_name.starts_with("mspm0g351") {
96 cfgs.push("mspm0g351x".to_string());
97 }
98
99 if chip_name.starts_with("mspm0l110") {
100 cfgs.push("mspm0l110x".to_string());
101 }
102
103 if chip_name.starts_with("mspm0l122") {
104 cfgs.push("mspm0l122x".to_string());
105 }
106
107 if chip_name.starts_with("mspm0l130") {
108 cfgs.push("mspm0l130x".to_string());
109 }
110
111 if chip_name.starts_with("mspm0l134") {
112 cfgs.push("mspm0l134x".to_string());
113 }
114
115 if chip_name.starts_with("mspm0l222") {
116 cfgs.push("mspm0l222x".to_string());
117 }
118
119 cfgs
120}
121
47#[derive(Debug, Clone)] 122#[derive(Debug, Clone)]
48struct Singleton { 123struct Singleton {
49 name: String, 124 name: String,
@@ -146,7 +221,7 @@ fn make_valid_identifier(s: &str) -> Singleton {
146} 221}
147 222
148fn generate_pincm_mapping() -> TokenStream { 223fn generate_pincm_mapping() -> TokenStream {
149 let pincms = METADATA.pincm_mappings.iter().map(|mapping| { 224 let pincms = METADATA.pins.iter().map(|mapping| {
150 let port_letter = mapping.pin.strip_prefix("P").unwrap(); 225 let port_letter = mapping.pin.strip_prefix("P").unwrap();
151 let port_base = (port_letter.chars().next().unwrap() as u8 - b'A') * 32; 226 let port_base = (port_letter.chars().next().unwrap() as u8 - b'A') * 32;
152 // This assumes all ports are single letter length. 227 // This assumes all ports are single letter length.
@@ -174,11 +249,11 @@ fn generate_pincm_mapping() -> TokenStream {
174} 249}
175 250
176fn generate_pin() -> TokenStream { 251fn generate_pin() -> TokenStream {
177 let pin_impls = METADATA.pincm_mappings.iter().map(|pincm_mapping| { 252 let pin_impls = METADATA.pins.iter().map(|pin| {
178 let name = Ident::new(&pincm_mapping.pin, Span::call_site()); 253 let name = Ident::new(&pin.pin, Span::call_site());
179 let port_letter = pincm_mapping.pin.strip_prefix("P").unwrap(); 254 let port_letter = pin.pin.strip_prefix("P").unwrap();
180 let port_letter = port_letter.chars().next().unwrap(); 255 let port_letter = port_letter.chars().next().unwrap();
181 let pin_number = Literal::u8_unsuffixed(pincm_mapping.pin[2..].parse::<u8>().unwrap()); 256 let pin_number = Literal::u8_unsuffixed(pin.pin[2..].parse::<u8>().unwrap());
182 257
183 let port = Ident::new(&format!("Port{}", port_letter), Span::call_site()); 258 let port = Ident::new(&format!("Port{}", port_letter), Span::call_site());
184 259