Initial import with uart
This commit is contained in:
commit
787b4617ae
23
Makefile
Normal file
23
Makefile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#CROSS=aarch64-none-elf-
|
||||||
|
CROSS=aarch64-linux-gnu-
|
||||||
|
CC=$(CROSS)gcc
|
||||||
|
LD=$(CROSS)ld
|
||||||
|
CFLAGS=-Wall -Wextra -ffreestanding -march=armv8-a+crc -mcpu=cortex-a53
|
||||||
|
LDSCRIPT=rpi3.ld
|
||||||
|
|
||||||
|
OBJS=crt0.o uart.o hello.o
|
||||||
|
|
||||||
|
all:kernel.bin
|
||||||
|
|
||||||
|
kernel.elf: $(OBJS) $(LDSCRIPT)
|
||||||
|
$(LD) -o $@ $(OBJS) -T$(LDSCRIPT) -Map kernel.map
|
||||||
|
|
||||||
|
kernel.bin: kernel.elf
|
||||||
|
$(CROSS)objcopy -O binay -B aarch64 $< $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(OBJS) *.bin *.elf *.map
|
||||||
|
|
||||||
|
run: kernel.bin
|
||||||
|
qemu-system-aarch64 -machine raspi3b -kernel $<
|
||||||
|
|
8
config.txt
Normal file
8
config.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#bootloarder
|
||||||
|
uart_2ndstage=1
|
||||||
|
|
||||||
|
# 64bits
|
||||||
|
arm_64bit=1
|
||||||
|
|
||||||
|
# Kernel name
|
||||||
|
kernel=kernel.bin
|
27
crt0.S
Normal file
27
crt0.S
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
.section .text.boot
|
||||||
|
.global __start
|
||||||
|
.type __start, %function
|
||||||
|
|
||||||
|
__start:
|
||||||
|
//Use core 0 only
|
||||||
|
mrs x7, mpidr_el1
|
||||||
|
and x7, x7, #3
|
||||||
|
cbz x7, __start_master
|
||||||
|
0: wfe
|
||||||
|
b 0b
|
||||||
|
|
||||||
|
__start_master:
|
||||||
|
//Setup stack pointer
|
||||||
|
ldr x2, = __stack_start
|
||||||
|
mov sp, x2
|
||||||
|
|
||||||
|
//Clear BSS
|
||||||
|
ldr w0, = __bss_start
|
||||||
|
ldr w1, = __bss_size
|
||||||
|
1: cbz x1, 2f
|
||||||
|
str xzr, [x0], #8
|
||||||
|
sub x1, x1, #1
|
||||||
|
cbnz x1, 1b
|
||||||
|
2:
|
||||||
|
bl kernelmain
|
||||||
|
b 0b
|
9
gpio.h
Normal file
9
gpio.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "mmio.h"
|
||||||
|
// GPIO Function Select 1
|
||||||
|
#define GPFSEL1 (*(volatile unsigned *)(GP_BASE + 0x04))
|
||||||
|
// GPIO Pin Pull-up/down Enable
|
||||||
|
#define GPPUD (*(volatile unsigned *)(GP_BASE + 0x94))
|
||||||
|
// GPIO Pin Pull-up/down Enable Clock 0
|
||||||
|
#define GPPUDCLK0 (*(volatile unsigned *)(GP_BASE + 0x98))
|
6
hello.c
Normal file
6
hello.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include "uart.h"
|
||||||
|
|
||||||
|
int kernelmain(void) {
|
||||||
|
init_uart();
|
||||||
|
return 0;
|
||||||
|
}
|
13
mmio.h
Normal file
13
mmio.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
// IO mapping
|
||||||
|
#define IO_BASE 0x3f000000
|
||||||
|
|
||||||
|
// Mini-UART mapping
|
||||||
|
#define MU_BASE (IO_BASE + 0x215000)
|
||||||
|
|
||||||
|
// GPIO mapping
|
||||||
|
#define GP_BASE (IO_BASE + 0x200000)
|
||||||
|
|
||||||
|
// videocore mbox system
|
||||||
|
#define VCORE_MBOX (IO_BASE + 0x0000B880)
|
32
rpi3.ld
Normal file
32
rpi3.ld
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
/* Load at a classic 64bit addr*/
|
||||||
|
/* Could be replace by . = 0x8000; before .text*/
|
||||||
|
RAM (rwx) : ORIGIN = 0x80000, LENGTH = 0x10000000
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text : { *(.text .text.*) }
|
||||||
|
.rodata : { *(.rodata .rodata.*) }
|
||||||
|
.data : { *(.data .data.*) }
|
||||||
|
|
||||||
|
.bss (NOLOAD):
|
||||||
|
{
|
||||||
|
__bss_start = ALIGN(16);
|
||||||
|
*(.bss .bss.*)
|
||||||
|
__bss_end = ALIGN(16);
|
||||||
|
}
|
||||||
|
__end =.;
|
||||||
|
|
||||||
|
. = ALIGN(16);
|
||||||
|
. += 0x1000;
|
||||||
|
__stack_start = .;
|
||||||
|
|
||||||
|
/DISCARD/ :
|
||||||
|
{
|
||||||
|
*(.comment) *(.gnu) *(.note*) *(.eh_frame*)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__bss_size = (__bss_end - __bss_start) >> 3;
|
45
uart.c
Normal file
45
uart.c
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "uart.h"
|
||||||
|
#include "gpio.h"
|
||||||
|
//#include "mbox.h"
|
||||||
|
|
||||||
|
|
||||||
|
void init_uart(void )
|
||||||
|
{
|
||||||
|
//Active waiting
|
||||||
|
while(UART0_FR & (1<<3)){}
|
||||||
|
|
||||||
|
//Stop UART0
|
||||||
|
UART0_CR = 0;
|
||||||
|
|
||||||
|
//GPIO 14 and 15 in ALT0
|
||||||
|
GPFSEL1 &= ~((7<<12)|(7<<15));
|
||||||
|
GPFSEL1 |= (4<<12)|(4<<15);
|
||||||
|
GPPUD = 0;
|
||||||
|
for(uint8_t i = 0; i < 150; i++){
|
||||||
|
asm volatile ("nop");
|
||||||
|
}
|
||||||
|
GPPUDCLK0 = (1<<14)|(1<<5);
|
||||||
|
for(uint8_t i = 0; i < 150; i++){
|
||||||
|
asm volatile ("nop");
|
||||||
|
}
|
||||||
|
|
||||||
|
//CLR INTR
|
||||||
|
GPPUDCLK0 = 0;
|
||||||
|
|
||||||
|
// Setup for 115200bps @3Mhz
|
||||||
|
// 3000000 /(115200 * 16) = 1.627
|
||||||
|
// 0.627 * 64 + 0.5 = 40.628 -> 40
|
||||||
|
UART0_IBRD = 1; //int part
|
||||||
|
UART0_FBRD = 40; //fract part
|
||||||
|
UART0_LCRH = 0b11 <<5; //format 8n1
|
||||||
|
UART0_CR = 0x301; //Active Tx, Rx & FIFO
|
||||||
|
}
|
||||||
|
|
||||||
|
void putc(char c){
|
||||||
|
//FIFO Full?
|
||||||
|
while(UART0_FR & (1<<5)){}
|
||||||
|
|
||||||
|
UART0_DR = c;
|
||||||
|
}
|
15
uart.h
Normal file
15
uart.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "mmio.h"
|
||||||
|
|
||||||
|
/* PL011 UART */
|
||||||
|
#define UART0_DR (*(volatile unsigned *)(IO_BASE + 0x00201000))
|
||||||
|
#define UART0_FR (*(volatile unsigned *)(IO_BASE + 0x00201018))
|
||||||
|
#define UART0_IBRD (*(volatile unsigned *)(IO_BASE + 0x00201024))
|
||||||
|
#define UART0_FBRD (*(volatile unsigned *)(IO_BASE + 0x00201028))
|
||||||
|
#define UART0_LCRH (*(volatile unsigned *)(IO_BASE + 0x0020102C))
|
||||||
|
#define UART0_CR (*(volatile unsigned *)(IO_BASE + 0x00201030))
|
||||||
|
#define UART0_IMSC (*(volatile unsigned *)(IO_BASE + 0x00201038))
|
||||||
|
#define UART0_ICR (*(volatile unsigned *)(IO_BASE + 0x00201044))
|
||||||
|
|
||||||
|
void init_uart(void);
|
||||||
|
void putc(char c);
|
Loading…
Reference in New Issue
Block a user