Hi Genodians,
I am trying to get a Genode image using the Fiasco.OC-kernel running on an RPi 3. I created an arm_v8a build directory and accordingly set the KERNEL and BOARD variable. I also compiled a u-boot image from the upstream repository.
When I attempt to boot the image from the u-boot prompt, I receive the output below with no further reaction. I am still on Genode 19.05 because of a few modifications so I unless there is no other solution, I would like to avoid upgrading to a newer version.
I also tried to run a few L4Re images provided here [0] with the same result, so the problem might not even be specific to Genode.
Does anyone else have experiences with running on an RPi 3? Is there anything I am missing here?
Hi,
today I was able to check this configuration and in my setup and it is working ok for me. My setup is somewhat similar to one I described in my article on genodians.org with loading image over tftp although I think I did not describe in datail configuration for 64bit version.
I think one important piece is content of config.txt. Mine is:
kernel=u-boot.bin enable_uart=1
arm_64bit=1
enable_jtag_gpio=1
Based on modification times of files on sd card I prepared it about year ago (November 2019) and if I correctly remember I used current at that time versions of rpi firmware and u-boot.
Below is the complete output I received from running run/log with KERNEL=foc and BOARD=rpi3 on release 20.08
I hope this will help you.
Best regards, Tomasz
Hi Tomasz,
I actually used your guide to setup Genode on a Raspberry so before I continue, I wanted to thank you for this article.
Anyway, I don't understand what I am doing wrong here. I followed your guide step-by-step with the exception of booting the image from the sd-card. My config looks very similar to yours (see below). However, I always receive garbage output. I think it must be a UART-issue of some sort. I investigated the Fiasco.OC-kernel code and found out that when the rpi3 configuration is used, it tries to compile a driver for the 16550 instead of the PL011, which is actually used in the RPi3 (unless I am misunderstanding something, I should add that most of this stuff is kind of new to me). Unfortunately, this did not fix the problem either but still, I added the changed files below for clarification.
Could you share me your image to see whether I can get it to boot on my Pi as well?
Best regards, Simon
config.txt: enable_uart=1 arm_64bit=1 init_uart_baud=115200 kernel=u-boot.bin
I modified the file src/kern/arm/bsp/bcm283x/Modules to compile the driver for the PL011 instead:
SUBSYSTEMS += LIBUART PREPROCESS_PARTS += libuart generic_tickless_idle arm_single_ipi_irq PREPROCESS_PARTS += $(if $(CONFIG_ARM_V7PLUS),arm_generic_timer) # PREPROCESS_PARTS += $(if $(CONFIG_PF_BCM283X_RPI3),16550) PREPROCESS_PARTS += $(if $(CONFIG_PF_BCM283X_RPIZW),16550) INTERFACES_KERNEL += $(if $(CONFIG_ARM_V7PLUS),generic_timer) INTERFACES_KERNEL += arm_control irq_handler RAM_PHYS_BASE := 0
#ifeq ($(CONFIG_PF_BCM283X_RPI3),y) # uart_IMPL = uart uart-16550 # kernel_uart_IMPL += kernel_uart-libuart # OBJECTS_LIBUART += uart_16550.o ifeq ($(CONFIG_PF_BCM283X_RPIZW),y) uart_IMPL = uart uart-16550 kernel_uart_IMPL += kernel_uart-libuart OBJECTS_LIBUART += uart_16550.o else uart_IMPL += uart-arm-bcm283x kernel_uart_IMPL += kernel_uart-arm-bcm283x OBJECTS_LIBUART += uart_pl011.o endif arm_control_IMPL += arm_control-arm-bcm283x config_IMPL += config-arm-bcm283x mem_layout_IMPL += mem_layout-arm-bcm283x pic_IMPL += pic-arm-bcm283x timer_IMPL += timer-arm-bcm283x timer_IMPL += $(if $(CONFIG_ARM_V7PLUS),timer-arm-generic) timer_tick_IMPL += $(if $(CONFIG_ARM_V7PLUS),timer_tick-arm-bcm283x,timer_tick-single-vector) reset_IMPL += reset-arm-bcm283x clock_IMPL += clock-generic ipi_IMPL += ipi-arm-bcm283x platform_control_IMPL += platform_control-arm-bcm283x irq_handler_IMPL = irq_handler-arm-bcm283x
I also needed to modify src/kern/arm/bsp/bcm283x/uart-arm-bcm283x.cpp so it is included by the compiler:
IMPLEMENTATION [pf_bcm283x && !(pf_bcm283x_rpizw)]:
#include "koptions.h" #include "uart_pl011.h"
IMPLEMENT Address Uart::base() const { return Koptions::o()->uart.base_address; }
IMPLEMENT int Uart::irq() const { return Koptions::o()->uart.irqno; }
IMPLEMENT L4::Uart *Uart::uart() { //static L4::Uart_pl011 uart(Koptions::o()->uart.base_baud); static L4::Uart_pl011 uart(115200); return &uart; }