[console][io] Add an optional global input queue.
In this model, getc reads from a global input buffer and the uart posts data to this buffer. This commit also enables the global input queue for STM32F7 and QEMU-Virt. Tested on STM32F7/Dartuino and QEMU-ARM A15 with both CONSOLE_HAS_INPUT_BUFFER=1 and CONSOLE_HAS_INPUT_BUFFER=0
This commit is contained in:
@@ -28,10 +28,12 @@
|
||||
#include <assert.h>
|
||||
#include <list.h>
|
||||
#include <string.h>
|
||||
#include <lib/cbuf.h>
|
||||
#include <arch/ops.h>
|
||||
#include <platform.h>
|
||||
#include <platform/debug.h>
|
||||
#include <kernel/thread.h>
|
||||
#include <lk/init.h>
|
||||
|
||||
/* routines for dealing with main console io */
|
||||
|
||||
@@ -44,6 +46,16 @@
|
||||
static spin_lock_t print_spin_lock = 0;
|
||||
static struct list_node print_callbacks = LIST_INITIAL_VALUE(print_callbacks);
|
||||
|
||||
#if CONSOLE_HAS_INPUT_BUFFER
|
||||
#ifndef CONSOLE_BUF_LEN
|
||||
#define CONSOLE_BUF_LEN 256
|
||||
#endif
|
||||
|
||||
/* global input circular buffer */
|
||||
cbuf_t console_input_cbuf;
|
||||
static uint8_t console_cbuf_buf[CONSOLE_BUF_LEN];
|
||||
#endif // CONSOLE_HAS_INPUT_BUFFER
|
||||
|
||||
/* print lock must be held when invoking out, outs, outc */
|
||||
static void out_count(const char *str, size_t len)
|
||||
{
|
||||
@@ -100,13 +112,27 @@ static ssize_t __debug_stdio_read(io_handle_t *io, char *s, size_t len)
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
#if CONSOLE_HAS_INPUT_BUFFER
|
||||
ssize_t err = cbuf_read(&console_input_cbuf, s, len, true);
|
||||
return err;
|
||||
#else
|
||||
int err = platform_dgetc(s, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if CONSOLE_HAS_INPUT_BUFFER
|
||||
void console_init_hook(uint level)
|
||||
{
|
||||
cbuf_initialize_etc(&console_input_cbuf, sizeof(console_cbuf_buf), console_cbuf_buf);
|
||||
}
|
||||
|
||||
LK_INIT_HOOK(console, console_init_hook, LK_INIT_LEVEL_PLATFORM_EARLY - 1);
|
||||
#endif
|
||||
|
||||
/* global console io handle */
|
||||
static const io_handle_hooks_t console_io_hooks = {
|
||||
.write = __debug_stdio_write,
|
||||
@@ -114,3 +140,4 @@ static const io_handle_hooks_t console_io_hooks = {
|
||||
};
|
||||
|
||||
io_handle_t console_io = IO_HANDLE_INITIAL_VALUE(&console_io_hooks);
|
||||
|
||||
|
||||
@@ -70,5 +70,14 @@ static inline void io_handle_init(io_handle_t *io, io_handle_hooks_t *hooks)
|
||||
/* the main console io handle */
|
||||
extern io_handle_t console_io;
|
||||
|
||||
#ifndef CONSOLE_HAS_INPUT_BUFFER
|
||||
#define CONSOLE_HAS_INPUT_BUFFER 0
|
||||
#endif
|
||||
|
||||
#if CONSOLE_HAS_INPUT_BUFFER
|
||||
/* main input circular buffer that acts as the default input queue */
|
||||
typedef struct cbuf cbuf_t;
|
||||
extern cbuf_t console_input_cbuf;
|
||||
#endif
|
||||
|
||||
__END_CDECLS
|
||||
|
||||
@@ -3,6 +3,7 @@ LOCAL_DIR := $(GET_LOCAL_DIR)
|
||||
MODULE := $(LOCAL_DIR)
|
||||
|
||||
MODULE_DEPS := \
|
||||
lib/cbuf
|
||||
|
||||
MODULE_SRCS += \
|
||||
$(LOCAL_DIR)/console.c \
|
||||
|
||||
Reference in New Issue
Block a user