[chiplevel test] Test GPIOs on hyperdebug
Signed-off-by: Chris Frantz <cfrantz@google.com>
diff --git a/sw/device/tests/BUILD b/sw/device/tests/BUILD
index 4ec67c3..4f862df 100644
--- a/sw/device/tests/BUILD
+++ b/sw/device/tests/BUILD
@@ -1102,8 +1102,16 @@
opentitan_functest(
name = "gpio_pinmux_test",
srcs = ["gpio_pinmux_test.c"],
+ cw310 = cw310_params(
+ interface = "hyperdebug",
+ tags = ["manual"],
+ test_cmds = [
+ "--bootstrap=\"$(location {flash})\"",
+ ],
+ ),
targets = [
"verilator",
+ "cw310_test_rom",
],
test_harness = "//sw/host/tests/chip/gpio",
verilator = verilator_params(
diff --git a/sw/host/tests/chip/gpio/src/main.rs b/sw/host/tests/chip/gpio/src/main.rs
index d38922f..6b0a6c7 100644
--- a/sw/host/tests/chip/gpio/src/main.rs
+++ b/sw/host/tests/chip/gpio/src/main.rs
@@ -38,40 +38,116 @@
}
lazy_static! {
-static ref VERILATOR: Config = Config {
- input: collection! {
- PinmuxPeripheralIn::GpioGpio0 => PinmuxInsel::Iob6,
- PinmuxPeripheralIn::GpioGpio1 => PinmuxInsel::Iob7,
- PinmuxPeripheralIn::GpioGpio2 => PinmuxInsel::Iob8,
- PinmuxPeripheralIn::GpioGpio3 => PinmuxInsel::Iob9,
- PinmuxPeripheralIn::GpioGpio4 => PinmuxInsel::Iob10,
- PinmuxPeripheralIn::GpioGpio5 => PinmuxInsel::Iob11,
- PinmuxPeripheralIn::GpioGpio6 => PinmuxInsel::Iob12,
- PinmuxPeripheralIn::GpioGpio7 => PinmuxInsel::Ior5,
- PinmuxPeripheralIn::GpioGpio8 => PinmuxInsel::Ior6,
- PinmuxPeripheralIn::GpioGpio9 => PinmuxInsel::Ior7,
- // IOR8-9 aren't MIOs.
- PinmuxPeripheralIn::GpioGpio10 => PinmuxInsel::Ior10,
- PinmuxPeripheralIn::GpioGpio11 => PinmuxInsel::Ior11,
- PinmuxPeripheralIn::GpioGpio12 => PinmuxInsel::Ior12,
- PinmuxPeripheralIn::GpioGpio13 => PinmuxInsel::Ior13,
+static ref CONFIG: HashMap<&'static str, Config> = collection! {
+ "verilator" => Config {
+ input: collection! {
+ PinmuxPeripheralIn::GpioGpio0 => PinmuxInsel::Iob6,
+ PinmuxPeripheralIn::GpioGpio1 => PinmuxInsel::Iob7,
+ PinmuxPeripheralIn::GpioGpio2 => PinmuxInsel::Iob8,
+ PinmuxPeripheralIn::GpioGpio3 => PinmuxInsel::Iob9,
+ PinmuxPeripheralIn::GpioGpio4 => PinmuxInsel::Iob10,
+ PinmuxPeripheralIn::GpioGpio5 => PinmuxInsel::Iob11,
+ PinmuxPeripheralIn::GpioGpio6 => PinmuxInsel::Iob12,
+ PinmuxPeripheralIn::GpioGpio7 => PinmuxInsel::Ior5,
+ PinmuxPeripheralIn::GpioGpio8 => PinmuxInsel::Ior6,
+ PinmuxPeripheralIn::GpioGpio9 => PinmuxInsel::Ior7,
+ // IOR8-9 aren't MIOs.
+ PinmuxPeripheralIn::GpioGpio10 => PinmuxInsel::Ior10,
+ PinmuxPeripheralIn::GpioGpio11 => PinmuxInsel::Ior11,
+ PinmuxPeripheralIn::GpioGpio12 => PinmuxInsel::Ior12,
+ PinmuxPeripheralIn::GpioGpio13 => PinmuxInsel::Ior13,
+ },
+ output: collection! {
+ PinmuxMioOut::Iob6 => PinmuxOutsel::GpioGpio0,
+ PinmuxMioOut::Iob7 => PinmuxOutsel::GpioGpio1,
+ PinmuxMioOut::Iob8 => PinmuxOutsel::GpioGpio2,
+ PinmuxMioOut::Iob9 => PinmuxOutsel::GpioGpio3,
+ PinmuxMioOut::Iob10 => PinmuxOutsel::GpioGpio4,
+ PinmuxMioOut::Iob11 => PinmuxOutsel::GpioGpio5,
+ PinmuxMioOut::Iob12 => PinmuxOutsel::GpioGpio6,
+ PinmuxMioOut::Ior5 => PinmuxOutsel::GpioGpio7,
+ PinmuxMioOut::Ior6 => PinmuxOutsel::GpioGpio8,
+ PinmuxMioOut::Ior7 => PinmuxOutsel::GpioGpio9,
+ // IOR8-9 aren't MIOs.
+ PinmuxMioOut::Ior10 => PinmuxOutsel::GpioGpio10,
+ PinmuxMioOut::Ior11 => PinmuxOutsel::GpioGpio11,
+ PinmuxMioOut::Ior12 => PinmuxOutsel::GpioGpio12,
+ PinmuxMioOut::Ior13 => PinmuxOutsel::GpioGpio13,
+ },
},
- output: collection! {
- PinmuxMioOut::Iob6 => PinmuxOutsel::GpioGpio0,
- PinmuxMioOut::Iob7 => PinmuxOutsel::GpioGpio1,
- PinmuxMioOut::Iob8 => PinmuxOutsel::GpioGpio2,
- PinmuxMioOut::Iob9 => PinmuxOutsel::GpioGpio3,
- PinmuxMioOut::Iob10 => PinmuxOutsel::GpioGpio4,
- PinmuxMioOut::Iob11 => PinmuxOutsel::GpioGpio5,
- PinmuxMioOut::Iob12 => PinmuxOutsel::GpioGpio6,
- PinmuxMioOut::Ior5 => PinmuxOutsel::GpioGpio7,
- PinmuxMioOut::Ior6 => PinmuxOutsel::GpioGpio8,
- PinmuxMioOut::Ior7 => PinmuxOutsel::GpioGpio9,
- // IOR8-9 aren't MIOs.
- PinmuxMioOut::Ior10 => PinmuxOutsel::GpioGpio10,
- PinmuxMioOut::Ior11 => PinmuxOutsel::GpioGpio11,
- PinmuxMioOut::Ior12 => PinmuxOutsel::GpioGpio12,
- PinmuxMioOut::Ior13 => PinmuxOutsel::GpioGpio13,
+ "hyperdebug" => Config {
+ input: collection! {
+ // The commented lines represent multi-fuction pins. These will
+ // be added back in when the hyperdebug firmware can set these
+ // multifunction pins into GPIO mode.
+
+ //PinmuxPeripheralIn::GpioGpio0 => PinmuxInsel::Ioa0, // UART4
+ //PinmuxPeripheralIn::GpioGpio1 => PinmuxInsel::Ioa1, // UART4
+ PinmuxPeripheralIn::GpioGpio2 => PinmuxInsel::Ioa2,
+ PinmuxPeripheralIn::GpioGpio3 => PinmuxInsel::Ioa3,
+ //PinmuxPeripheralIn::GpioGpio4 => PinmuxInsel::Ioa4, // UART5
+ //PinmuxPeripheralIn::GpioGpio5 => PinmuxInsel::Ioa5, // UART5
+ PinmuxPeripheralIn::GpioGpio6 => PinmuxInsel::Ioa6,
+ //PinmuxPeripheralIn::GpioGpio7 => PinmuxInsel::Ioa7, // I2C1
+ //PinmuxPeripheralIn::GpioGpio8 => PinmuxInsel::Ioa8, // I2C1
+ //PinmuxPeripheralIn::GpioGpio9 => PinmuxInsel::Iob4, // UART3
+ //PinmuxPeripheralIn::GpioGpio10 => PinmuxInsel::Iob5, // UART3
+ PinmuxPeripheralIn::GpioGpio11 => PinmuxInsel::Iob6,
+
+ PinmuxPeripheralIn::GpioGpio12 => PinmuxInsel::Ioc0,
+ PinmuxPeripheralIn::GpioGpio13 => PinmuxInsel::Ioc1,
+ PinmuxPeripheralIn::GpioGpio14 => PinmuxInsel::Ioc2,
+
+ PinmuxPeripheralIn::GpioGpio15 => PinmuxInsel::Ioc5,
+ PinmuxPeripheralIn::GpioGpio16 => PinmuxInsel::Ioc6,
+ PinmuxPeripheralIn::GpioGpio17 => PinmuxInsel::Ioc10,
+ PinmuxPeripheralIn::GpioGpio18 => PinmuxInsel::Ioc11,
+ PinmuxPeripheralIn::GpioGpio19 => PinmuxInsel::Ioc12,
+
+ PinmuxPeripheralIn::GpioGpio20 => PinmuxInsel::Ior5,
+ PinmuxPeripheralIn::GpioGpio21 => PinmuxInsel::Ior6,
+ PinmuxPeripheralIn::GpioGpio22 => PinmuxInsel::Ior7,
+ // IOR8-9 aren't MIOs.
+ PinmuxPeripheralIn::GpioGpio25 => PinmuxInsel::Ior10,
+ PinmuxPeripheralIn::GpioGpio26 => PinmuxInsel::Ior11,
+ PinmuxPeripheralIn::GpioGpio27 => PinmuxInsel::Ior12,
+ PinmuxPeripheralIn::GpioGpio28 => PinmuxInsel::Ior13,
+
+ },
+ output: collection! {
+ // The commented lines represent multi-fuction pins. These will
+ // be added back in when the hyperdebug firmware can set these
+ // multifunction pins into GPIO mode.
+
+ //PinmuxMioOut::Ioa0 => PinmuxOutsel::GpioGpio0, // UART4
+ //PinmuxMioOut::Ioa1 => PinmuxOutsel::GpioGpio1, // UART4
+ PinmuxMioOut::Ioa2 => PinmuxOutsel::GpioGpio2,
+ PinmuxMioOut::Ioa3 => PinmuxOutsel::GpioGpio3,
+ //PinmuxMioOut::Ioa4 => PinmuxOutsel::GpioGpio4, // UART5
+ //PinmuxMioOut::Ioa5 => PinmuxOutsel::GpioGpio5, // UART5
+ PinmuxMioOut::Ioa6 => PinmuxOutsel::GpioGpio6,
+ //PinmuxMioOut::Ioa7 => PinmuxOutsel::GpioGpio7, // I2C1
+ //PinmuxMioOut::Ioa8 => PinmuxOutsel::GpioGpio8, // I2C1
+ //PinmuxMioOut::Iob4 => PinmuxOutsel::GpioGpio9, // UART3
+ //PinmuxMioOut::Iob5 => PinmuxOutsel::GpioGpio10, // UART3
+ PinmuxMioOut::Iob6 => PinmuxOutsel::GpioGpio11,
+ PinmuxMioOut::Ioc0 => PinmuxOutsel::GpioGpio12,
+ PinmuxMioOut::Ioc1 => PinmuxOutsel::GpioGpio13,
+ PinmuxMioOut::Ioc2 => PinmuxOutsel::GpioGpio14,
+ PinmuxMioOut::Ioc5 => PinmuxOutsel::GpioGpio15,
+ PinmuxMioOut::Ioc6 => PinmuxOutsel::GpioGpio16,
+ PinmuxMioOut::Ioc10 => PinmuxOutsel::GpioGpio17,
+ PinmuxMioOut::Ioc11 => PinmuxOutsel::GpioGpio18,
+ PinmuxMioOut::Ioc12 => PinmuxOutsel::GpioGpio19,
+ PinmuxMioOut::Ior5 => PinmuxOutsel::GpioGpio20,
+ PinmuxMioOut::Ior6 => PinmuxOutsel::GpioGpio21,
+ PinmuxMioOut::Ior7 => PinmuxOutsel::GpioGpio22,
+ // IOR8-9 aren't MIOs.
+ PinmuxMioOut::Ior10 => PinmuxOutsel::GpioGpio25,
+ PinmuxMioOut::Ior11 => PinmuxOutsel::GpioGpio26,
+ PinmuxMioOut::Ior12 => PinmuxOutsel::GpioGpio27,
+ PinmuxMioOut::Ior13 => PinmuxOutsel::GpioGpio28,
+ },
},
};
}
@@ -148,12 +224,15 @@
Ok(())
}
-fn test_gpio_outputs(_opts: &Opts, transport: &TransportWrapper) -> Result<()> {
+fn test_gpio_outputs(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let uart = transport.uart("console")?;
- // TODO(cfrantz): Enhance this test to have pinmux configurations for other
- // platforms, such as cw310+hyperdebug.
- let config = &VERILATOR;
- log::info!("Configuring pinmux");
+ log::info!(
+ "Configuring pinmux for {:?}",
+ opts.init.backend_opts.interface
+ );
+ let config = CONFIG
+ .get(opts.init.backend_opts.interface.as_str())
+ .expect("interface");
PinmuxConfig::configure(&*uart, None, Some(&config.output))?;
log::info!("Configuring debugger GPIOs as inputs");
@@ -175,12 +254,15 @@
Ok(())
}
-fn test_gpio_inputs(_opts: &Opts, transport: &TransportWrapper) -> Result<()> {
+fn test_gpio_inputs(opts: &Opts, transport: &TransportWrapper) -> Result<()> {
let uart = transport.uart("console")?;
- // TODO(cfrantz): Enhance this test to have pinmux configurations for other
- // platforms, such as cw310+hyperdebug.
- let config = &VERILATOR;
- log::info!("Configuring pinmux");
+ log::info!(
+ "Configuring pinmux for {:?}",
+ opts.init.backend_opts.interface
+ );
+ let config = CONFIG
+ .get(opts.init.backend_opts.interface.as_str())
+ .expect("interface");
PinmuxConfig::configure(&*uart, Some(&config.input), None)?;
log::info!("Configuring debugger GPIOs as outputs");