forked from cores/microwatt
6 changed files with 879 additions and 0 deletions
@ -0,0 +1,586 @@
@@ -0,0 +1,586 @@
|
||||
4800002408000048 |
||||
01006b69a600607d |
||||
a602487d05009f42 |
||||
a64b5a7d14004a39 |
||||
2402004ca64b7b7d |
||||
3c20000048000004 |
||||
782107c660210000 |
||||
60212f0064210000 |
||||
618c00003d800000 |
||||
658c0000798c07c6 |
||||
7d8903a6618c113c |
||||
480000004e800421 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000048000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
0000000000000000 |
||||
e8010010ebc1fff0 |
||||
7c0803a6ebe1fff8 |
||||
3c4000014e800020 |
||||
3d20c0003842a000 |
||||
6129200060000000 |
||||
f922800079290020 |
||||
394000353d20c000 |
||||
7929002061292018 |
||||
4e800020f9490000 |
||||
0000000000000000 |
||||
3c40000100000000 |
||||
600000003842a000 |
||||
390a0010e9428000 |
||||
71290001e9280000 |
||||
e86a00084082fff8 |
||||
4e8000205463063e |
||||
0000000000000000 |
||||
3c40000100000000 |
||||
600000003842a000 |
||||
390a0010e9428000 |
||||
71290008e9280000 |
||||
f86a00004082fff8 |
||||
000000004e800020 |
||||
0000000000000000 |
||||
3842a0003c400001 |
||||
fbc1fff07c0802a6 |
||||
7fc32214fbe1fff8 |
||||
f80100107c7f1b78 |
||||
7fbff040f821ffd1 |
||||
38210030409e000c |
||||
887f00004bffff10 |
||||
4bffff993bff0001 |
||||
000000004bffffe4 |
||||
0000028001000000 |
||||
7d4348ae39200000 |
||||
409e000c2f8a0000 |
||||
4e8000207d234b78 |
||||
4bffffe839290001 |
||||
0000000000000000 |
||||
3c40000100000000 |
||||
7c0802a63842a000 |
||||
3fe2fffffbe1fff8 |
||||
f80100103bff7190 |
||||
4bfffec1f821ffd1 |
||||
4bffffad7fe3fb78 |
||||
7fe3fb787c641b78 |
||||
4bfffee94bffff59 |
||||
4bffff195463063e |
||||
000000004bfffff4 |
||||
0000018001000000 |
||||
6f57206f6c6c6548 |
||||
0000000a0d646c72 |
||||
0000000000000010 |
||||
0141780400527a01 |
||||
0000001000010c1b |
||||
fffffe5800000018 |
||||
0000000000000040 |
||||
0000002c00000010 |
||||
00000038fffffe84 |
||||
0000001000000000 |
||||
fffffea800000040 |
||||
0000000000000034 |
||||
0000005400000028 |
||||
00000050fffffec8 |
||||
9f029e0041094500 |
||||
437e4111300e4401 |
||||
4106dedf41000e0a |
||||
000000100000000b |
||||
fffffeec00000080 |
||||
000000000000002c |
||||
000000940000001c |
||||
00000054ffffff04 |
||||
44019f0041094400 |
||||
0000007e4111300e |
@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
|
||||
CROSS_COMPILE = powerpc64le-linux- |
||||
CC = $(CROSS_COMPILE)gcc |
||||
LD = $(CROSS_COMPILE)ld |
||||
OBJCOPY = $(CROSS_COMPILE)objcopy |
||||
|
||||
CFLAGS = -Os -g -Wall -std=c99 -msoft-float -mno-string -mno-multiple -mno-vsx -mno-altivec -mlittle-endian -fno-stack-protector -mstrict-align -ffreestanding -fdata-sections -ffunction-sections |
||||
ASFLAGS = $(CFLAGS) |
||||
LDFLAGS = -T powerpc.lds |
||||
|
||||
all: hello_world.hex |
||||
|
||||
hello_world.elf: hello_world.o head.o |
||||
$(LD) $(LDFLAGS) -o hello_world.elf hello_world.o head.o |
||||
|
||||
hello_world.bin: hello_world.elf |
||||
$(OBJCOPY) -O binary hello_world.elf hello_world.bin |
||||
|
||||
hello_world.hex: hello_world.bin |
||||
./bin2hex.py hello_world.bin > hello_world.hex |
||||
|
||||
clean: |
||||
@rm -f *.o hello_world.elf hello_world.bin hello_world.hex |
@ -0,0 +1,17 @@
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/python3 |
||||
|
||||
import sys |
||||
import subprocess |
||||
import struct |
||||
|
||||
with open(sys.argv[1], "rb") as f: |
||||
while True: |
||||
word = f.read(8) |
||||
if len(word) == 8: |
||||
print("%016x" % struct.unpack('Q', word)); |
||||
elif len(word) == 4: |
||||
print("00000000%08x" % struct.unpack('I', word)); |
||||
elif len(word) == 0: |
||||
exit(0); |
||||
else: |
||||
raise Exception("Bad length") |
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
/* Copyright 2013-2014 IBM Corp. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
||||
* implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
#define STACK_TOP 0x3000 |
||||
|
||||
#define FIXUP_ENDIAN \ |
||||
tdi 0,0,0x48; /* Reverse endian of b . + 8 */ \ |
||||
b 191f; /* Skip trampoline if endian is good */ \ |
||||
.long 0xa600607d; /* mfmsr r11 */ \ |
||||
.long 0x01006b69; /* xori r11,r11,1 */ \ |
||||
.long 0x05009f42; /* bcl 20,31,$+4 */ \ |
||||
.long 0xa602487d; /* mflr r10 */ \ |
||||
.long 0x14004a39; /* addi r10,r10,20 */ \ |
||||
.long 0xa64b5a7d; /* mthsrr0 r10 */ \ |
||||
.long 0xa64b7b7d; /* mthsrr1 r11 */ \ |
||||
.long 0x2402004c; /* hrfid */ \ |
||||
191: |
||||
|
||||
|
||||
/* Load an immediate 64-bit value into a register */ |
||||
#define LOAD_IMM64(r, e) \ |
||||
lis r,(e)@highest; \ |
||||
ori r,r,(e)@higher; \ |
||||
rldicr r,r, 32, 31; \ |
||||
oris r,r, (e)@h; \ |
||||
ori r,r, (e)@l; |
||||
|
||||
.section ".head","ax" |
||||
|
||||
. = 0 |
||||
.global _start |
||||
_start: |
||||
FIXUP_ENDIAN |
||||
b boot_entry |
||||
|
||||
.global boot_entry |
||||
boot_entry: |
||||
/* setup stack */ |
||||
LOAD_IMM64(%r1, STACK_TOP - 0x100) |
||||
LOAD_IMM64(%r12, main) |
||||
mtctr %r12, |
||||
bctrl |
||||
b . |
||||
|
||||
#define EXCEPTION(nr) \ |
||||
.= nr ;\ |
||||
b . |
||||
|
||||
/* More exception stubs */ |
||||
EXCEPTION(0x300) |
||||
EXCEPTION(0x380) |
||||
EXCEPTION(0x400) |
||||
EXCEPTION(0x480) |
||||
EXCEPTION(0x500) |
||||
EXCEPTION(0x600) |
||||
EXCEPTION(0x700) |
||||
EXCEPTION(0x800) |
||||
EXCEPTION(0x900) |
||||
EXCEPTION(0x980) |
||||
EXCEPTION(0xa00) |
||||
EXCEPTION(0xb00) |
||||
EXCEPTION(0xc00) |
||||
EXCEPTION(0xd00) |
||||
EXCEPTION(0xe00) |
||||
EXCEPTION(0xe20) |
||||
EXCEPTION(0xe40) |
||||
EXCEPTION(0xe60) |
||||
EXCEPTION(0xe80) |
||||
EXCEPTION(0xf00) |
||||
EXCEPTION(0xf20) |
||||
EXCEPTION(0xf40) |
||||
EXCEPTION(0xf60) |
||||
EXCEPTION(0xf80) |
||||
#if 0 |
||||
EXCEPTION(0x1000) |
||||
EXCEPTION(0x1100) |
||||
EXCEPTION(0x1200) |
||||
EXCEPTION(0x1300) |
||||
EXCEPTION(0x1400) |
||||
EXCEPTION(0x1500) |
||||
EXCEPTION(0x1600) |
||||
#endif |
@ -0,0 +1,146 @@
@@ -0,0 +1,146 @@
|
||||
#include <unistd.h> |
||||
#include <string.h> |
||||
#include <stdint.h> |
||||
#include <stdbool.h> |
||||
|
||||
/* |
||||
* Core UART functions to implement for a port |
||||
*/ |
||||
|
||||
static uint64_t potato_uart_base; |
||||
|
||||
#define PROC_FREQ 100000000 |
||||
#define UART_FREQ 115200 |
||||
#define UART_BASE 0xc0002000 |
||||
|
||||
#define POTATO_CONSOLE_TX 0x00 |
||||
#define POTATO_CONSOLE_RX 0x08 |
||||
#define POTATO_CONSOLE_STATUS 0x10 |
||||
#define POTATO_CONSOLE_STATUS_RX_EMPTY 0x01 |
||||
#define POTATO_CONSOLE_STATUS_TX_EMPTY 0x02 |
||||
#define POTATO_CONSOLE_STATUS_RX_FULL 0x04 |
||||
#define POTATO_CONSOLE_STATUS_TX_FULL 0x08 |
||||
#define POTATO_CONSOLE_CLOCK_DIV 0x18 |
||||
#define POTATO_CONSOLE_IRQ_EN 0x20 |
||||
|
||||
static uint64_t potato_uart_reg_read(int offset) |
||||
{ |
||||
uint64_t addr; |
||||
uint64_t val; |
||||
|
||||
addr = potato_uart_base + offset; |
||||
|
||||
val = *(volatile uint64_t *)addr; |
||||
|
||||
return val; |
||||
} |
||||
|
||||
static void potato_uart_reg_write(int offset, uint64_t val) |
||||
{ |
||||
uint64_t addr; |
||||
|
||||
addr = potato_uart_base + offset; |
||||
|
||||
*(volatile uint64_t *)addr = val; |
||||
} |
||||
|
||||
static int potato_uart_rx_empty(void) |
||||
{ |
||||
uint64_t val; |
||||
|
||||
val = potato_uart_reg_read(POTATO_CONSOLE_STATUS); |
||||
|
||||
if (val & POTATO_CONSOLE_STATUS_RX_EMPTY) |
||||
return 1; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static int potato_uart_tx_full(void) |
||||
{ |
||||
uint64_t val; |
||||
|
||||
val = potato_uart_reg_read(POTATO_CONSOLE_STATUS); |
||||
|
||||
if (val & POTATO_CONSOLE_STATUS_TX_FULL) |
||||
return 1; |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
static char potato_uart_read(void) |
||||
{ |
||||
uint64_t val; |
||||
|
||||
val = potato_uart_reg_read(POTATO_CONSOLE_RX); |
||||
|
||||
return (char)(val & 0x000000ff); |
||||
} |
||||
|
||||
static void potato_uart_write(char c) |
||||
{ |
||||
uint64_t val; |
||||
|
||||
val = c; |
||||
|
||||
potato_uart_reg_write(POTATO_CONSOLE_TX, val); |
||||
} |
||||
|
||||
static unsigned long potato_uart_divisor(unsigned long proc_freq, unsigned long uart_freq) |
||||
{ |
||||
return proc_freq / (uart_freq * 16) - 1; |
||||
} |
||||
|
||||
void potato_uart_init(void) |
||||
{ |
||||
potato_uart_base = UART_BASE; |
||||
|
||||
potato_uart_reg_write(POTATO_CONSOLE_CLOCK_DIV, potato_uart_divisor(PROC_FREQ, UART_FREQ)); |
||||
} |
||||
|
||||
int getchar(void) |
||||
{ |
||||
while (potato_uart_rx_empty()) |
||||
/* Do nothing */ ; |
||||
|
||||
return potato_uart_read(); |
||||
} |
||||
|
||||
void putchar(unsigned char c) |
||||
{ |
||||
while (potato_uart_tx_full()) |
||||
/* Do Nothing */; |
||||
|
||||
potato_uart_write(c); |
||||
} |
||||
|
||||
void putstr(const char *str, unsigned long len) |
||||
{ |
||||
for (unsigned long i = 0; i < len; i++) { |
||||
putchar(str[i]); |
||||
} |
||||
} |
||||
|
||||
size_t strlen(const char *s) |
||||
{ |
||||
size_t len = 0; |
||||
|
||||
while (*s++) |
||||
len++; |
||||
|
||||
return len; |
||||
} |
||||
|
||||
#define HELLO_WORLD "Hello World\r\n" |
||||
|
||||
int main(void) |
||||
{ |
||||
potato_uart_init(); |
||||
|
||||
putstr(HELLO_WORLD, strlen(HELLO_WORLD)); |
||||
|
||||
while (1) { |
||||
unsigned char c = getchar(); |
||||
putchar(c); |
||||
} |
||||
} |
Loading…
Reference in new issue