aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stm32-metapac-gen/src/data.rs105
-rw-r--r--stm32-metapac-gen/src/lib.rs105
2 files changed, 107 insertions, 103 deletions
diff --git a/stm32-metapac-gen/src/data.rs b/stm32-metapac-gen/src/data.rs
new file mode 100644
index 000000000..deaf09d3e
--- /dev/null
+++ b/stm32-metapac-gen/src/data.rs
@@ -0,0 +1,105 @@
1use serde::Deserialize;
2use std::collections::{BTreeMap, HashMap};
3
4#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
5pub struct Chip {
6 pub name: String,
7 pub family: String,
8 pub line: String,
9 pub cores: Vec<Core>,
10 pub flash: Memory,
11 pub ram: Memory,
12 pub packages: Vec<Package>,
13}
14
15#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
16pub struct Memory {
17 pub bytes: u32,
18 pub regions: HashMap<String, MemoryRegion>,
19}
20
21#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
22pub struct MemoryRegion {
23 pub base: u32,
24 pub bytes: Option<u32>,
25}
26
27#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
28pub struct Core {
29 pub name: String,
30 pub peripherals: BTreeMap<String, Peripheral>,
31 pub interrupts: BTreeMap<String, u32>,
32 pub dma_channels: BTreeMap<String, DmaChannel>,
33}
34
35#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
36pub struct Package {
37 pub name: String,
38 pub package: String,
39}
40
41#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
42pub struct Peripheral {
43 pub address: u64,
44 #[serde(default)]
45 pub kind: Option<String>,
46 #[serde(default)]
47 pub block: Option<String>,
48 #[serde(default)]
49 pub clock: Option<String>,
50 #[serde(default)]
51 pub pins: Vec<Pin>,
52 #[serde(default)]
53 pub dma_channels: BTreeMap<String, Vec<PeripheralDmaChannel>>,
54 #[serde(default)]
55 pub interrupts: BTreeMap<String, String>,
56}
57
58#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
59pub struct Pin {
60 pub pin: String,
61 pub signal: String,
62 pub af: Option<String>,
63}
64
65#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
66pub struct DmaChannel {
67 pub dma: String,
68 pub channel: u32,
69 pub dmamux: Option<String>,
70 pub dmamux_channel: Option<u32>,
71}
72
73#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Hash)]
74pub struct PeripheralDmaChannel {
75 pub channel: Option<String>,
76 pub dmamux: Option<String>,
77 pub request: Option<u32>,
78}
79
80pub struct BlockInfo {
81 /// usart_v1/USART -> usart
82 pub module: String,
83 /// usart_v1/USART -> v1
84 pub version: String,
85 /// usart_v1/USART -> USART
86 pub block: String,
87}
88
89impl BlockInfo {
90 pub fn parse(s: &str) -> Self {
91 let mut s = s.split('/');
92 let module = s.next().unwrap();
93 let block = s.next().unwrap();
94 assert!(s.next().is_none());
95 let mut s = module.split('_');
96 let module = s.next().unwrap();
97 let version = s.next().unwrap();
98 assert!(s.next().is_none());
99 Self {
100 module: module.to_string(),
101 version: version.to_string(),
102 block: block.to_string(),
103 }
104 }
105}
diff --git a/stm32-metapac-gen/src/lib.rs b/stm32-metapac-gen/src/lib.rs
index 3480ac364..00268bb0e 100644
--- a/stm32-metapac-gen/src/lib.rs
+++ b/stm32-metapac-gen/src/lib.rs
@@ -1,7 +1,6 @@
1use chiptool::generate::CommonModule; 1use chiptool::generate::CommonModule;
2use chiptool::ir::IR; 2use chiptool::ir::IR;
3use regex::Regex; 3use regex::Regex;
4use serde::Deserialize;
5use std::collections::{BTreeMap, HashMap, HashSet}; 4use std::collections::{BTreeMap, HashMap, HashSet};
6use std::env; 5use std::env;
7use std::fmt::Write as _; 6use std::fmt::Write as _;
@@ -14,108 +13,8 @@ use std::path::PathBuf;
14use chiptool::util::ToSanitizedSnakeCase; 13use chiptool::util::ToSanitizedSnakeCase;
15use chiptool::{generate, ir, transform}; 14use chiptool::{generate, ir, transform};
16 15
17#[derive(Debug, Eq, PartialEq, Clone, Deserialize)] 16mod data;
18pub struct Chip { 17use data::*;
19 pub name: String,
20 pub family: String,
21 pub line: String,
22 pub cores: Vec<Core>,
23 pub flash: Memory,
24 pub ram: Memory,
25 pub packages: Vec<Package>,
26}
27
28#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
29pub struct Memory {
30 pub bytes: u32,
31 pub regions: HashMap<String, MemoryRegion>,
32}
33
34#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
35pub struct MemoryRegion {
36 pub base: u32,
37 pub bytes: Option<u32>,
38}
39
40#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
41pub struct Core {
42 pub name: String,
43 pub peripherals: BTreeMap<String, Peripheral>,
44 pub interrupts: BTreeMap<String, u32>,
45 pub dma_channels: BTreeMap<String, DmaChannel>,
46}
47
48#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
49pub struct Package {
50 pub name: String,
51 pub package: String,
52}
53
54#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
55pub struct Peripheral {
56 pub address: u64,
57 #[serde(default)]
58 pub kind: Option<String>,
59 #[serde(default)]
60 pub block: Option<String>,
61 #[serde(default)]
62 pub clock: Option<String>,
63 #[serde(default)]
64 pub pins: Vec<Pin>,
65 #[serde(default)]
66 pub dma_channels: BTreeMap<String, Vec<PeripheralDmaChannel>>,
67 #[serde(default)]
68 pub interrupts: BTreeMap<String, String>,
69}
70
71#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
72pub struct Pin {
73 pub pin: String,
74 pub signal: String,
75 pub af: Option<String>,
76}
77
78#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
79pub struct DmaChannel {
80 pub dma: String,
81 pub channel: u32,
82 pub dmamux: Option<String>,
83 pub dmamux_channel: Option<u32>,
84}
85
86#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Hash)]
87pub struct PeripheralDmaChannel {
88 pub channel: Option<String>,
89 pub dmamux: Option<String>,
90 pub request: Option<u32>,
91}
92
93struct BlockInfo {
94 /// usart_v1/USART -> usart
95 module: String,
96 /// usart_v1/USART -> v1
97 version: String,
98 /// usart_v1/USART -> USART
99 block: String,
100}
101
102impl BlockInfo {
103 fn parse(s: &str) -> Self {
104 let mut s = s.split("/");
105 let module = s.next().unwrap();
106 let block = s.next().unwrap();
107 assert!(s.next().is_none());
108 let mut s = module.split("_");
109 let module = s.next().unwrap();
110 let version = s.next().unwrap();
111 assert!(s.next().is_none());
112 Self {
113 module: module.to_string(),
114 version: version.to_string(),
115 block: block.to_string(),
116 }
117 }
118}
119 18
120fn find_reg<'c>(rcc: &'c ir::IR, reg_regex: &str, field_name: &str) -> Option<(&'c str, &'c str)> { 19fn find_reg<'c>(rcc: &'c ir::IR, reg_regex: &str, field_name: &str) -> Option<(&'c str, &'c str)> {
121 let reg_regex = Regex::new(reg_regex).unwrap(); 20 let reg_regex = Regex::new(reg_regex).unwrap();