mirror of
https://github.com/brain-hackers/lab
synced 2024-12-22 12:10:04 +09:00
Add U-Boot loader over MMU
This commit is contained in:
parent
1be480557e
commit
3e93562761
1
x1/.gitignore
vendored
Normal file
1
x1/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
c/uboot_bin.h
|
@ -21,6 +21,15 @@ c/main.elf:
|
|||||||
c/main.bin: c/main.elf
|
c/main.bin: c/main.elf
|
||||||
@./extract.py c/main.elf $@
|
@./extract.py c/main.elf $@
|
||||||
|
|
||||||
|
c/uboot_loader.bin:
|
||||||
|
@if [ "$(UBOOT)" = "" ]; then \
|
||||||
|
echo "Please specify UBOOT."; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
@c/generate.py $(UBOOT) c/uboot_bin.h.tpl c/uboot_bin.h
|
||||||
|
@$(CC) -nostdlib -static -fPIC -marm -O0 c/start.S c/main_uboot.c -o c/uboot_loader.elf
|
||||||
|
@./extract.py c/uboot_loader.elf $@
|
||||||
|
|
||||||
spray/main.bin:
|
spray/main.bin:
|
||||||
@$(AS) spray/top.S
|
@$(AS) spray/top.S
|
||||||
@./extract.py -p a.out spray/top.bin
|
@./extract.py -p a.out spray/top.bin
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#define readl(a) (*(volatile unsigned int *)(a))
|
#define readl(a) (*(volatile unsigned int *)(a))
|
||||||
#define writel(v, a) (*(volatile unsigned int *)(a) = (v))
|
#define writel(v, a) (*(volatile unsigned int *)(a) = (v))
|
||||||
|
#define writeb(v, a) (*(volatile unsigned char *)(a) = (v))
|
||||||
|
|
||||||
typedef unsigned int u32;
|
typedef unsigned int u32;
|
||||||
typedef unsigned short u16;
|
typedef unsigned short u16;
|
||||||
|
27
x1/c/generate.py
Executable file
27
x1/c/generate.py
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
import textwrap
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print(f'Usage: {sys.argv[0]} u-boot.bin uboot_bin.h.tpl uboot_bin.h')
|
||||||
|
|
||||||
|
with open(sys.argv[2]) as f:
|
||||||
|
tpl = f.read()
|
||||||
|
|
||||||
|
with open(sys.argv[1], 'rb') as ui, open(sys.argv[3], 'w') as header:
|
||||||
|
uboot = ui.read()
|
||||||
|
|
||||||
|
out = ''
|
||||||
|
for i, b in enumerate(uboot):
|
||||||
|
out += f'{b:#04x}, '
|
||||||
|
if (i+1) % 16 == 0:
|
||||||
|
out = out.rstrip()
|
||||||
|
out += '\n'
|
||||||
|
|
||||||
|
formatted = tpl.format(uboot_size=len(uboot), uboot_bin=textwrap.indent(out, ' '))
|
||||||
|
header.write(formatted)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
34
x1/c/main_uboot.c
Normal file
34
x1/c/main_uboot.c
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#include "common.h"
|
||||||
|
#include "uboot_bin.h"
|
||||||
|
|
||||||
|
#define VIRT_START (unsigned char *)0x8c000000
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
int i;
|
||||||
|
u8* ptr = VIRT_START;
|
||||||
|
|
||||||
|
// Turn off interrupts
|
||||||
|
asm volatile (
|
||||||
|
"cpsid if \n"
|
||||||
|
);
|
||||||
|
|
||||||
|
for (i=0; i<UBOOT_SIZE; i++) {
|
||||||
|
writeb(uboot_bin[i], ptr);
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
asm volatile (
|
||||||
|
"mrc p15, 0, r8, c14, c2, 1 \n"
|
||||||
|
"bic r8, r8, #1 \n"
|
||||||
|
"mcr p15, 0, r8, c14, c2, 1 \n"
|
||||||
|
"mrc p15, 0, r8, c14, c3, 1 \n"
|
||||||
|
"bic r8, r8, #1 \n"
|
||||||
|
"mcr p15, 0, r8, c14, c3, 1 \n"
|
||||||
|
|
||||||
|
"mrc p15, 0, r10, c1, c0, 0 \n"
|
||||||
|
"bic r10, r10, #1 \n"
|
||||||
|
"mcr p15, 0, r10, c1, c0, 0 \n"
|
||||||
|
"ldr r0, =0x60200000 \n"
|
||||||
|
"mov pc, r0"
|
||||||
|
);
|
||||||
|
}
|
5
x1/c/uboot_bin.h.tpl
Normal file
5
x1/c/uboot_bin.h.tpl
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#define UBOOT_SIZE {uboot_size}
|
||||||
|
|
||||||
|
unsigned char uboot_bin[] = {{
|
||||||
|
{uboot_bin}
|
||||||
|
}};
|
Loading…
Reference in New Issue
Block a user