forked from M-Labs/artiq-zynq
config: refactor and share
This commit is contained in:
parent
e263814546
commit
6454315cd2
@ -290,8 +290,8 @@ async fn handle_connection(stream: &TcpStream, control: Rc<RefCell<kernel::Contr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main(timer: GlobalTimer) {
|
pub fn main(timer: GlobalTimer, cfg: &config::Config) {
|
||||||
let net_addresses = net_settings::get_adresses();
|
let net_addresses = net_settings::get_adresses(cfg);
|
||||||
info!("network addresses: {}", net_addresses);
|
info!("network addresses: {}", net_addresses);
|
||||||
|
|
||||||
let eth = zynq::eth::Eth::default(net_addresses.hardware_addr.0.clone());
|
let eth = zynq::eth::Eth::default(net_addresses.hardware_addr.0.clone());
|
||||||
@ -329,14 +329,10 @@ pub fn main(timer: GlobalTimer) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let startup_kernel: Option<Vec<u8>>;
|
|
||||||
let cfg = config::Config::new();
|
|
||||||
startup_kernel = cfg.as_ref().ok().and_then(|cfg| cfg.read("startup").ok());
|
|
||||||
|
|
||||||
Sockets::init(32);
|
Sockets::init(32);
|
||||||
|
|
||||||
let control: Rc<RefCell<kernel::Control>> = Rc::new(RefCell::new(kernel::Control::start()));
|
let control: Rc<RefCell<kernel::Control>> = Rc::new(RefCell::new(kernel::Control::start()));
|
||||||
if let Some(buffer) = startup_kernel {
|
if let Ok(buffer) = cfg.read("startup") {
|
||||||
info!("Loading startup kernel...");
|
info!("Loading startup kernel...");
|
||||||
if let Ok(()) = task::block_on(load_kernel(buffer, &control, None)) {
|
if let Ok(()) = task::block_on(load_kernel(buffer, &control, None)) {
|
||||||
info!("Starting startup kernel...");
|
info!("Starting startup kernel...");
|
||||||
|
@ -11,6 +11,7 @@ pub enum Error<'a> {
|
|||||||
IoError(io::Error),
|
IoError(io::Error),
|
||||||
Utf8Error(FromUtf8Error),
|
Utf8Error(FromUtf8Error),
|
||||||
KeyNotFoundError(&'a str),
|
KeyNotFoundError(&'a str),
|
||||||
|
NoConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Result<'a, T> = core::result::Result<T, Error<'a>>;
|
pub type Result<'a, T> = core::result::Result<T, Error<'a>>;
|
||||||
@ -22,6 +23,7 @@ impl<'a> fmt::Display for Error<'a> {
|
|||||||
Error::IoError(error) => write!(f, "I/O error: {}", error),
|
Error::IoError(error) => write!(f, "I/O error: {}", error),
|
||||||
Error::Utf8Error(error) => write!(f, "UTF-8 error: {}", error),
|
Error::Utf8Error(error) => write!(f, "UTF-8 error: {}", error),
|
||||||
Error::KeyNotFoundError(name) => write!(f, "Configuration key `{}` not found", name),
|
Error::KeyNotFoundError(name) => write!(f, "Configuration key `{}` not found", name),
|
||||||
|
Error::NoConfig => write!(f, "Configuration not present"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,7 +63,7 @@ fn parse_config<'a>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
fs: fatfs::FileSystem<sd_reader::SdReader>,
|
fs: Option<fatfs::FileSystem<sd_reader::SdReader>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
@ -74,20 +76,28 @@ impl Config {
|
|||||||
let reader = sd_reader::SdReader::new(sd);
|
let reader = sd_reader::SdReader::new(sd);
|
||||||
|
|
||||||
let fs = reader.mount_fatfs(sd_reader::PartitionEntry::Entry1)?;
|
let fs = reader.mount_fatfs(sd_reader::PartitionEntry::Entry1)?;
|
||||||
Ok(Config { fs })
|
Ok(Config { fs: Some(fs) })
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_dummy() -> Self {
|
||||||
|
Config { fs: None }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read<'b>(&self, key: &'b str) -> Result<'b, Vec<u8>> {
|
pub fn read<'b>(&self, key: &'b str) -> Result<'b, Vec<u8>> {
|
||||||
let root_dir = self.fs.root_dir();
|
if let Some(fs) = &self.fs {
|
||||||
let mut buffer: Vec<u8> = Vec::new();
|
let root_dir = fs.root_dir();
|
||||||
match root_dir.open_file(&["/CONFIG/", key, ".BIN"].concat()) {
|
let mut buffer: Vec<u8> = Vec::new();
|
||||||
Ok(mut f) => f.read_to_end(&mut buffer).map(|_| ())?,
|
match root_dir.open_file(&["/CONFIG/", key, ".BIN"].concat()) {
|
||||||
Err(_) => match root_dir.open_file("/CONFIG.TXT") {
|
Ok(mut f) => f.read_to_end(&mut buffer).map(|_| ())?,
|
||||||
Ok(f) => parse_config(key, &mut buffer, f)?,
|
Err(_) => match root_dir.open_file("/CONFIG.TXT") {
|
||||||
Err(_) => return Err(Error::KeyNotFoundError(key)),
|
Ok(f) => parse_config(key, &mut buffer, f)?,
|
||||||
},
|
Err(_) => return Err(Error::KeyNotFoundError(key)),
|
||||||
};
|
},
|
||||||
Ok(buffer)
|
};
|
||||||
|
Ok(buffer)
|
||||||
|
} else {
|
||||||
|
Err(Error::NoConfig)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn read_str<'b>(&self, key: &'b str) -> Result<'b, String> {
|
pub fn read_str<'b>(&self, key: &'b str) -> Result<'b, String> {
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
|
||||||
use core::{cmp, str};
|
use core::{cmp, str};
|
||||||
use log::info;
|
use log::{info, warn};
|
||||||
|
|
||||||
use libboard_zynq::{timer::GlobalTimer, logger, devc, slcr};
|
use libboard_zynq::{timer::GlobalTimer, logger, devc, slcr};
|
||||||
use libsupport_zynq::ram;
|
use libsupport_zynq::ram;
|
||||||
@ -93,5 +93,12 @@ pub fn main_core0() {
|
|||||||
pl::csr::rtio_core::reset_phy_write(1);
|
pl::csr::rtio_core::reset_phy_write(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
comms::main(timer);
|
let cfg = match config::Config::new() {
|
||||||
|
Ok(cfg) => cfg,
|
||||||
|
Err(err) => {
|
||||||
|
warn!("config initialization failed: {}", err);
|
||||||
|
config::Config::new_dummy()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
comms::main(timer, &cfg);
|
||||||
}
|
}
|
||||||
|
@ -23,21 +23,19 @@ impl fmt::Display for NetAddresses {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_adresses() -> NetAddresses {
|
pub fn get_adresses(cfg: &config::Config) -> NetAddresses {
|
||||||
let mut hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x52]);
|
let mut hardware_addr = EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x52]);
|
||||||
let mut ipv4_addr = IpAddress::v4(192, 168, 1, 52);
|
let mut ipv4_addr = IpAddress::v4(192, 168, 1, 52);
|
||||||
let mut ipv6_addr = None;
|
let mut ipv6_addr = None;
|
||||||
|
|
||||||
if let Ok(cfg) = config::Config::new() {
|
if let Ok(Ok(addr)) = cfg.read_str("mac").map(|s| s.parse()) {
|
||||||
if let Ok(Ok(addr)) = cfg.read_str("mac").map(|s| s.parse()) {
|
hardware_addr = addr;
|
||||||
hardware_addr = addr;
|
}
|
||||||
}
|
if let Ok(Ok(addr)) = cfg.read_str("ip").map(|s| s.parse()) {
|
||||||
if let Ok(Ok(addr)) = cfg.read_str("ip").map(|s| s.parse()) {
|
ipv4_addr = addr;
|
||||||
ipv4_addr = addr;
|
}
|
||||||
}
|
if let Ok(Ok(addr)) = cfg.read_str("ip6").map(|s| s.parse()) {
|
||||||
if let Ok(Ok(addr)) = cfg.read_str("ip6").map(|s| s.parse()) {
|
ipv6_addr = Some(addr);
|
||||||
ipv6_addr = Some(addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let ipv6_ll_addr = IpAddress::v6(
|
let ipv6_ll_addr = IpAddress::v6(
|
||||||
|
Loading…
Reference in New Issue
Block a user