bootrom
Overview
bootrom is a ROM that stores the first-stage bootloader and device tree executed first after startup. It uses BRAM. Here, mainly the software part is explained. The hardware part implements just a ROM and an interconnect slave.
Module Hierarchy
Hardware
bootrom (bootrom/bootrom.v) # Boot ROM (no submodules)
Software
src/
├── bootrom.S # Startup routine
├── bootloader.c # First-stage bootloader
├── rvcom_uart.c # UART driver implementation
├── rvcom_uart.h # UART driver header
├── io.h # I/O macros
└── linker.ld # Linker script
Device Tree
rvcom.dts (rvcom.dtb) # Device tree
Key Features
Size: 8KiB
Memory Type: ROM
Address Range: 0x00010000 - 0x00012000
First-stage Bootloader: Load kernel from UART to DRAM
Module Description
bootrom (bootrom/bootrom.v)
bootrom is read-only memory using BRAM. It has 8KB capacity and stores the first-stage bootloader and device tree. After reset, the CPU’s program counter (PC) is set to 0x00010000, and instruction fetching begins from here. bootrom stores in 128-bit units and is read with 128-bit data width. An interconnect slave is implemented.
Software Configuration
Boot ROM software is stored in the rvcom/bootrom/src/ directory:
bootrom.S
Executes startup routine and calls the first-stage bootloader. Then starts OpenSBI, the second-stage bootloader, passing the device tree and hartid to identify the CPU as arguments.
bootloader.c
First-stage bootloader program that loads program image from UART to DRAM.
Displays “[ bootrom] Hello, world!\n” and receives BIN_SIZE bytes of data specified in Makefile from UART and writes to DRAM.
rvcom_uart.c / rvcom_uart.h
UART control driver. Use these functions to perform UART read/write operations.
io.h
Inline assembly macros for hardware I/O. CPU accesses via MMIO, so uses lw/sw.
linker.ld
Linker script for bootrom. Describes address placement for MMIO access, etc.