mirror of
https://github.com/antonblanchard/microwatt.git
synced 2026-03-30 19:05:04 +00:00
Merge pull request #176 from antonblanchard/console-improv
Console improvements from Ben
This commit is contained in:
@@ -15,6 +15,9 @@ LDFLAGS = -T powerpc.lds
|
||||
|
||||
all: hello_world.hex
|
||||
|
||||
console.o: ../lib/console.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
||||
|
||||
hello_world.elf: hello_world.o head.o console.o
|
||||
$(LD) $(LDFLAGS) -o $@ $^
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@
|
||||
|
||||
#include "console.h"
|
||||
|
||||
#define HELLO_WORLD "Hello World\r\n"
|
||||
#define HELLO_WORLD "Hello World\n"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
potato_uart_init();
|
||||
|
||||
putstr(HELLO_WORLD, strlen(HELLO_WORLD));
|
||||
puts(HELLO_WORLD);
|
||||
|
||||
while (1) {
|
||||
unsigned char c = getchar();
|
||||
|
||||
@@ -4,6 +4,6 @@ void potato_uart_init(void);
|
||||
void potato_uart_irq_en(void);
|
||||
void potato_uart_irq_dis(void);
|
||||
int getchar(void);
|
||||
void putchar(unsigned char c);
|
||||
void putstr(const char *str, unsigned long len);
|
||||
int putchar(int c);
|
||||
int puts(const char *str);
|
||||
size_t strlen(const char *s);
|
||||
@@ -98,19 +98,26 @@ int getchar(void)
|
||||
return potato_uart_read();
|
||||
}
|
||||
|
||||
void putchar(unsigned char c)
|
||||
int putchar(int c)
|
||||
{
|
||||
while (potato_uart_tx_full())
|
||||
/* Do Nothing */;
|
||||
|
||||
potato_uart_write(c);
|
||||
return c;
|
||||
}
|
||||
|
||||
void putstr(const char *str, unsigned long len)
|
||||
int puts(const char *str)
|
||||
{
|
||||
for (unsigned long i = 0; i < len; i++) {
|
||||
putchar(str[i]);
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; *str; i++) {
|
||||
char c = *(str++);
|
||||
if (c == 10)
|
||||
putchar(13);
|
||||
putchar(c);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t strlen(const char *s)
|
||||
@@ -4,7 +4,7 @@ include variables.mak
|
||||
OBJ = $(BUILD_DIR)/obj
|
||||
|
||||
PROGRAM = sdram_init
|
||||
OBJECTS = $(OBJ)/head.o $(OBJ)/main.o $(OBJ)/sdram.o
|
||||
OBJECTS = $(OBJ)/head.o $(OBJ)/main.o $(OBJ)/sdram.o $(OBJ)/console.o
|
||||
|
||||
#### Compiler
|
||||
|
||||
@@ -50,10 +50,12 @@ all: objdir $(OBJ)/$(PROGRAM).hex
|
||||
|
||||
$(OBJ)/sdram.o: $(LXSRC_DIR)/sdram.c
|
||||
$(call Q,CC, $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@, $@)
|
||||
$(OBJ)/%.o : $(SRC_DIR)/%.S
|
||||
$(call Q,AS, $(CC) $(ASFLAGS) -c $< -o $@, $@)
|
||||
$(OBJ)/console.o: $(SRC_DIR)/../../../lib/console.c
|
||||
$(call Q,CC, $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@, $@)
|
||||
$(OBJ)/%.o : $(SRC_DIR)/%.c
|
||||
$(call Q,CC, $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@, $@)
|
||||
$(OBJ)/%.o : $(SRC_DIR)/%.S
|
||||
$(call Q,AS, $(CC) $(ASFLAGS) -c $< -o $@, $@)
|
||||
$(OBJ)/%.o : $(SRC_DIR)/libc/src/%.c
|
||||
$(call Q,CC, $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@, $@)
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
../hello_world/console.c
|
||||
../lib/console.c
|
||||
@@ -1 +1 @@
|
||||
../hello_world/console.h
|
||||
../include/console.h
|
||||
@@ -20,14 +20,14 @@ void init_bss()
|
||||
}
|
||||
}
|
||||
|
||||
#define HELLO_WORLD "Hello World\r\n"
|
||||
#define HELLO_WORLD "Hello World\n"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
init_bss();
|
||||
potato_uart_init();
|
||||
|
||||
putstr(HELLO_WORLD, strlen(HELLO_WORLD));
|
||||
puts(HELLO_WORLD);
|
||||
|
||||
rust_main();
|
||||
crash();
|
||||
|
||||
@@ -9,14 +9,17 @@ 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 -I ../../hello_world -I ../../include
|
||||
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 -I ../../include
|
||||
ASFLAGS = $(CFLAGS)
|
||||
LDFLAGS = -T powerpc.lds
|
||||
|
||||
all: $(TEST).hex
|
||||
|
||||
$(TEST).elf: $(TEST).o head.o ../../hello_world/console.o
|
||||
$(LD) $(LDFLAGS) -o $(TEST).elf $(TEST).o head.o ../../hello_world/console.o
|
||||
console.o: ../../lib/console.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
||||
|
||||
$(TEST).elf: $(TEST).o head.o console.o
|
||||
$(LD) $(LDFLAGS) -o $(TEST).elf $(TEST).o head.o console.o
|
||||
|
||||
$(TEST).bin: $(TEST).elf
|
||||
$(OBJCOPY) -O binary $(TEST).elf $(TEST).bin
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
#include "console.h"
|
||||
|
||||
#define TEST "Test "
|
||||
#define PASS "PASS\r\n"
|
||||
#define FAIL "FAIL\r\n"
|
||||
#define PASS "PASS\n"
|
||||
#define FAIL "FAIL\n"
|
||||
|
||||
extern int dec_test_1(void);
|
||||
extern int dec_test_2(void);
|
||||
@@ -15,10 +15,10 @@ extern int dec_test_3(void);
|
||||
// i < 100
|
||||
void print_test_number(int i)
|
||||
{
|
||||
putstr(TEST, strlen(TEST));
|
||||
puts(TEST);
|
||||
putchar(48 + i/10);
|
||||
putchar(48 + i%10);
|
||||
putstr(":", 1);
|
||||
putchar(':');
|
||||
}
|
||||
|
||||
int main(void)
|
||||
@@ -30,24 +30,24 @@ int main(void)
|
||||
print_test_number(1);
|
||||
if (dec_test_1() != 0) {
|
||||
fail = 1;
|
||||
putstr(FAIL, strlen(FAIL));
|
||||
puts(FAIL);
|
||||
} else
|
||||
putstr(PASS, strlen(PASS));
|
||||
puts(PASS);
|
||||
|
||||
print_test_number(2);
|
||||
if (dec_test_2() != 0) {
|
||||
fail = 1;
|
||||
putstr(FAIL, strlen(FAIL));
|
||||
puts(FAIL);
|
||||
} else
|
||||
putstr(PASS, strlen(PASS));
|
||||
puts(PASS);
|
||||
|
||||
|
||||
print_test_number(3);
|
||||
if (dec_test_3() != 0) {
|
||||
fail = 1;
|
||||
putstr(FAIL, strlen(FAIL));
|
||||
puts(FAIL);
|
||||
} else
|
||||
putstr(PASS, strlen(PASS));
|
||||
puts(PASS);
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
@@ -5,18 +5,18 @@
|
||||
#include "console.h"
|
||||
|
||||
#define TEST "Test "
|
||||
#define PASS "PASS\r\n"
|
||||
#define FAIL "FAIL\r\n"
|
||||
#define PASS "PASS\n"
|
||||
#define FAIL "FAIL\n"
|
||||
|
||||
extern int ill_test_1(void);
|
||||
|
||||
// i < 100
|
||||
void print_test_number(int i)
|
||||
{
|
||||
putstr(TEST, strlen(TEST));
|
||||
puts(TEST);
|
||||
putchar(48 + i/10);
|
||||
putchar(48 + i%10);
|
||||
putstr(":", 1);
|
||||
putchar(':');
|
||||
}
|
||||
|
||||
int main(void)
|
||||
@@ -28,9 +28,9 @@ int main(void)
|
||||
print_test_number(1);
|
||||
if (ill_test_1() != 0) {
|
||||
fail = 1;
|
||||
putstr(FAIL, strlen(FAIL));
|
||||
puts(FAIL);
|
||||
} else
|
||||
putstr(PASS, strlen(PASS));
|
||||
puts(PASS);
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
@@ -5,18 +5,18 @@
|
||||
#include "console.h"
|
||||
|
||||
#define TEST "Test "
|
||||
#define PASS "PASS\r\n"
|
||||
#define FAIL "FAIL\r\n"
|
||||
#define PASS "PASS\n"
|
||||
#define FAIL "FAIL\n"
|
||||
|
||||
extern int sc_test_1(void);
|
||||
|
||||
// i < 100
|
||||
void print_test_number(int i)
|
||||
{
|
||||
putstr(TEST, strlen(TEST));
|
||||
puts(TEST);
|
||||
putchar(48 + i/10);
|
||||
putchar(48 + i%10);
|
||||
putstr(":", 1);
|
||||
putchar(':');
|
||||
}
|
||||
|
||||
int main(void)
|
||||
@@ -28,9 +28,9 @@ int main(void)
|
||||
print_test_number(1);
|
||||
if (sc_test_1() != 0) {
|
||||
fail = 1;
|
||||
putstr(FAIL, strlen(FAIL));
|
||||
puts(FAIL);
|
||||
} else
|
||||
putstr(PASS, strlen(PASS));
|
||||
puts(PASS);
|
||||
|
||||
return fail;
|
||||
}
|
||||
|
||||
@@ -29,29 +29,29 @@ void print_number(unsigned int i) // only for i = 0-999
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEBUG_STR "\r\nDEBUG: "
|
||||
#define DEBUG_STR "\nDEBUG: "
|
||||
void debug_print(int i)
|
||||
{
|
||||
putstr(DEBUG_STR, strlen(DEBUG_STR));
|
||||
puts(DEBUG_STR);
|
||||
print_number(i);
|
||||
putstr("\r\n", 2);
|
||||
puts("\n");
|
||||
}
|
||||
|
||||
#define debug_putstr(a, b) putstr(a,b)
|
||||
#define debug_puts(a) puts(a)
|
||||
#else
|
||||
#define debug_putstr(a, b)
|
||||
#define debug_puts(a)
|
||||
#define debug_print(i)
|
||||
#endif
|
||||
|
||||
#define ASSERT_FAIL "() ASSERT_FAILURE!\r\n "
|
||||
#define ASSERT_FAIL "() ASSERT_FAILURE!\n "
|
||||
#define assert(cond) \
|
||||
if (!(cond)) { \
|
||||
putstr(__FILE__, strlen(__FILE__)); \
|
||||
putstr(":", 1); \
|
||||
puts(__FILE__); \
|
||||
putchar(':'); \
|
||||
print_number(__LINE__); \
|
||||
putstr(":", 1); \
|
||||
putstr(__FUNCTION__, strlen(__FUNCTION__));\
|
||||
putstr(ASSERT_FAIL, strlen(ASSERT_FAIL)); \
|
||||
putchar(':'); \
|
||||
puts(__FUNCTION__);\
|
||||
puts(ASSERT_FAIL); \
|
||||
__asm__ ("attn"); \
|
||||
}
|
||||
|
||||
@@ -62,17 +62,17 @@ volatile uint64_t isrs_run;
|
||||
#define ISR_UART 0x0000000000000002
|
||||
#define ISR_SPURIOUS 0x0000000000000004
|
||||
|
||||
#define IPI "IPI\r\n"
|
||||
#define IPI "IPI\n"
|
||||
void ipi_isr(void) {
|
||||
debug_putstr(IPI, strlen(IPI));
|
||||
debug_puts(IPI);
|
||||
|
||||
isrs_run |= ISR_IPI;
|
||||
}
|
||||
|
||||
|
||||
#define UART "UART\r\n"
|
||||
#define UART "UART\n"
|
||||
void uart_isr(void) {
|
||||
debug_putstr(UART, strlen(UART));
|
||||
debug_puts(UART);
|
||||
|
||||
potato_uart_irq_dis(); // disable interrupt to ack it
|
||||
|
||||
@@ -80,9 +80,9 @@ void uart_isr(void) {
|
||||
}
|
||||
|
||||
// The hardware doesn't support this but it's part of XICS so add it.
|
||||
#define SPURIOUS "SPURIOUS\r\n"
|
||||
#define SPURIOUS "SPURIOUS\n"
|
||||
void spurious_isr(void) {
|
||||
debug_putstr(SPURIOUS, strlen(SPURIOUS));
|
||||
debug_puts(SPURIOUS);
|
||||
|
||||
isrs_run |= ISR_SPURIOUS;
|
||||
}
|
||||
@@ -113,9 +113,9 @@ void isr(void)
|
||||
xirr = xics_read32(XICS_XIRR); // read hardware irq source
|
||||
|
||||
#ifdef DEBUG
|
||||
putstr(ISR, strlen(ISR));
|
||||
puts(ISR);
|
||||
print_number(xirr & 0xff);
|
||||
putstr("\r\n", 2);
|
||||
puts("\n");
|
||||
#endif
|
||||
|
||||
op = isr_table;
|
||||
@@ -221,8 +221,8 @@ int xics_test_2(void)
|
||||
}
|
||||
|
||||
#define TEST "Test "
|
||||
#define PASS "PASS\r\n"
|
||||
#define FAIL "FAIL\r\n"
|
||||
#define PASS "PASS\n"
|
||||
#define FAIL "FAIL\n"
|
||||
|
||||
int (*tests[])(void) = {
|
||||
xics_test_0,
|
||||
@@ -246,14 +246,14 @@ int main(void)
|
||||
if (!t)
|
||||
break;
|
||||
|
||||
putstr(TEST, strlen(TEST));
|
||||
puts(TEST);
|
||||
print_number(i);
|
||||
putstr(": ", 1);
|
||||
putchar(':');
|
||||
if (t() != 0) {
|
||||
fail = 1;
|
||||
putstr(FAIL, strlen(FAIL));
|
||||
puts(FAIL);
|
||||
} else
|
||||
putstr(PASS, strlen(PASS));
|
||||
puts(PASS);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user