Merge pull request #325 from embassy-rs/update-chiptool
Update chiptool
This commit is contained in:
commit
1457ade49b
@ -6,7 +6,7 @@ edition = "2018"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
regex = "1.4.6"
|
regex = "1.4.6"
|
||||||
chiptool = { git = "https://github.com/embassy-rs/chiptool", rev = "e0c5ff926ecd86e390bd9bc68b414bfc0e811b0e" }
|
chiptool = { git = "https://github.com/embassy-rs/chiptool", rev = "31c3c09197d63d29eddbf4c70d6158edac0ac5d3" }
|
||||||
serde = { version = "1.0.123", features = [ "derive" ]}
|
serde = { version = "1.0.123", features = [ "derive" ]}
|
||||||
serde_yaml = "0.8.15"
|
serde_yaml = "0.8.15"
|
||||||
syn = { version = "1.0", features = ["full","extra-traits"] }
|
proc-macro2 = "1.0"
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use chiptool::generate::CommonModule;
|
||||||
|
use proc_macro2::TokenStream;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
@ -8,9 +10,10 @@ use std::fs::File;
|
|||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use chiptool::{generate, ir, transform};
|
|
||||||
use chiptool::util::ToSanitizedSnakeCase;
|
use chiptool::util::ToSanitizedSnakeCase;
|
||||||
|
use chiptool::{generate, ir, transform};
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
|
#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
|
||||||
pub struct Chip {
|
pub struct Chip {
|
||||||
@ -39,7 +42,7 @@ pub struct Package {
|
|||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
|
#[derive(Debug, Eq, PartialEq, Clone, Deserialize)]
|
||||||
pub struct Peripheral {
|
pub struct Peripheral {
|
||||||
pub address: u32,
|
pub address: u64,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub kind: Option<String>,
|
pub kind: Option<String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -194,7 +197,7 @@ pub struct Options {
|
|||||||
|
|
||||||
pub fn gen(options: Options) {
|
pub fn gen(options: Options) {
|
||||||
let generate_opts = generate::Options {
|
let generate_opts = generate::Options {
|
||||||
common_path: syn::parse_str("crate::common").unwrap(),
|
common_module: CommonModule::Builtin,
|
||||||
};
|
};
|
||||||
|
|
||||||
let out_dir = options.out_dir;
|
let out_dir = options.out_dir;
|
||||||
@ -292,18 +295,18 @@ pub fn gen(options: Options) {
|
|||||||
let mut gpio_rcc_table: Vec<Vec<String>> = Vec::new();
|
let mut gpio_rcc_table: Vec<Vec<String>> = Vec::new();
|
||||||
let mut gpio_regs: HashSet<String> = HashSet::new();
|
let mut gpio_regs: HashSet<String> = HashSet::new();
|
||||||
|
|
||||||
let gpio_base = core.peripherals.get(&"GPIOA".to_string()).unwrap().address;
|
let gpio_base = core.peripherals.get(&"GPIOA".to_string()).unwrap().address as u32;
|
||||||
let gpio_stride = 0x400;
|
let gpio_stride = 0x400;
|
||||||
|
|
||||||
let number_suffix_re = Regex::new("^(.*?)[0-9]*$").unwrap();
|
let number_suffix_re = Regex::new("^(.*?)[0-9]*$").unwrap();
|
||||||
|
|
||||||
if let Some(ref mut reg) = dbgmcu {
|
if let Some(ref mut reg) = dbgmcu {
|
||||||
if let Some(ref cr) = reg.fieldsets.get("CR") {
|
if let Some(ref cr) = reg.fieldsets.get("CR") {
|
||||||
for field in cr.fields.iter().filter(|e| e.name.contains("DBG")) {
|
for field in cr.fields.iter().filter(|e| e.name.contains("DBG")) {
|
||||||
let mut fn_name = String::new();
|
let mut fn_name = String::new();
|
||||||
fn_name.push_str("set_");
|
fn_name.push_str("set_");
|
||||||
fn_name.push_str( &field.name.to_sanitized_snake_case() );
|
fn_name.push_str(&field.name.to_sanitized_snake_case());
|
||||||
dbgmcu_table.push( vec!( "cr".into(), fn_name ));
|
dbgmcu_table.push(vec!["cr".into(), fn_name]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -399,7 +402,7 @@ pub fn gen(options: Options) {
|
|||||||
"gpio" => {
|
"gpio" => {
|
||||||
let port_letter = name.chars().skip(4).next().unwrap();
|
let port_letter = name.chars().skip(4).next().unwrap();
|
||||||
let port_num = port_letter as u32 - 'A' as u32;
|
let port_num = port_letter as u32 - 'A' as u32;
|
||||||
assert_eq!(p.address, gpio_base + gpio_stride * port_num);
|
assert_eq!(p.address as u32, gpio_base + gpio_stride * port_num);
|
||||||
|
|
||||||
for pin_num in 0..16 {
|
for pin_num in 0..16 {
|
||||||
let pin_name = format!("P{}{}", port_letter, pin_num);
|
let pin_name = format!("P{}{}", port_letter, pin_num);
|
||||||
@ -477,26 +480,17 @@ pub fn gen(options: Options) {
|
|||||||
|
|
||||||
if let Some((reset_reg, reset_field)) = reset_reg_field {
|
if let Some((reset_reg, reset_field)) = reset_reg_field {
|
||||||
row.push(reset_reg.to_ascii_lowercase());
|
row.push(reset_reg.to_ascii_lowercase());
|
||||||
row.push(format!(
|
row.push(format!("set_{}", enable_field.to_ascii_lowercase()));
|
||||||
"set_{}",
|
row.push(format!("set_{}", reset_field.to_ascii_lowercase()));
|
||||||
enable_field.to_ascii_lowercase()
|
|
||||||
));
|
|
||||||
row.push(format!(
|
|
||||||
"set_{}",
|
|
||||||
reset_field.to_ascii_lowercase()
|
|
||||||
));
|
|
||||||
} else {
|
} else {
|
||||||
row.push(format!(
|
row.push(format!("set_{}", enable_field.to_ascii_lowercase()));
|
||||||
"set_{}",
|
|
||||||
enable_field.to_ascii_lowercase()
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !name.starts_with("GPIO") {
|
if !name.starts_with("GPIO") {
|
||||||
peripheral_rcc_table.push(row);
|
peripheral_rcc_table.push(row);
|
||||||
} else {
|
} else {
|
||||||
gpio_rcc_table.push(row);
|
gpio_rcc_table.push(row);
|
||||||
gpio_regs.insert( enable_reg.to_ascii_lowercase() );
|
gpio_regs.insert(enable_reg.to_ascii_lowercase());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(None, Some(_)) => {
|
(None, Some(_)) => {
|
||||||
@ -514,7 +508,7 @@ pub fn gen(options: Options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for reg in gpio_regs {
|
for reg in gpio_regs {
|
||||||
gpio_rcc_table.push( vec!( reg ) );
|
gpio_rcc_table.push(vec![reg]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (id, channel_info) in &core.dma_channels {
|
for (id, channel_info) in &core.dma_channels {
|
||||||
@ -659,13 +653,12 @@ pub fn gen(options: Options) {
|
|||||||
.run(&mut ir)
|
.run(&mut ir)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
transform::map_names(&mut ir, |s, k| match k {
|
transform::map_names(&mut ir, |k, s| match k {
|
||||||
transform::NameKind::Block => format!("{}", s),
|
transform::NameKind::Block => *s = format!("{}", s),
|
||||||
transform::NameKind::Fieldset => format!("regs::{}", s),
|
transform::NameKind::Fieldset => *s = format!("regs::{}", s),
|
||||||
transform::NameKind::Enum => format!("vals::{}", s),
|
transform::NameKind::Enum => *s = format!("vals::{}", s),
|
||||||
_ => s.to_string(),
|
_ => {}
|
||||||
})
|
});
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
transform::sort::Sort {}.run(&mut ir).unwrap();
|
transform::sort::Sort {}.run(&mut ir).unwrap();
|
||||||
transform::Sanitize {}.run(&mut ir).unwrap();
|
transform::Sanitize {}.run(&mut ir).unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user