2017-12-13 13:53:28 +00:00
|
|
|
extern crate avr_mcu;
|
|
|
|
|
2017-12-13 13:57:45 +00:00
|
|
|
mod gen;
|
|
|
|
|
2017-12-13 13:53:28 +00:00
|
|
|
use avr_mcu::*;
|
|
|
|
use std::fs::{self, File};
|
|
|
|
use std::io;
|
|
|
|
use std::io::prelude::*;
|
|
|
|
use std::path::{Path, PathBuf};
|
|
|
|
|
2018-11-05 09:23:57 +00:00
|
|
|
/// The MCU that will be assumed when running 'cargo doc' targeting
|
|
|
|
/// archicectures that are not AVR.
|
|
|
|
const DEFAULT_MCU_FOR_NON_AVR_DOCS: &'static str = "atmega328";
|
|
|
|
|
2017-12-13 13:53:28 +00:00
|
|
|
fn src_path() -> PathBuf {
|
|
|
|
Path::new(env!("CARGO_MANIFEST_DIR")).join("src")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn cores_path() -> PathBuf {
|
|
|
|
src_path().join("cores")
|
|
|
|
}
|
|
|
|
|
|
|
|
fn core_module_name(mcu: &Mcu) -> String {
|
|
|
|
mcu.device.name.to_lowercase().to_owned()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
if !cores_path().exists() {
|
|
|
|
fs::create_dir_all(&cores_path()).expect("could not create cores directory");
|
|
|
|
}
|
|
|
|
|
2018-11-05 09:23:57 +00:00
|
|
|
let current_mcu = if cfg!(arch = "avr") {
|
|
|
|
avr_mcu::current::mcu()
|
|
|
|
.expect("no target cpu specified")
|
|
|
|
} else {
|
|
|
|
avr_mcu::microcontroller(DEFAULT_MCU_FOR_NON_AVR_DOCS)
|
|
|
|
};
|
|
|
|
|
2017-12-13 13:53:28 +00:00
|
|
|
generate_config_module().unwrap();
|
|
|
|
generate_cores(&[current_mcu]).unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
fn generate_cores(mcus: &[Mcu]) -> Result<(), io::Error> {
|
|
|
|
for mcu in mcus {
|
|
|
|
generate_core_module(mcu).expect("failed to generate mcu core");
|
|
|
|
}
|
|
|
|
generate_cores_mod_rs(mcus)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn generate_config_module() -> Result<(), io::Error> {
|
|
|
|
let path = src_path().join("config.rs");
|
|
|
|
let mut f = File::create(&path)?;
|
|
|
|
|
2018-11-05 07:16:51 +00:00
|
|
|
let clock = env!("AVR_CPU_FREQUENCY_HZ");
|
2018-11-05 10:05:34 +00:00
|
|
|
writeln!(f, "/// The clock frequency of device being targeted in Hertz.")?;
|
2018-11-05 07:16:51 +00:00
|
|
|
writeln!(f, "pub const CPU_FREQUENCY_HZ: u32 = {};", clock)?;
|
2017-12-13 13:53:28 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn generate_core_module(mcu: &Mcu) -> Result<(), io::Error> {
|
|
|
|
let path = cores_path().join(format!("{}.rs", core_module_name(mcu)));
|
|
|
|
let mut file = File::create(&path)?;
|
|
|
|
write_core_module(mcu, &mut file)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn generate_cores_mod_rs(mcus: &[Mcu]) -> Result<(), io::Error> {
|
|
|
|
let path = cores_path().join("mod.rs");
|
|
|
|
let mut w = File::create(&path)?;
|
|
|
|
|
|
|
|
writeln!(w)?;
|
|
|
|
for mcu in mcus {
|
|
|
|
let module_name = core_module_name(mcu);
|
|
|
|
writeln!(w, "/// The {}.", mcu.device.name)?;
|
|
|
|
writeln!(w, "pub mod {};", module_name)?;
|
|
|
|
|
|
|
|
writeln!(w, "#[cfg(all(target_arch = \"avr\", target_cpu = \"{}\"))]", module_name)?;
|
|
|
|
writeln!(w, "pub use self::{} as current;", module_name)?;
|
|
|
|
}
|
|
|
|
writeln!(w)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn write_core_module(mcu: &Mcu, w: &mut Write) -> Result<(), io::Error> {
|
|
|
|
writeln!(w, "//! Core for {}.", mcu.device.name)?;
|
|
|
|
writeln!(w)?;
|
2018-11-05 10:05:34 +00:00
|
|
|
writeln!(w, "use {{RegisterBits, Register}};")?;
|
2017-12-13 13:53:28 +00:00
|
|
|
writeln!(w, "use modules;")?;
|
|
|
|
writeln!(w)?;
|
|
|
|
|
|
|
|
gen::write_registers(mcu, w)?;
|
|
|
|
gen::write_pins(mcu, w)?;
|
|
|
|
gen::write_spi_modules(mcu, w)?;
|
|
|
|
gen::write_usarts(mcu, w)?;
|
|
|
|
gen::write_timers(mcu, w)?;
|
|
|
|
|
|
|
|
writeln!(w)
|
|
|
|
}
|
|
|
|
|