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 $@ $^
+++ /dev/null
-#include <stdint.h>
-#include <stdbool.h>
-
-#include "console.h"
-#include "microwatt_soc.h"
-#include "io.h"
-
-#define UART_FREQ 115200
-
-/*
- * Core UART functions to implement for a port
- */
-
-static uint64_t potato_uart_base;
-
-static uint64_t potato_uart_reg_read(int offset)
-{
- return readq(potato_uart_base + offset);
-}
-
-static void potato_uart_reg_write(int offset, uint64_t val)
-{
- writeq(val, potato_uart_base + offset);
-}
-
-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)
-{
- uint64_t proc_freq;
-
- potato_uart_base = UART_BASE;
- proc_freq = readq(SYSCON_BASE + SYS_REG_CLKINFO);
-
- potato_uart_reg_write(POTATO_CONSOLE_CLOCK_DIV, potato_uart_divisor(proc_freq, UART_FREQ));
-}
-
-void potato_uart_irq_en(void)
-{
- potato_uart_reg_write(POTATO_CONSOLE_IRQ_EN, 0xff);
-}
-
-void potato_uart_irq_dis(void)
-{
- potato_uart_reg_write(POTATO_CONSOLE_IRQ_EN, 0x00);
-}
-
-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;
-}
+++ /dev/null
-#include <stddef.h>
-
-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);
-size_t strlen(const char *s);
#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();
--- /dev/null
+#include <stddef.h>
+
+void potato_uart_init(void);
+void potato_uart_irq_en(void);
+void potato_uart_irq_dis(void);
+int getchar(void);
+int putchar(int c);
+int puts(const char *str);
+size_t strlen(const char *s);
--- /dev/null
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "console.h"
+#include "microwatt_soc.h"
+#include "io.h"
+
+#define UART_FREQ 115200
+
+/*
+ * Core UART functions to implement for a port
+ */
+
+static uint64_t potato_uart_base;
+
+static uint64_t potato_uart_reg_read(int offset)
+{
+ return readq(potato_uart_base + offset);
+}
+
+static void potato_uart_reg_write(int offset, uint64_t val)
+{
+ writeq(val, potato_uart_base + offset);
+}
+
+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)
+{
+ uint64_t proc_freq;
+
+ potato_uart_base = UART_BASE;
+ proc_freq = readq(SYSCON_BASE + SYS_REG_CLKINFO);
+
+ potato_uart_reg_write(POTATO_CONSOLE_CLOCK_DIV, potato_uart_divisor(proc_freq, UART_FREQ));
+}
+
+void potato_uart_irq_en(void)
+{
+ potato_uart_reg_write(POTATO_CONSOLE_IRQ_EN, 0xff);
+}
+
+void potato_uart_irq_dis(void)
+{
+ potato_uart_reg_write(POTATO_CONSOLE_IRQ_EN, 0x00);
+}
+
+int getchar(void)
+{
+ while (potato_uart_rx_empty())
+ /* Do nothing */ ;
+
+ return potato_uart_read();
+}
+
+int putchar(int c)
+{
+ while (potato_uart_tx_full())
+ /* Do Nothing */;
+
+ potato_uart_write(c);
+ return c;
+}
+
+int puts(const char *str)
+{
+ 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)
+{
+ size_t len = 0;
+
+ while (*s++)
+ len++;
+
+ return len;
+}
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
$(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 $@, $@)
-../hello_world/console.c
\ No newline at end of file
+../lib/console.c
\ No newline at end of file
-../hello_world/console.h
\ No newline at end of file
+../include/console.h
\ No newline at end of file
}
}
-#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();
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
#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);
// 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)
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;
}
#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)
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;
}
#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)
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;
}
}
#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"); \
}
#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
}
// 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;
}
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;
}
#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,
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++;
}