From 6920f5d5640e0facb662b98d333b46d67026926a Mon Sep 17 00:00:00 2001 From: Saurabh Singh Date: Fri, 20 Oct 2023 00:09:11 -0400 Subject: [PATCH] sim, bootloader: setup & Handle bootmode properly - in hsoc target:sim option reduces led blink delay - sim: add bootmode cli option in hsoc backend --- Makefile | 2 +- sim/backend_hydrogensoc.cpp | 5 +++++ sim/backend_hydrogensoc.hpp | 1 + sim/main.cpp | 4 ++++ sw/bootloader/Makefile | 7 +++++++ sw/bootloader/hydrogensoc.h | 20 ++++++++++++++++---- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 3dbef9f6..6a8e976f 100644 --- a/Makefile +++ b/Makefile @@ -100,7 +100,7 @@ test: sim lib ## Test the build using banner example .PHONY : boot boot: lib ## Build bootloader for given target [default: atombones] @printf "$(CLR_GR)>> Building bootloader [soctarget:$(soctarget)] $(CLR_NC)\n" - make $(MKFLAGS) -C $(bootloader_dir) soctarget=$(soctarget) + make $(MKFLAGS) -C $(bootloader_dir) soctarget=$(soctarget) sim=true .PHONY: clean-boot diff --git a/sim/backend_hydrogensoc.cpp b/sim/backend_hydrogensoc.cpp index 108b3459..db4265a6 100644 --- a/sim/backend_hydrogensoc.cpp +++ b/sim/backend_hydrogensoc.cpp @@ -31,6 +31,8 @@ #define BBUART_FRATIO 3 +#define BOOTMODE_PIN_OFFSET 8 + Backend_atomsim::Backend_atomsim(Atomsim *sim, Backend_config config) : Backend(sim, &(sim->simstate_)), config_(config), using_vuart_(config.vuart_portname != "") @@ -161,6 +163,9 @@ int Backend_atomsim::tick() return 1; } + // Force the bootmode switch value + tb->m_core->gpio_io = (0b11 & config_.bootmode) << BOOTMODE_PIN_OFFSET; + // perform uart transaction (if any) UART(); diff --git a/sim/backend_hydrogensoc.hpp b/sim/backend_hydrogensoc.hpp index 7ae64cec..1624722a 100644 --- a/sim/backend_hydrogensoc.hpp +++ b/sim/backend_hydrogensoc.hpp @@ -16,6 +16,7 @@ struct Backend_config std::string vuart_portname = ""; uint32_t vuart_baudrate = 115200; bool enable_uart_dump = false; + int bootmode = 1; // Jump to RAM }; diff --git a/sim/main.cpp b/sim/main.cpp index 7a03192a..621e91fe 100755 --- a/sim/main.cpp +++ b/sim/main.cpp @@ -90,6 +90,10 @@ void parse_commandline_args(int argc, char**argv, Atomsim_config &sim_config, Ba ("bootrom-image", "Specify bootrom hex image", cxxopts::value(backend_config.bootrom_img)->default_value(default_backend_config.bootrom_img)) ("ram-size", "Specify size of RAM memory to simulate (in KB)", cxxopts::value(backend_config.ram_size_kb)->default_value(std::to_string(default_backend_config.ram_size_kb))) #endif + + #ifdef TARGET_HYDROGENSOC + ("bootmode", "Specify bootmode signal", cxxopts::value(backend_config.bootmode)->default_value(std::to_string(default_backend_config.bootmode))) + #endif ; options.add_options("Debug") diff --git a/sw/bootloader/Makefile b/sw/bootloader/Makefile index a6737b72..8e0b625b 100644 --- a/sw/bootloader/Makefile +++ b/sw/bootloader/Makefile @@ -1,5 +1,7 @@ EXEC:= bootloader +sim ?= false + RVPREFIX:= riscv64-unknown-elf CFLAGS:= -mabi=ilp32 -march=rv32i -nostartfiles -ffreestanding -Os @@ -9,6 +11,11 @@ LFLAGS:= -L $(RVATOM_LIB)/ -T $(RVATOM_LIB)/link/link_bootloader.ld -lcatom -Xli CONVELF_ARGS:= -t elf -c +ifeq ($(sim), true) + CFLAGS+= -DSIM +endif + + ifeq ($(MAKECMDGOALS),clean) else ifeq ($(soctarget), atombones) diff --git a/sw/bootloader/hydrogensoc.h b/sw/bootloader/hydrogensoc.h index 3d4fc712..f90376a0 100644 --- a/sw/bootloader/hydrogensoc.h +++ b/sw/bootloader/hydrogensoc.h @@ -42,12 +42,17 @@ extern uint32_t __approm_size; */ void led_blink(int pin, int count, int time_period) { + int halfperiod = time_period >> 1; + #ifdef SIM + halfperiod = 0; + #endif + for(int i=0; i> 1); + sleep_ms(halfperiod); gpio_write(pin, LOW); - sleep_ms(time_period >> 1); + sleep_ms(halfperiod); } } @@ -67,8 +72,15 @@ void * platform_init() { led_blink(BOOTLED_PIN, START_LED_FLASHES, 50); // get bootmode - uint8_t bootmode = (uint8_t)gpio_read(BOOTMODE_PIN0) - | (((uint8_t)gpio_read(BOOTMODE_PIN1)) << 1); + uint8_t pin0_val = (uint8_t)gpio_read(BOOTMODE_PIN0); + uint8_t pin1_val = (uint8_t)gpio_read(BOOTMODE_PIN1); + uint8_t bootmode = pin0_val | pin1_val << 1; + + // Print Bootmode + P(putchar('0'+pin0_val);) + P(putchar('0'+pin1_val);) + P(putchar(':');) + /** * Bootmode: * 0b00: flashboot