Skip to content
My public Baremetal Raspberry Pi code
Branch: master
Clone or download
LdB-ECM Makefile changes
Signed-off-by: LdB <>
Latest commit 33b1762 May 6, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
10_virtualmemory AARCH32 added May 1, 2019
Arm32_64_USB Korean language fix May 1, 2019
Core3Interrupt makefile cleanup May 6, 2019
FreeRTOSv10.1.1 Update FreeRTOSConfig.h Dec 7, 2018
GLES2 Makefile changes May 6, 2019
GLES2_Model Makefile changes May 6, 2019
GLES2_Rotate Just Refreshed all Nov 8, 2018
GL_GUI_STEP1 Makefile changes May 6, 2019
Multicore Just Refreshed all Nov 8, 2018
PlayGround Just Refreshed all Nov 8, 2018
RayCast Just Refreshed all Nov 8, 2018
SD_FAT32 Just Refreshed all Nov 8, 2018
SimpleSched Just Refreshed all Nov 8, 2018
arduino Just Refreshed all Nov 8, 2018
myBlinker Makefile changes May 6, 2019
LICENSE Just Refreshed all Nov 8, 2018 Update Apr 14, 2019


Finally started the series on multicore task schedulers and concepts. This code is designed specifically for multicore Raspberry Pi 2 & 3's it will not work on a Pi 1. On Pi3 the choice of AARCH32 or AARCH64 is available.

The first step is xRTOS our start point with a 4 core switcher with simple round robin task schedule. Each core is manually loaded with 2 tasks and will create an idle task when started. The 2 tasks are simple moving the bars on screen at this stage.

Update: The second step with the MMU turned on has now also been added.

Multicore code has been given it's own repository


So I am starting a series on Task Switchers on Single and Multicores. We are going to start out with the simple standard task switcher (FreeRTOS 10.1.1) on a single core. Yeah it's boring but we need to sort out base code stability before we start to fly.

*** Cross Compiling Details

Visual Studio 2017 recently added direct make support so I am finally switching to make files so linux users can directly compile. The compiling background has been quickly documented. Most of the directories are now carrying makefiles as I have relented and started doing it.

If you are on Windows and want a windows executable version of GNU make you can get 4.2.1 from

BareMetal Raspberry-Pi (Linux free zone .. AKA windows)

32 Bit Cross Compiler Toolchain I use (Multiple O/S are supported):

32 Bit compile on the Pi itself with GCC 6:

64 Bit Cross Compiler Toolchain I use (Multiple O/S are supported):


USB (Pi1,2,3 32Bit .. Pi3 AARCH64)

Complete redux of CSUD (Chadderz's Simple USB Driver) by Alex Chadwick. All the memory allocation is gone and compacted to a single file (usb.c). It provides the Control channel functionality for a USB which enables enumeration. Now merged to latest SmartStart 2.0.3 code to bring the Alpha USB up to my latest bootstub. I have new GLES code which requires access to ethernet which means having the LAN9512/LAN9514 running. This is a small step to merge the existing code onto the newer smartstart bootstub to prepare a release for that. If you just want to see it just put the files in the DiskImg directory on a formatted SD card and place in Pi.

MULTICORE (Pi1,2,3 32Bit .. Pi3 AARCH64)

Please remember the Pi1 is single processor. So while you can build code for a Pi1 it can't be used for hyperthreading unless used on a Pi2 or Pi3. The fact you can run your Pi1 code on a Pi2/3 will only work because the SmartStartxx.s stub sorts all that out, just remember its ARM6 code and slightly slower. The assembler and linker files are paired you use either the 32 bit or 64 bit together.

The SmartStartxx.S assembler boot stub was extended to setup cores 1,2,3 for hyperthreading. A new spinlock was created which mimics the bootloaders but is C compiler safe. To do that registers that would be trashed by C routines where restored when the core process is called. In addition to that each core has its own stack the size of which is controlled by the new matching linker file (rpixx.ld).

As per usual you can simply copy the files in the DiskImg directory onto a formatted SD card and place in Pi to test

MYBLINKER (Pi1,2,3 32Bit .. Pi3 AARCH64)

Yes it's the boring old interrupt timer and blinking LED this time in either 32Bit or 64Bit mode. For 64bit the technical background is the Pi3 is given to us in EL2 state. The timer interrupt is routed to EL1 where the interrupt service is established. It is obviously the first steps in how to route interrupt signals to services on the Pi3 in 64bit mode.

***New GLES (Pi1,2,3 32Bit .. Pi3 AARCH64)

This will be my ongoing work to try to build a baremetal GLES interface of some kind. Having gone thru the firmware blob via a VCOS shim this time I am going to try going direct onto the VC4. The reason for the new attempt is the GL pipleine details are finally being really exposed by Eric AnHolt in his work on the OpenGL and his current work on the VC5 successor from Broadcom.

I have not yet settled on an interface format but more going to try to follow a tutorial series on OpenGL 3.3 and develop a baremetal interface as I go.

Tutorial series currently at number 3:

***New ROTATE 3D MODEL - (Pi1, 2, 3 - AARCH32, Pi3 AARCH64)

Update: 64Bit version solved sscanf was bugged in the newlib, I had to rewrite the function. I am getting so fed up with stdio.h in newlib I might just complete the job and replace all the functions.

Update: All memory allocation now removed from render call and render speed now goes well over 800fps so I timed the rotation speed. You will notice rotation is alot smoother.

So we continue our GL pipe adventure slowly crawling towards something that ressembles minimal OpenGL.

So we work on rotating an actual LightWave OBJ 3D mesh model:

Streaming video of output:

As per usual you can simply copy the files in the DiskImg directory onto a formatted SD card and place in Pi to test

***New SD + FAT32 (Pi1,2,3 32Bit .. Pi3 AARCH64)

To take my accelerated graphics further I found I was in need of the ability to Read Files from the SD Card. I reworked some old code I had done for an article, simplifying it to something that meets the requirements. At this stage the code is strictly READ file only and the API calls mimic the standard file functions from the Windows API.

As per usual you can simply copy the files in the DiskImg directory onto a formatted SD card (make sure this includes the subdirectory "Bitmaps") and place in Pi to test

You can’t perform that action at this time.