diff options
Diffstat (limited to 'embassy-mspm0')
| -rw-r--r-- | embassy-mspm0/Cargo.toml | 140 | ||||
| -rw-r--r-- | embassy-mspm0/README.md | 28 | ||||
| -rw-r--r-- | embassy-mspm0/build.rs | 87 | ||||
| -rw-r--r-- | embassy-mspm0/src/gpio.rs | 4 | ||||
| -rw-r--r-- | embassy-mspm0/src/int_group/g150x.rs | 51 | ||||
| -rw-r--r-- | embassy-mspm0/src/lib.rs | 17 |
6 files changed, 305 insertions, 22 deletions
diff --git a/embassy-mspm0/Cargo.toml b/embassy-mspm0/Cargo.toml index df996ff4b..79feee0c2 100644 --- a/embassy-mspm0/Cargo.toml +++ b/embassy-mspm0/Cargo.toml | |||
| @@ -46,14 +46,14 @@ cortex-m = "0.7.6" | |||
| 46 | critical-section = "1.2.0" | 46 | critical-section = "1.2.0" |
| 47 | 47 | ||
| 48 | # mspm0-metapac = { version = "" } | 48 | # mspm0-metapac = { version = "" } |
| 49 | mspm0-metapac = { git = "https://github.com/mspm0-rs/mspm0-data-generated/", tag = "mspm0-data-119240dd23ef5748d2a7bef219ca298d37ba604a" } | 49 | mspm0-metapac = { git = "https://github.com/mspm0-rs/mspm0-data-generated/", tag = "mspm0-data-66a55c7bf38a2201ff48c299843e741f2d537f0b" } |
| 50 | 50 | ||
| 51 | [build-dependencies] | 51 | [build-dependencies] |
| 52 | proc-macro2 = "1.0.94" | 52 | proc-macro2 = "1.0.94" |
| 53 | quote = "1.0.40" | 53 | quote = "1.0.40" |
| 54 | 54 | ||
| 55 | # mspm0-metapac = { version = "", default-features = false, features = ["metadata"] } | 55 | # mspm0-metapac = { version = "", default-features = false, features = ["metadata"] } |
| 56 | mspm0-metapac = { git = "https://github.com/mspm0-rs/mspm0-data-generated/", tag = "mspm0-data-119240dd23ef5748d2a7bef219ca298d37ba604a", default-features = false, features = ["metadata"] } | 56 | mspm0-metapac = { git = "https://github.com/mspm0-rs/mspm0-data-generated/", tag = "mspm0-data-66a55c7bf38a2201ff48c299843e741f2d537f0b", default-features = false, features = ["metadata"] } |
| 57 | 57 | ||
| 58 | [features] | 58 | [features] |
| 59 | default = ["rt"] | 59 | default = ["rt"] |
| @@ -120,14 +120,138 @@ time-driver-tima0 = ["_time-driver"] | |||
| 120 | time-driver-tima1 = ["_time-driver"] | 120 | time-driver-tima1 = ["_time-driver"] |
| 121 | 121 | ||
| 122 | #! ## Chip-selection features | 122 | #! ## Chip-selection features |
| 123 | #! Select your chip by specifying the model as a feature, e.g. `mspm0g350x`. | 123 | #! Select your chip by specifying the model as a feature, e.g. `mspm0g3507pm`. |
| 124 | #! Check the `Cargo.toml` for the latest list of supported chips. | 124 | #! Check the `Cargo.toml` for the latest list of supported chips. |
| 125 | #! | 125 | #! |
| 126 | #! **Important:** Do not forget to adapt the target chip in your toolchain, | 126 | #! **Important:** Do not forget to adapt the target chip in your toolchain, |
| 127 | #! e.g. in `.cargo/config.toml`. | 127 | #! e.g. in `.cargo/config.toml`. |
| 128 | 128 | ||
| 129 | mspm0c110x = [ "mspm0-metapac/mspm0c110x" ] | 129 | mspm0c1103dgs20 = ["mspm0-metapac/mspm0c1103dgs20"] |
| 130 | mspm0g350x = [ "mspm0-metapac/mspm0g350x" ] | 130 | mspm0c1103dsg = ["mspm0-metapac/mspm0c1103dsg"] |
| 131 | mspm0g351x = [ "mspm0-metapac/mspm0g351x" ] | 131 | mspm0c1103dyy = ["mspm0-metapac/mspm0c1103dyy"] |
| 132 | mspm0l130x = [ "mspm0-metapac/mspm0l130x" ] | 132 | mspm0c1103ruk = ["mspm0-metapac/mspm0c1103ruk"] |
| 133 | mspm0l222x = [ "mspm0-metapac/mspm0l222x" ] | 133 | mspm0c1104dgs20 = ["mspm0-metapac/mspm0c1104dgs20"] |
| 134 | mspm0c1104dsg = ["mspm0-metapac/mspm0c1104dsg"] | ||
| 135 | mspm0c1104dyy = ["mspm0-metapac/mspm0c1104dyy"] | ||
| 136 | mspm0c1104ruk = ["mspm0-metapac/mspm0c1104ruk"] | ||
| 137 | mspm0c1104ycj = ["mspm0-metapac/mspm0c1104ycj"] | ||
| 138 | mspm0g1105dgs28 = ["mspm0-metapac/mspm0g1105dgs28"] | ||
| 139 | mspm0g1105pm = ["mspm0-metapac/mspm0g1105pm"] | ||
| 140 | mspm0g1105pt = ["mspm0-metapac/mspm0g1105pt"] | ||
| 141 | mspm0g1105rge = ["mspm0-metapac/mspm0g1105rge"] | ||
| 142 | mspm0g1105rgz = ["mspm0-metapac/mspm0g1105rgz"] | ||
| 143 | mspm0g1105rhb = ["mspm0-metapac/mspm0g1105rhb"] | ||
| 144 | mspm0g1106dgs28 = ["mspm0-metapac/mspm0g1106dgs28"] | ||
| 145 | mspm0g1106pm = ["mspm0-metapac/mspm0g1106pm"] | ||
| 146 | mspm0g1106pt = ["mspm0-metapac/mspm0g1106pt"] | ||
| 147 | mspm0g1106rge = ["mspm0-metapac/mspm0g1106rge"] | ||
| 148 | mspm0g1106rgz = ["mspm0-metapac/mspm0g1106rgz"] | ||
| 149 | mspm0g1106rhb = ["mspm0-metapac/mspm0g1106rhb"] | ||
| 150 | mspm0g1107dgs28 = ["mspm0-metapac/mspm0g1107dgs28"] | ||
| 151 | mspm0g1107pm = ["mspm0-metapac/mspm0g1107pm"] | ||
| 152 | mspm0g1107pt = ["mspm0-metapac/mspm0g1107pt"] | ||
| 153 | mspm0g1107rge = ["mspm0-metapac/mspm0g1107rge"] | ||
| 154 | mspm0g1107rgz = ["mspm0-metapac/mspm0g1107rgz"] | ||
| 155 | mspm0g1107rhb = ["mspm0-metapac/mspm0g1107rhb"] | ||
| 156 | mspm0g1107ycj = ["mspm0-metapac/mspm0g1107ycj"] | ||
| 157 | mspm0g1505pm = ["mspm0-metapac/mspm0g1505pm"] | ||
| 158 | mspm0g1505pt = ["mspm0-metapac/mspm0g1505pt"] | ||
| 159 | mspm0g1505rge = ["mspm0-metapac/mspm0g1505rge"] | ||
| 160 | mspm0g1505rgz = ["mspm0-metapac/mspm0g1505rgz"] | ||
| 161 | mspm0g1505rhb = ["mspm0-metapac/mspm0g1505rhb"] | ||
| 162 | mspm0g1506pm = ["mspm0-metapac/mspm0g1506pm"] | ||
| 163 | mspm0g1506pt = ["mspm0-metapac/mspm0g1506pt"] | ||
| 164 | mspm0g1506rge = ["mspm0-metapac/mspm0g1506rge"] | ||
| 165 | mspm0g1506rgz = ["mspm0-metapac/mspm0g1506rgz"] | ||
| 166 | mspm0g1506rhb = ["mspm0-metapac/mspm0g1506rhb"] | ||
| 167 | mspm0g1507pm = ["mspm0-metapac/mspm0g1507pm"] | ||
| 168 | mspm0g1507pt = ["mspm0-metapac/mspm0g1507pt"] | ||
| 169 | mspm0g1507rge = ["mspm0-metapac/mspm0g1507rge"] | ||
| 170 | mspm0g1507rgz = ["mspm0-metapac/mspm0g1507rgz"] | ||
| 171 | mspm0g1507rhb = ["mspm0-metapac/mspm0g1507rhb"] | ||
| 172 | mspm0g1507ycj = ["mspm0-metapac/mspm0g1507ycj"] | ||
| 173 | mspm0g1519rgz = ["mspm0-metapac/mspm0g1519rgz"] | ||
| 174 | mspm0g1519rhb = ["mspm0-metapac/mspm0g1519rhb"] | ||
| 175 | mspm0g3105dgs20 = ["mspm0-metapac/mspm0g3105dgs20"] | ||
| 176 | mspm0g3105dgs28 = ["mspm0-metapac/mspm0g3105dgs28"] | ||
| 177 | mspm0g3105rhb = ["mspm0-metapac/mspm0g3105rhb"] | ||
| 178 | mspm0g3106dgs20 = ["mspm0-metapac/mspm0g3106dgs20"] | ||
| 179 | mspm0g3106dgs28 = ["mspm0-metapac/mspm0g3106dgs28"] | ||
| 180 | mspm0g3106rhb = ["mspm0-metapac/mspm0g3106rhb"] | ||
| 181 | mspm0g3107dgs20 = ["mspm0-metapac/mspm0g3107dgs20"] | ||
| 182 | mspm0g3107dgs28 = ["mspm0-metapac/mspm0g3107dgs28"] | ||
| 183 | mspm0g3107rhb = ["mspm0-metapac/mspm0g3107rhb"] | ||
| 184 | mspm0g3505dgs28 = ["mspm0-metapac/mspm0g3505dgs28"] | ||
| 185 | mspm0g3505pm = ["mspm0-metapac/mspm0g3505pm"] | ||
| 186 | mspm0g3505pt = ["mspm0-metapac/mspm0g3505pt"] | ||
| 187 | mspm0g3505rgz = ["mspm0-metapac/mspm0g3505rgz"] | ||
| 188 | mspm0g3505rhb = ["mspm0-metapac/mspm0g3505rhb"] | ||
| 189 | mspm0g3506dgs28 = ["mspm0-metapac/mspm0g3506dgs28"] | ||
| 190 | mspm0g3506pm = ["mspm0-metapac/mspm0g3506pm"] | ||
| 191 | mspm0g3506pt = ["mspm0-metapac/mspm0g3506pt"] | ||
| 192 | mspm0g3506rgz = ["mspm0-metapac/mspm0g3506rgz"] | ||
| 193 | mspm0g3506rhb = ["mspm0-metapac/mspm0g3506rhb"] | ||
| 194 | mspm0g3507dgs28 = ["mspm0-metapac/mspm0g3507dgs28"] | ||
| 195 | mspm0g3507pm = ["mspm0-metapac/mspm0g3507pm"] | ||
| 196 | mspm0g3507pt = ["mspm0-metapac/mspm0g3507pt"] | ||
| 197 | mspm0g3507rgz = ["mspm0-metapac/mspm0g3507rgz"] | ||
| 198 | mspm0g3507rhb = ["mspm0-metapac/mspm0g3507rhb"] | ||
| 199 | mspm0g3519pm = ["mspm0-metapac/mspm0g3519pm"] | ||
| 200 | mspm0g3519pn = ["mspm0-metapac/mspm0g3519pn"] | ||
| 201 | mspm0g3519pz = ["mspm0-metapac/mspm0g3519pz"] | ||
| 202 | mspm0g3519rgz = ["mspm0-metapac/mspm0g3519rgz"] | ||
| 203 | mspm0g3519rhb = ["mspm0-metapac/mspm0g3519rhb"] | ||
| 204 | mspm0l1105dgs20 = ["mspm0-metapac/mspm0l1105dgs20"] | ||
| 205 | mspm0l1105dgs28 = ["mspm0-metapac/mspm0l1105dgs28"] | ||
| 206 | mspm0l1105dyy = ["mspm0-metapac/mspm0l1105dyy"] | ||
| 207 | mspm0l1105rge = ["mspm0-metapac/mspm0l1105rge"] | ||
| 208 | mspm0l1105rtr = ["mspm0-metapac/mspm0l1105rtr"] | ||
| 209 | mspm0l1106dgs20 = ["mspm0-metapac/mspm0l1106dgs20"] | ||
| 210 | mspm0l1106dgs28 = ["mspm0-metapac/mspm0l1106dgs28"] | ||
| 211 | mspm0l1106dyy = ["mspm0-metapac/mspm0l1106dyy"] | ||
| 212 | mspm0l1106rge = ["mspm0-metapac/mspm0l1106rge"] | ||
| 213 | mspm0l1106rhb = ["mspm0-metapac/mspm0l1106rhb"] | ||
| 214 | mspm0l1106rtr = ["mspm0-metapac/mspm0l1106rtr"] | ||
| 215 | mspm0l1227pm = ["mspm0-metapac/mspm0l1227pm"] | ||
| 216 | mspm0l1227pn = ["mspm0-metapac/mspm0l1227pn"] | ||
| 217 | mspm0l1227pt = ["mspm0-metapac/mspm0l1227pt"] | ||
| 218 | mspm0l1227rge = ["mspm0-metapac/mspm0l1227rge"] | ||
| 219 | mspm0l1227rgz = ["mspm0-metapac/mspm0l1227rgz"] | ||
| 220 | mspm0l1227rhb = ["mspm0-metapac/mspm0l1227rhb"] | ||
| 221 | mspm0l1228pm = ["mspm0-metapac/mspm0l1228pm"] | ||
| 222 | mspm0l1228pn = ["mspm0-metapac/mspm0l1228pn"] | ||
| 223 | mspm0l1228pt = ["mspm0-metapac/mspm0l1228pt"] | ||
| 224 | mspm0l1228rge = ["mspm0-metapac/mspm0l1228rge"] | ||
| 225 | mspm0l1228rgz = ["mspm0-metapac/mspm0l1228rgz"] | ||
| 226 | mspm0l1228rhb = ["mspm0-metapac/mspm0l1228rhb"] | ||
| 227 | mspm0l1303rge = ["mspm0-metapac/mspm0l1303rge"] | ||
| 228 | mspm0l1304dgs20 = ["mspm0-metapac/mspm0l1304dgs20"] | ||
| 229 | mspm0l1304dgs28 = ["mspm0-metapac/mspm0l1304dgs28"] | ||
| 230 | mspm0l1304dyy = ["mspm0-metapac/mspm0l1304dyy"] | ||
| 231 | mspm0l1304rge = ["mspm0-metapac/mspm0l1304rge"] | ||
| 232 | mspm0l1304rhb = ["mspm0-metapac/mspm0l1304rhb"] | ||
| 233 | mspm0l1304rtr = ["mspm0-metapac/mspm0l1304rtr"] | ||
| 234 | mspm0l1305dgs20 = ["mspm0-metapac/mspm0l1305dgs20"] | ||
| 235 | mspm0l1305dgs28 = ["mspm0-metapac/mspm0l1305dgs28"] | ||
| 236 | mspm0l1305dyy = ["mspm0-metapac/mspm0l1305dyy"] | ||
| 237 | mspm0l1305rge = ["mspm0-metapac/mspm0l1305rge"] | ||
| 238 | mspm0l1305rtr = ["mspm0-metapac/mspm0l1305rtr"] | ||
| 239 | mspm0l1306dgs20 = ["mspm0-metapac/mspm0l1306dgs20"] | ||
| 240 | mspm0l1306dgs28 = ["mspm0-metapac/mspm0l1306dgs28"] | ||
| 241 | mspm0l1306dyy = ["mspm0-metapac/mspm0l1306dyy"] | ||
| 242 | mspm0l1306rge = ["mspm0-metapac/mspm0l1306rge"] | ||
| 243 | mspm0l1306rhb = ["mspm0-metapac/mspm0l1306rhb"] | ||
| 244 | mspm0l1343dgs20 = ["mspm0-metapac/mspm0l1343dgs20"] | ||
| 245 | mspm0l1344dgs20 = ["mspm0-metapac/mspm0l1344dgs20"] | ||
| 246 | mspm0l1345dgs28 = ["mspm0-metapac/mspm0l1345dgs28"] | ||
| 247 | mspm0l1346dgs28 = ["mspm0-metapac/mspm0l1346dgs28"] | ||
| 248 | mspm0l2227pm = ["mspm0-metapac/mspm0l2227pm"] | ||
| 249 | mspm0l2227pn = ["mspm0-metapac/mspm0l2227pn"] | ||
| 250 | mspm0l2227pt = ["mspm0-metapac/mspm0l2227pt"] | ||
| 251 | mspm0l2227rgz = ["mspm0-metapac/mspm0l2227rgz"] | ||
| 252 | mspm0l2228pm = ["mspm0-metapac/mspm0l2228pm"] | ||
| 253 | mspm0l2228pn = ["mspm0-metapac/mspm0l2228pn"] | ||
| 254 | mspm0l2228pt = ["mspm0-metapac/mspm0l2228pt"] | ||
| 255 | mspm0l2228rgz = ["mspm0-metapac/mspm0l2228rgz"] | ||
| 256 | msps003f3pw20 = ["mspm0-metapac/msps003f3pw20"] | ||
| 257 | msps003f4pw20 = ["mspm0-metapac/msps003f4pw20"] | ||
diff --git a/embassy-mspm0/README.md b/embassy-mspm0/README.md new file mode 100644 index 000000000..b2b8934aa --- /dev/null +++ b/embassy-mspm0/README.md | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | # Embassy MSPM0 HAL | ||
| 2 | |||
| 3 | The embassy-mspm0 HAL aims to provide a safe, idiomatic hardware abstraction layer for all MSPM0 and MSPS003 chips. | ||
| 4 | |||
| 5 | * [Documentation](https://docs.embassy.dev/embassy-mspm0/) (**Important:** use docs.embassy.dev rather than docs.rs to see the specific docs for the chip you’re using!) | ||
| 6 | * [Source](https://github.com/embassy-rs/embassy/tree/main/embassy-mspm0) | ||
| 7 | * [Examples](https://github.com/embassy-rs/embassy/tree/main/examples) | ||
| 8 | |||
| 9 | ## Embedded-hal | ||
| 10 | |||
| 11 | The `embassy-mspm0` HAL implements the traits from [embedded-hal](https://crates.io/crates/embedded-hal) (1.0) and [embedded-hal-async](https://crates.io/crates/embedded-hal-async), as well as [embedded-io](https://crates.io/crates/embedded-io) and [embedded-io-async](https://crates.io/crates/embedded-io-async). | ||
| 12 | |||
| 13 | ## A note on feature flag names | ||
| 14 | |||
| 15 | Feature flag names for chips do not include temperature rating or distribution format. | ||
| 16 | |||
| 17 | Usually chapter 10 of your device's datasheet will explain the device nomenclature and how to decode it. Feature names in embassy-mspm0 only use the following from device nomenclature: | ||
| 18 | - MCU platform | ||
| 19 | - Product family | ||
| 20 | - Device subfamily | ||
| 21 | - Flash memory | ||
| 22 | - Package type | ||
| 23 | |||
| 24 | This means for a part such as `MSPM0G3507SPMR`, the feature name is `mspm0g3507pm`. This also means that `MSPM0G3507QPMRQ1` uses the feature `mspm0g3507pm`, since the Q1 parts are just qualified variants of the base G3507 with a PM (QFP-64) package. | ||
| 25 | |||
| 26 | ## Interoperability | ||
| 27 | |||
| 28 | This crate can run on any executor. | ||
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 | ||
diff --git a/embassy-mspm0/src/gpio.rs b/embassy-mspm0/src/gpio.rs index 3f895d962..3c824b0e6 100644 --- a/embassy-mspm0/src/gpio.rs +++ b/embassy-mspm0/src/gpio.rs | |||
| @@ -10,7 +10,7 @@ use embassy_sync::waitqueue::AtomicWaker; | |||
| 10 | 10 | ||
| 11 | use crate::pac::gpio::vals::*; | 11 | use crate::pac::gpio::vals::*; |
| 12 | use crate::pac::gpio::{self}; | 12 | use crate::pac::gpio::{self}; |
| 13 | #[cfg(all(feature = "rt", feature = "mspm0c110x"))] | 13 | #[cfg(all(feature = "rt", mspm0c110x))] |
| 14 | use crate::pac::interrupt; | 14 | use crate::pac::interrupt; |
| 15 | use crate::pac::{self}; | 15 | use crate::pac::{self}; |
| 16 | 16 | ||
| @@ -1120,7 +1120,7 @@ impl Iterator for BitIter { | |||
| 1120 | } | 1120 | } |
| 1121 | 1121 | ||
| 1122 | // C110x has a dedicated interrupt just for GPIOA, as it does not have a GROUP1 interrupt. | 1122 | // C110x has a dedicated interrupt just for GPIOA, as it does not have a GROUP1 interrupt. |
| 1123 | #[cfg(all(feature = "rt", feature = "mspm0c110x"))] | 1123 | #[cfg(all(feature = "rt", mspm0c110x))] |
| 1124 | #[interrupt] | 1124 | #[interrupt] |
| 1125 | fn GPIOA() { | 1125 | fn GPIOA() { |
| 1126 | gpioa_interrupt(); | 1126 | gpioa_interrupt(); |
diff --git a/embassy-mspm0/src/int_group/g150x.rs b/embassy-mspm0/src/int_group/g150x.rs new file mode 100644 index 000000000..706ba2078 --- /dev/null +++ b/embassy-mspm0/src/int_group/g150x.rs | |||
| @@ -0,0 +1,51 @@ | |||
| 1 | use crate::pac; | ||
| 2 | use crate::pac::interrupt; | ||
| 3 | |||
| 4 | #[cfg(feature = "rt")] | ||
| 5 | #[interrupt] | ||
| 6 | fn GROUP0() { | ||
| 7 | use mspm0_metapac::Group0; | ||
| 8 | |||
| 9 | let group = pac::CPUSS.int_group(0); | ||
| 10 | |||
| 11 | // Must subtract by 1 since NO_INTR is value 0 | ||
| 12 | let iidx = group.iidx().read().stat().to_bits() - 1; | ||
| 13 | |||
| 14 | let Ok(group) = pac::Group0::try_from(iidx as u8) else { | ||
| 15 | debug!("Invalid IIDX for group 0: {}", iidx); | ||
| 16 | return; | ||
| 17 | }; | ||
| 18 | |||
| 19 | match group { | ||
| 20 | Group0::WWDT0 => todo!("implement WWDT0"), | ||
| 21 | Group0::WWDT1 => todo!("implement WWDT1"), | ||
| 22 | Group0::DEBUGSS => todo!("implement DEBUGSS"), | ||
| 23 | Group0::FLASHCTL => todo!("implement FLASHCTL"), | ||
| 24 | Group0::SYSCTL => todo!("implement SYSCTL"), | ||
| 25 | } | ||
| 26 | } | ||
| 27 | |||
| 28 | #[cfg(feature = "rt")] | ||
| 29 | #[interrupt] | ||
| 30 | fn GROUP1() { | ||
| 31 | use mspm0_metapac::Group1; | ||
| 32 | |||
| 33 | let group = pac::CPUSS.int_group(1); | ||
| 34 | |||
| 35 | // Must subtract by 1 since NO_INTR is value 0 | ||
| 36 | let iidx = group.iidx().read().stat().to_bits() - 1; | ||
| 37 | |||
| 38 | let Ok(group) = pac::Group1::try_from(iidx as u8) else { | ||
| 39 | debug!("Invalid IIDX for group 1: {}", iidx); | ||
| 40 | return; | ||
| 41 | }; | ||
| 42 | |||
| 43 | match group { | ||
| 44 | Group1::GPIOA => crate::gpio::gpioa_interrupt(), | ||
| 45 | Group1::GPIOB => crate::gpio::gpiob_interrupt(), | ||
| 46 | Group1::COMP0 => todo!("implement COMP0"), | ||
| 47 | Group1::COMP1 => todo!("implement COMP1"), | ||
| 48 | Group1::COMP2 => todo!("implement COMP2"), | ||
| 49 | Group1::TRNG => todo!("implement TRNG"), | ||
| 50 | } | ||
| 51 | } | ||
diff --git a/embassy-mspm0/src/lib.rs b/embassy-mspm0/src/lib.rs index e8f5971d5..df2d83cc0 100644 --- a/embassy-mspm0/src/lib.rs +++ b/embassy-mspm0/src/lib.rs | |||
| @@ -1,6 +1,11 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | // Doc feature labels can be tested locally by running RUSTDOCFLAGS="--cfg=docsrs" cargo +nightly doc | 2 | // Doc feature labels can be tested locally by running RUSTDOCFLAGS="--cfg=docsrs" cargo +nightly doc |
| 3 | #![cfg_attr(docsrs, feature(doc_auto_cfg, doc_cfg_hide), doc(cfg_hide(doc, docsrs)))] | 3 | #![cfg_attr(docsrs, feature(doc_auto_cfg, doc_cfg_hide), doc(cfg_hide(doc, docsrs)))] |
| 4 | #![cfg_attr( | ||
| 5 | docsrs, | ||
| 6 | doc = "<div style='padding:30px;background:#810;color:#fff;text-align:center;'><p>You might want to <a href='https://docs.embassy.dev/embassy-mspm0'>browse the `embassy-mspm0` documentation on the Embassy website</a> instead.</p><p>The documentation here on `docs.rs` is built for a single chip only, while on the Embassy website you can pick your exact chip from the top menu. Available peripherals and their APIs change depending on the chip.</p></div>\n\n" | ||
| 7 | )] | ||
| 8 | #![doc = include_str!("../README.md")] | ||
| 4 | 9 | ||
| 5 | // This mod MUST go first, so that the others see its macros. | 10 | // This mod MUST go first, so that the others see its macros. |
| 6 | pub(crate) mod fmt; | 11 | pub(crate) mod fmt; |
| @@ -35,11 +40,11 @@ pub mod mode { | |||
| 35 | mod time_driver; | 40 | mod time_driver; |
| 36 | 41 | ||
| 37 | // Interrupt group handlers. | 42 | // Interrupt group handlers. |
| 38 | #[cfg_attr(feature = "mspm0c110x", path = "int_group/c110x.rs")] | 43 | #[cfg_attr(mspm0c110x, path = "int_group/c110x.rs")] |
| 39 | #[cfg_attr(feature = "mspm0g350x", path = "int_group/g350x.rs")] | 44 | #[cfg_attr(mspm0g350x, path = "int_group/g350x.rs")] |
| 40 | #[cfg_attr(feature = "mspm0g351x", path = "int_group/g351x.rs")] | 45 | #[cfg_attr(mspm0g351x, path = "int_group/g351x.rs")] |
| 41 | #[cfg_attr(feature = "mspm0l130x", path = "int_group/l130x.rs")] | 46 | #[cfg_attr(mspm0l130x, path = "int_group/l130x.rs")] |
| 42 | #[cfg_attr(feature = "mspm0l222x", path = "int_group/l222x.rs")] | 47 | #[cfg_attr(mspm0l222x, path = "int_group/l222x.rs")] |
| 43 | mod int_group; | 48 | mod int_group; |
| 44 | 49 | ||
| 45 | pub(crate) mod _generated { | 50 | pub(crate) mod _generated { |
| @@ -109,7 +114,7 @@ pub fn init(_config: Config) -> Peripherals { | |||
| 109 | 114 | ||
| 110 | _generated::enable_group_interrupts(cs); | 115 | _generated::enable_group_interrupts(cs); |
| 111 | 116 | ||
| 112 | #[cfg(feature = "mspm0c110x")] | 117 | #[cfg(mspm0c110x)] |
| 113 | unsafe { | 118 | unsafe { |
| 114 | use crate::_generated::interrupt::typelevel::Interrupt; | 119 | use crate::_generated::interrupt::typelevel::Interrupt; |
| 115 | crate::interrupt::typelevel::GPIOA::enable(); | 120 | crate::interrupt::typelevel::GPIOA::enable(); |
