Skip to content

Instantly share code, notes, and snippets.

@imjacobclark
Created December 13, 2015 17:22
Show Gist options
  • Save imjacobclark/77c68039ae006e674a01 to your computer and use it in GitHub Desktop.
Save imjacobclark/77c68039ae006e674a01 to your computer and use it in GitHub Desktop.
Bare metal Raspberry Pi ACT blink kernel

If you care about your current kernel, move or rename it, don't delete it.

  • Remove old kernel.img from Raspberry Pi
  • Run build.sh
  • Move built kernel.img onto Raspberry Pi
  • Boot, see ACT/OK LED blinking!
#!/bin/sh
arm-none-eabi-as -o main.o main.s
arm-none-eabi-ld -o output.elf -T kernel.ld main.o
arm-none-eabi-objcopy output.elf -O binary kernel.img
SECTIONS {
.init 0x8000 : {
*(.init)
}
.text : {
*(.text)
}
.data : {
*(.data)
}
/DISCARD/ : {
*(*)
}
}
.section .init
.globl _start
_start:
ldr r0,=0x20200000 /* GPIO virtual addr */
/*
54 GPIOs per 6 registers. 32 bits each with 7 modes per pin with 3 bits per GPIO
GPFSELn 0-5 (0-9 | 10-19 | 20-29 | 30-39 | 40-49 | 50-54)
16 % 10 * 3 = 18
*/
mov r1,#1
lsl r1,#18
str r1,[r0,#4] /* GPIO Function Select 1 (16 % 10 * 3) (GPFSEL1) */
mov r1,#1
lsl r1,#16
loop$:
str r1,[r0,#40] /* GPIO Pin Output Clear 0 (GPCLR0) (clears pin 16 [sets to low] (ACTOK)) */
mov r2,#0x3F0000 /* BLINK ME! (busies the processor with some maths) */
wait1$:
sub r2,#1
cmp r2,#0
bne wait1$
str r1,[r0,#28] /* GPIO Pin Output Set 0 (GPSET0) (sets pin 16 [to high]) */
mov r2,#0x3F0000 /* BLINK ME! (busies the processor with some maths) */
wait2$:
sub r2,#1
cmp r2,#0
bne wait2$
b loop$ /* Do it all over again */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment