This project documents an ongoing experiments conducted to run Raspberry
Pi-Zero baremetal, focusing on BCM2865 SoC peripherals and ARMv6 assembly. The
experiments are intentionally Pi-Zero specific to remove generic logics and
codes for other Raspberries. Ultimately an operating system will be
handcrafted at the very end.
Hardware overview:
- Raspbery Pi-Zero (W is optional for early stages) with header pins
- Micro SD card (and a reader)
- UART to USB bridge
- SSD1306 (or any I2C display with datasheet that you understand)
- Arduino (or any I2C slave capable MCU that you know how to use)*
- Breadboard, some resistors and capacitors, a TRRS audio jack breakout,
some wires. (For low pass filter in pwm audio experiment, can be
optional)*
- A passive playback device (e.g. cheap headset), tiny chance that it might
be damaged. Avoid using your high end audio gear.
* optional
To start, a cross compiler targeting `arm-none-eabi` is required. OSDev wiki
has provided a very nice guide:
https://wiki.osdev.org/GCC_Cross-Compiler
The bootcode.bin and start.elf is required:
https://github.com/raspberrypi/firmware/tree/master/boot
Format the card with FAT32 and copy the files into it. The files will instruct
the pi to load kernel.img and execute it. Each experiments will output a bin
file which can be renamed into kernel.img and works.
Discussions are welcomed.
Experiments (in order of simplicity):
1. blinker
2. uart
3. oled (i2c)
4. pwm (audio)
Recommended Reading Order
1. blinker
2. uart
3. bootloader
4. oled
5. hal *s
6. pwm
*s - Software Topic
Global notes:
- The BCM peripherals address space is 0x20XXXXXX instead of 0x7EXXXXXX in
ARM window. (see
https://github.com/dwelch67/raspberrypi/tree/master/boards/pizero/blinker01)
List of community resources that has been of great help throughout the process:
- https://github.com/dwelch67/raspberrypi
- https://elinux.org/RPi_BCM2835_GPIOs
Useful datasheets and documentations:
- BCM2835 ARM Peripherals
https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.pdf
(IMPORTANT ERRATA!!)
https://elinux.org/BCM2835_datasheet_errata
- ARM Architecture Reference Manual
https://static.docs.arm.com/ddi0100/i/DDI%2001001.pdf
- ARM1176JZF-S Technical Reference Manual
https://static.docs.arm.com/ddi0301/h/DDI0301H_arm1176jzfs_r0p7_trm.pdf
- binutils Documentation, and the AArch64-specific parts
https://sourceware.org/binutils/docs-2.26/as/AArch64_002dDependent.html#AArch64_002dDependent