From 3d119e132ced2607788c4bbd149198badcb90a4d Mon Sep 17 00:00:00 2001 From: imi415 Date: Thu, 11 Aug 2022 09:49:12 +0800 Subject: [PATCH] Added syscalls. --- CMakeLists.txt | 2 +- src/main.c | 21 ++++++--------- src/syscalls.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 src/syscalls.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 77f0950..571b745 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,10 +7,10 @@ project(hello) set(TARGET_LDSCRIPT "${CMAKE_SOURCE_DIR}/stx7105.ld") set(TARGET_SOURCES - "lib/printf/printf.c" "src/main.c" "src/stx7105_exc.c" "src/stx7105_utils.c" + "src/syscalls.c" "startup_stx7105.S" ) diff --git a/src/main.c b/src/main.c index 0e5d0cb..a3104e6 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,6 @@ #include #include -#include "printf.h" #include "stx7105.h" #include "stx7105_utils.h" @@ -16,8 +15,8 @@ #define SYSTEM_CONFIG34 (0xFE001188U) /* PIO4 */ #define SYSTEM_CONFIG7 (0xFE00111CU) /* RXSEL */ -#define MEMTEST_START 0x80010000 -#define MEMTEST_END 0x8FFE0000 +#define MEMTEST_START 0x82000000 +#define MEMTEST_END 0x8F000000 void uart_init(void) { PIO4->CLR_PC0 = 1U; /* PC = 110, AFOUT, PP */ @@ -39,19 +38,19 @@ static void memory_test(void) { *(uint32_t *)i = i; if (i % 0x10000 == 0U) { - printf("Write to 0x%08x...\r\n", i); + printf("Write to 0x%08lx...\r\n", i); } } for (uint32_t i = MEMTEST_START; i < MEMTEST_END; i += 4) { if (*(uint32_t *)i != i) { - printf("Read back error at 0x%08x\r\n", i); + printf("Read back error at 0x%08lx\r\n", i); return; } if (i % 0x10000 == 0U) { - printf("Read from 0x%08x...\r\n", i); + printf("Read from 0x%08lx...\r\n", i); } } } @@ -60,6 +59,9 @@ int main(void) { init_led(LED_RED_GPIO, LED_RED_PIN, 0U); init_led(LED_BLUE_GPIO, LED_BLUE_PIN, 0U); + setbuf(stdout,NULL); + setbuf(stderr,NULL); + uart_init(); printf("Hello world\r\n"); @@ -86,10 +88,3 @@ int main(void) { return 0; } - -void _putchar(char ch) { - while (CONSOLE_ASC->STA & 1 << 9U) { - // wait for TX FIFO slot. - } - CONSOLE_ASC->TX_BUF = ch; -} \ No newline at end of file diff --git a/src/syscalls.c b/src/syscalls.c new file mode 100644 index 0000000..a759e82 --- /dev/null +++ b/src/syscalls.c @@ -0,0 +1,69 @@ +#include +#include + +#include "stx7105.h" + +#define CONSOLE_ASC ASC2 + +#define HEAP_SIZE 0x10000 + +extern char _end; +static uint32_t s_heap_size = 0U; + +caddr_t _sbrk(int incr) { + char *heap_base = &_end; + + caddr_t ret = heap_base + s_heap_size; + + if (s_heap_size + incr >= HEAP_SIZE) { + return (void *)(-ENOMEM); + } + + s_heap_size += incr; + + return ret; +} + +int _write(int file, char *ptr, int len) { + for (int i = 0; i < len; i++) { + while (CONSOLE_ASC->STA & 1 << 9U) { + // wait for TX FIFO slot. + } + CONSOLE_ASC->TX_BUF = ptr[i]; + } + return len; +} + +int _open(const char *name, int flags, int mode) { + return -1; +} + + +int _read(int file, char *ptr, int len) { + return 0; +} + +int _lseek(int file, int ptr, int dir) { + return 0; +} + +int _close(int file) { + return -1; +} + +int _isatty(int file) { + return -1; +} + +pid_t _getpid(void) { + return -1; +} + +void _kill(int pid, int sig) { + return; +} + +int _fstat(int file, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +}