Added syscalls.

This commit is contained in:
imi415 2022-08-11 09:49:12 +08:00
parent 836a9d3add
commit 3d119e132c
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
3 changed files with 78 additions and 14 deletions

View File

@ -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"
)

View File

@ -1,7 +1,6 @@
#include <stdint.h>
#include <stdio.h>
#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;
}

69
src/syscalls.c Normal file
View File

@ -0,0 +1,69 @@
#include <sys/errno.h>
#include <sys/stat.h>
#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;
}