[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");