diff options
| -rw-r--r-- | stm32-metapac-gen/src/data.rs | 105 | ||||
| -rw-r--r-- | stm32-metapac-gen/src/lib.rs | 105 |
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 @@ | |||
| 1 | use serde::Deserialize; | ||
| 2 | use std::collections::{BTreeMap, HashMap}; | ||
| 3 | |||
| 4 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 5 | pub 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)] | ||
| 16 | pub struct Memory { | ||
| 17 | pub bytes: u32, | ||
| 18 | pub regions: HashMap<String, MemoryRegion>, | ||
| 19 | } | ||
| 20 | |||
| 21 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 22 | pub struct MemoryRegion { | ||
| 23 | pub base: u32, | ||
| 24 | pub bytes: Option<u32>, | ||
| 25 | } | ||
| 26 | |||
| 27 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 28 | pub 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)] | ||
| 36 | pub struct Package { | ||
| 37 | pub name: String, | ||
| 38 | pub package: String, | ||
| 39 | } | ||
| 40 | |||
| 41 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 42 | pub 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)] | ||
| 59 | pub struct Pin { | ||
| 60 | pub pin: String, | ||
| 61 | pub signal: String, | ||
| 62 | pub af: Option<String>, | ||
| 63 | } | ||
| 64 | |||
| 65 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 66 | pub 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)] | ||
| 74 | pub struct PeripheralDmaChannel { | ||
| 75 | pub channel: Option<String>, | ||
| 76 | pub dmamux: Option<String>, | ||
| 77 | pub request: Option<u32>, | ||
| 78 | } | ||
| 79 | |||
| 80 | pub 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 | |||
| 89 | impl 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 @@ | |||
| 1 | use chiptool::generate::CommonModule; | 1 | use chiptool::generate::CommonModule; |
| 2 | use chiptool::ir::IR; | 2 | use chiptool::ir::IR; |
| 3 | use regex::Regex; | 3 | use regex::Regex; |
| 4 | use serde::Deserialize; | ||
| 5 | use std::collections::{BTreeMap, HashMap, HashSet}; | 4 | use std::collections::{BTreeMap, HashMap, HashSet}; |
| 6 | use std::env; | 5 | use std::env; |
| 7 | use std::fmt::Write as _; | 6 | use std::fmt::Write as _; |
| @@ -14,108 +13,8 @@ use std::path::PathBuf; | |||
| 14 | use chiptool::util::ToSanitizedSnakeCase; | 13 | use chiptool::util::ToSanitizedSnakeCase; |
| 15 | use chiptool::{generate, ir, transform}; | 14 | use chiptool::{generate, ir, transform}; |
| 16 | 15 | ||
| 17 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | 16 | mod data; |
| 18 | pub struct Chip { | 17 | use 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)] | ||
| 29 | pub struct Memory { | ||
| 30 | pub bytes: u32, | ||
| 31 | pub regions: HashMap<String, MemoryRegion>, | ||
| 32 | } | ||
| 33 | |||
| 34 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 35 | pub struct MemoryRegion { | ||
| 36 | pub base: u32, | ||
| 37 | pub bytes: Option<u32>, | ||
| 38 | } | ||
| 39 | |||
| 40 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 41 | pub 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)] | ||
| 49 | pub struct Package { | ||
| 50 | pub name: String, | ||
| 51 | pub package: String, | ||
| 52 | } | ||
| 53 | |||
| 54 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 55 | pub 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)] | ||
| 72 | pub struct Pin { | ||
| 73 | pub pin: String, | ||
| 74 | pub signal: String, | ||
| 75 | pub af: Option<String>, | ||
| 76 | } | ||
| 77 | |||
| 78 | #[derive(Debug, Eq, PartialEq, Clone, Deserialize)] | ||
| 79 | pub 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)] | ||
| 87 | pub struct PeripheralDmaChannel { | ||
| 88 | pub channel: Option<String>, | ||
| 89 | pub dmamux: Option<String>, | ||
| 90 | pub request: Option<u32>, | ||
| 91 | } | ||
| 92 | |||
| 93 | struct 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 | |||
| 102 | impl 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 | ||
| 120 | fn find_reg<'c>(rcc: &'c ir::IR, reg_regex: &str, field_name: &str) -> Option<(&'c str, &'c str)> { | 19 | fn 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(); |
