Rock64 - Simple Bare-Metal Example - Printable Version

+- PINE64 (
+-- Forum: ROCK64 (
+--- Forum: Rock64 Tutorials (
+--- Thread: Rock64 - Simple Bare-Metal Example (/showthread.php?tid=10079)

Rock64 - Simple Bare-Metal Example - krjdev - 06-05-2020


I wrote a simple Bare-Metal example for the Rock64.
It just sends a few strings over the UART interface and if a special char will be received, the program resets the Rock64.

The main entry point of the program (written in Assembler):

#include <asm.h>



   mrs x0, SCTLR_EL1
   and x0, x0, #0xFFFFFFFFFFFFFFFC
   msr SCTLR_EL1, x0
   mrs x0, SCTLR_EL2
   and x0, x0, #0xFFFFFFFFFFFFFFFC
   msr SCTLR_EL2, x0
   mrs x0, MPIDR_EL1
   and x0, x0, #0x3
   cmp x0, #0
   beq L1
   b L0
   ldr x0, =_kern_stack_s
   mov sp, x0
   b kern_main
   b L2


It's a minimal setup. It just disables the MMU and the Alignment checks.
Then it reads the processor ID and let only CPU0 run the C main entry point (kern_main).

The C main entry point:

#include <dev/cru.h>
#include <dev/uart.h>

void kern_main(void)
   int c;
   uart_puts("Pine64 Rock64\r\n");
   uart_puts("Press 'r' to reset the board!\r\n");
   do {
       c = uart_getc();
   } while (c != 'r');
   while (1)

Should be self explaining.

There is also as very simple UART driver and the CRU driver for resetting the board.
The code includes a very minimal C String library.Only GCC for AArch64 is needed.

To start the application, U-Boot is needed.

I have attached the full code.
The code is also on my GitHub page available.

Oops! There is a bug in the attached archive.

Simple change the following line in the file start.S...
ldr x0, =_kern_stack_s

ldr x0, =_kern_stack_e

RE: Rock64 - Simple Bare-Metal Example - krjdev - 01-24-2021


I'm currently working on a new release for the bare-metal example.

Current reached milestones:
- Successfully implemented MMU support (Had some troubles with the translation tables in the past.)
- Implemented cleaning and invalidating for the Instruction and data cache
- Switching from EL2 (Hypervisor) to EL1 (Kernel)

Currently working on the implementation of syscalls.

Feature of the new release:
- Simple kernel (EL1) for exception/interrupt handling, device and memory management
- Small libc for userland (EL0)

New release available soon. Smile

The actual status is available at the next branch.