rust_lib_demo: Use common console code

Use a symlink to share the console code in hello_world. Not ideal,
but we can improve on it later.

Signed-off-by: Anton Blanchard <anton@linux.ibm.com>
pull/160/head
Anton Blanchard 5 years ago committed by Anton Blanchard
parent c37a4c16db
commit 90ed7adf58

@ -1,15 +1,15 @@
ARCH = $(shell uname -m) ARCH = $(shell uname -m)
ifneq ("$(ARCH)", "ppc64") ifneq ("$(ARCH)", "ppc64")
ifneq ("$(ARCH)", "ppc64le") ifneq ("$(ARCH)", "ppc64le")
CROSS_COMPILE = powerpc64le-linux-gnu- CROSS_COMPILE ?= powerpc64le-linux-
endif endif
endif endif


CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld LD = $(CROSS_COMPILE)ld
OBJCOPY = $(CROSS_COMPILE)objcopy 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 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) ASFLAGS = $(CFLAGS)
LDFLAGS = -T powerpc.lds LDFLAGS = -T powerpc.lds


@ -20,7 +20,7 @@ all: hello_world.hex
run: run:
-ln -sf hello_world.bin main_ram.bin -ln -sf hello_world.bin main_ram.bin
../core_tb > /dev/null ../core_tb > /dev/null

$(RUSTLIB): src/lib.rs $(RUSTLIB): src/lib.rs
RUSTFLAGS="-C target-feature=-vsx,-altivec,-hard-float" xargo build --release RUSTFLAGS="-C target-feature=-vsx,-altivec,-hard-float" xargo build --release


@ -30,14 +30,14 @@ size:
dump: dump:
powerpc64le-linux-gnu-objdump -S hello_world.elf | less powerpc64le-linux-gnu-objdump -S hello_world.elf | less


hello_world.elf: hello_world.o head.o $(RUSTLIB) hello_world.elf: hello_world.o console.o head.o $(RUSTLIB)
$(LD) $(LDFLAGS) -o hello_world.elf hello_world.o head.o $(RUSTLIB) $(LD) $(LDFLAGS) -o $@ $^


hello_world.bin: hello_world.elf hello_world.bin: hello_world.elf
$(OBJCOPY) -O binary hello_world.elf hello_world.bin $(OBJCOPY) -O binary $^ $@


hello_world.hex: hello_world.bin hello_world.hex: hello_world.bin
./bin2hex.py hello_world.bin > hello_world.hex ../scripts/bin2hex.py $^ > $@


clean: clean:
cargo clean cargo clean

@ -0,0 +1 @@
../hello_world/console.c

@ -0,0 +1 @@
../hello_world/console.h

@ -1,135 +1,7 @@
#include <unistd.h>
#include <string.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>


/* #include "console.h"
* Core UART functions to implement for a port
*/

static uint64_t potato_uart_base;

#define PROC_FREQ 50000000
#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;
}


void rust_main(); void rust_main();


@ -148,7 +20,6 @@ void init_bss()
} }
} }



#define HELLO_WORLD "Hello World\r\n" #define HELLO_WORLD "Hello World\r\n"


int main(void) int main(void)

Loading…
Cancel
Save