diff options
Diffstat (limited to 'embassy-mspm0/build.rs')
| -rw-r--r-- | embassy-mspm0/build.rs | 87 |
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; | |||
| 7 | use std::{env, fs}; | 7 | use std::{env, fs}; |
| 8 | 8 | ||
| 9 | use common::CfgSet; | 9 | use common::CfgSet; |
| 10 | use mspm0_metapac::metadata::METADATA; | 10 | use mspm0_metapac::metadata::{ALL_CHIPS, METADATA}; |
| 11 | use proc_macro2::{Ident, Literal, Span, TokenStream}; | 11 | use proc_macro2::{Ident, Literal, Span, TokenStream}; |
| 12 | use quote::{format_ident, quote}; | 12 | use 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 | ||
| 68 | fn 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)] |
| 48 | struct Singleton { | 123 | struct Singleton { |
| 49 | name: String, | 124 | name: String, |
| @@ -146,7 +221,7 @@ fn make_valid_identifier(s: &str) -> Singleton { | |||
| 146 | } | 221 | } |
| 147 | 222 | ||
| 148 | fn generate_pincm_mapping() -> TokenStream { | 223 | fn 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 | ||
| 176 | fn generate_pin() -> TokenStream { | 251 | fn 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 | ||
