blob: 1785ba3dad4e8f7f155b360448a39d5cae37cbb9 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
use anyhow::Result;
use serde_annotate::Annotate;
use std::any::Any;
use std::fs;
use std::path::PathBuf;
use structopt::StructOpt;
use opentitanlib::app::command::CommandDispatch;
use opentitanlib::app::TransportWrapper;
use opentitanlib::util::parse_int::ParseInt;
use opentitanlib::util::usr_access::{usr_access_crc32, usr_access_set};
/// Update the USR_ACCESS value of an FPGA bitstream with the current timestamp.
#[derive(Debug, StructOpt)]
pub struct UpdateUsrAccess {
#[structopt(name = "INPUT_FILE")]
input: PathBuf,
#[structopt(name = "OUTPUT_FILE")]
output: PathBuf,
#[structopt(long,
parse(try_from_str = u32::from_str),
help="New USR_ACCESS value, default = crc32")]
usr_access: Option<u32>,
}
impl CommandDispatch for UpdateUsrAccess {
fn run(
&self,
_context: &dyn Any,
_transport: &TransportWrapper,
) -> Result<Option<Box<dyn Annotate>>> {
let mut bs = fs::read(&self.input)?;
let usr_access_val = match self.usr_access {
None => usr_access_crc32(&mut bs)?,
Some(u) => u,
};
usr_access_set(&mut bs, usr_access_val)?;
fs::write(&self.output, bs)?;
Ok(None)
}
}