Add `boot` command to opentitantool
- Add a `boot` command, which sets pin strapping to the `RUN` config,
and toggles reset. This is intended to work around Nexus having
pull-ups on the bootstrap lines, which means someone needs to drive
the SW_STRAP pins low during reset for a "normal" boot.
Change-Id: I97b6a3df1b43713328e22c2520de17bd212d77e7
diff --git a/sw/host/opentitanlib/src/app/config/nexus.json b/sw/host/opentitanlib/src/app/config/nexus.json
index e34a640..70235c7 100644
--- a/sw/host/opentitanlib/src/app/config/nexus.json
+++ b/sw/host/opentitanlib/src/app/config/nexus.json
@@ -53,6 +53,27 @@
"level": false
}
]
+ },
+ {
+ "name": "RUN",
+ "pins": [
+ {
+ "name": "RESET",
+ "level": true
+ },
+ {
+ "name": "SW_STRAP0",
+ "level": false
+ },
+ {
+ "name": "SW_STRAP1",
+ "level": false
+ },
+ {
+ "name": "SW_STRAP2",
+ "level": false
+ }
+ ]
}
],
"spi": [
diff --git a/sw/host/opentitantool/BUILD b/sw/host/opentitantool/BUILD
index 599f1e2..d0918ae 100644
--- a/sw/host/opentitantool/BUILD
+++ b/sw/host/opentitantool/BUILD
@@ -10,6 +10,7 @@
rust_binary(
name = "opentitantool",
srcs = [
+ "src/command/boot.rs",
"src/command/bootstrap.rs",
"src/command/clear_bitstream.rs",
"src/command/console.rs",
diff --git a/sw/host/opentitantool/src/command/boot.rs b/sw/host/opentitantool/src/command/boot.rs
new file mode 100644
index 0000000..d26879d
--- /dev/null
+++ b/sw/host/opentitantool/src/command/boot.rs
@@ -0,0 +1,34 @@
+// 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::time::Duration;
+use structopt::StructOpt;
+
+use opentitanlib::app::TransportWrapper;
+use opentitanlib::app::command::CommandDispatch;
+
+/// Boot the target device.
+#[derive(Debug, StructOpt)]
+pub struct BootCommand {
+}
+
+impl CommandDispatch for BootCommand {
+ fn run(
+ &self,
+ _context: &dyn Any,
+ transport: &TransportWrapper,
+ ) -> Result<Option<Box<dyn Annotate>>> {
+ let reset_pin = transport.gpio_pin("RESET")?;
+ transport.apply_pin_strapping("RUN")?;
+ // Active-low RESET
+ reset_pin.write(true)?;
+ reset_pin.write(false)?;
+ reset_pin.write(true)?;
+ std::thread::sleep(Duration::from_millis(1000));
+ Ok(None)
+ }
+}
diff --git a/sw/host/opentitantool/src/command/mod.rs b/sw/host/opentitantool/src/command/mod.rs
index 3e8c715..2f88e7f 100644
--- a/sw/host/opentitantool/src/command/mod.rs
+++ b/sw/host/opentitantool/src/command/mod.rs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
+pub mod boot;
pub mod bootstrap;
pub mod clear_bitstream;
pub mod console;
diff --git a/sw/host/opentitantool/src/main.rs b/sw/host/opentitantool/src/main.rs
index 4515a83..4c2f1f6 100644
--- a/sw/host/opentitantool/src/main.rs
+++ b/sw/host/opentitantool/src/main.rs
@@ -25,6 +25,7 @@
#[allow(clippy::large_enum_variant)]
#[derive(Debug, StructOpt, CommandDispatch)]
enum RootCommandHierarchy {
+ Boot(command::boot::BootCommand),
// Not flattened because `Bootstrap` is a leaf command.
Bootstrap(command::bootstrap::BootstrapCommand),
// Not flattened because `Console` is a leaf command.