Move libbase/console.c logic to libc/iob.c

This commit is contained in:
Michal Sieron 2021-07-29 12:34:18 +02:00
parent 768961ec59
commit a6094fd418
3 changed files with 61 additions and 9 deletions

View File

@ -12,7 +12,6 @@ typedef int (*console_read_nonblock_hook)(void);
void console_set_write_hook(console_write_hook h); void console_set_write_hook(console_write_hook h);
void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn); void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn);
char readchar(void);
int readchar_nonblock(void); int readchar_nonblock(void);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -4,7 +4,6 @@ include $(SOC_DIRECTORY)/software/common.mak
OBJECTS = exception.o \ OBJECTS = exception.o \
crc16.o \ crc16.o \
crc32.o \ crc32.o \
console.o \
system.o \ system.o \
id.o \ id.o \
uart.o \ uart.o \

View File

@ -1,30 +1,84 @@
#include <base/console.h>
#include <stdio.h> #include <stdio.h>
//#include <sys/cdefs.h>
#include <base/console.h>
#include <base/uart.h>
#include <generated/csr.h>
static console_write_hook write_hook;
static console_read_hook read_hook;
static console_read_nonblock_hook read_nonblock_hook;
void console_set_write_hook(console_write_hook h)
{
write_hook = h;
}
void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn)
{
read_hook = r;
read_nonblock_hook = rn;
}
#ifdef CSR_UART_BASE
static int static int
dummy_putc(char c, FILE *file) dummy_putc(char c, FILE *file)
{ {
(void) file; (void) file;
return base_putchar(c); uart_write(c);
if(write_hook != NULL)
write_hook(c);
if (c == '\n')
dummy_putc('\r', NULL);
return c;
} }
static int static int
dummy_getc(FILE *file) dummy_getc(FILE *file)
{ {
(void) file; (void) file;
return readchar(); while(1) {
if(uart_read_nonblock())
return uart_read();
if((read_nonblock_hook != NULL) && read_nonblock_hook())
return read_hook();
}
}
int readchar_nonblock(void)
{
return (uart_read_nonblock()
|| ((read_nonblock_hook != NULL) && read_nonblock_hook()));
}
#else
static int
dummy_putc(char c, FILE *file)
{
(void) file;
if(write_hook != NULL)
write_hook(c);
return c;
} }
static int static int
dummy_flush(FILE *file) dummy_getc(FILE *file)
{ {
(void) file; (void) file;
return 0; while(1) {
if((read_nonblock_hook != NULL) && read_nonblock_hook())
return read_hook();
}
} }
static FILE __stdio = FDEV_SETUP_STREAM(dummy_putc, dummy_getc, dummy_flush, _FDEV_SETUP_RW); int readchar_nonblock(void)
{
return ((read_nonblock_hook != NULL) && read_nonblock_hook());
}
#endif
static FILE __stdio = FDEV_SETUP_STREAM(dummy_putc, dummy_getc, NULL, _FDEV_SETUP_RW);
FILE *const __iob[3] = { &__stdio, &__stdio, &__stdio }; FILE *const __iob[3] = { &__stdio, &__stdio, &__stdio };