bsp/riscv: Add device tree support for console

Update #3433.
This commit is contained in:
Sebastian Huber
2018-06-28 15:02:13 +02:00
parent c558cc4b00
commit 1232cd4690
5 changed files with 222 additions and 65 deletions
+127
View File
@@ -0,0 +1,127 @@
/*
* Copyright (c) 2018 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <info@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#include <rtems/bspIo.h>
#include <rtems/console.h>
#include <rtems/sysinit.h>
#include <rtems/termiostypes.h>
#include <bsp.h>
#include <bsp/fdt.h>
#include <bsp/irq.h>
#include <dev/serial/htif.h>
#include <libfdt.h>
#if RISCV_ENABLE_HTIF_SUPPORT > 0
static htif_console_context htif_console_instance;
#endif
static struct {
rtems_termios_device_context *context;
void (*write_polled)(
rtems_termios_device_context *base,
const char *buf,
size_t len
);
int (*poll_char)(rtems_termios_device_context *base);
} riscv_console;
static void riscv_output_char(char c)
{
(*riscv_console.write_polled)(riscv_console.context, &c, 1);
}
static int riscv_get_console_node(const void *fdt)
{
const char *stdout_path;
int node;
node = fdt_path_offset(fdt, "/chosen");
stdout_path = fdt_getprop(fdt, node, "stdout-path", NULL);
if (stdout_path == NULL) {
stdout_path = "";
}
return fdt_path_offset(fdt, stdout_path);
}
static void riscv_console_probe(void)
{
const void *fdt;
int node;
int console_node;
fdt = bsp_fdt_get();
console_node = riscv_get_console_node(fdt);
node = fdt_next_node(fdt, -1, NULL);
while (node >= 0) {
#if RISCV_ENABLE_HTIF_SUPPORT
if (fdt_node_check_compatible(fdt, node, "ucb,htif0") == 0) {
htif_console_context_init(&htif_console_instance.base, node);
riscv_console.context = &htif_console_instance.base;
riscv_console.write_polled = htif_console_write_polled;
riscv_console.poll_char = htif_console_poll_char;
};
#endif
node = fdt_next_node(fdt, node, NULL);
}
BSP_output_char = riscv_output_char;
}
static void riscv_output_char_init(char c)
{
riscv_console_probe();
riscv_output_char(c);
}
BSP_output_char_function_type BSP_output_char = riscv_output_char_init;
BSP_polling_getchar_function_type BSP_poll_char = NULL;
rtems_status_code console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
)
{
rtems_termios_device_context *base;
char htif_path[] = "/dev/ttyShtif";
rtems_termios_initialize();
#if RISCV_ENABLE_HTIF_SUPPORT
base = &htif_console_instance.base;
rtems_termios_device_install(htif_path, &htif_console_handler, NULL, base);
if (base == riscv_console.context) {
link(htif_path, CONSOLE_DEVICE_NAME);
}
#endif
return RTEMS_SUCCESSFUL;
}
RTEMS_SYSINIT_ITEM(
riscv_console_probe,
RTEMS_SYSINIT_BSP_START,
RTEMS_SYSINIT_ORDER_LAST
);
@@ -27,12 +27,9 @@
* SUCH DAMAGE.
*/
#include <bsp.h>
#include <bsp/console-polled.h>
#include <rtems/libio.h>
#include <stdlib.h>
#include <dev/serial/htif.h>
#include <assert.h>
#include <stdio.h>
/* Most of the code below is copied from riscv-pk project */
# define TOHOST_CMD(dev, cmd, payload) \
@@ -76,7 +73,7 @@ static void __set_tohost(uintptr_t dev, uintptr_t cmd, uintptr_t data)
tohost = TOHOST_CMD(dev, cmd, data);
}
static int htif_console_getchar(void)
int htif_console_poll_char(rtems_termios_device_context *base)
{
__check_fromhost();
int ch = htif_console_buf;
@@ -88,9 +85,17 @@ static int htif_console_getchar(void)
return ch - 1;
}
static void htif_console_putchar(uint8_t ch)
void htif_console_write_polled(
rtems_termios_device_context *base,
const char *buf,
size_t len
)
{
__set_tohost(1, 1, ch);
size_t i;
for (i = 0; i < len; ++i) {
__set_tohost(1, 1, buf[i]);
}
}
void htif_poweroff(void)
@@ -101,62 +106,27 @@ void htif_poweroff(void)
}
}
void console_initialize_hardware(void)
{
/* Do nothing */
}
static void outbyte_console(char ch)
{
htif_console_putchar(ch);
}
static char inbyte_console(void)
{
return htif_console_getchar();
}
/*
* console_outbyte_polled
*
* This routine transmits a character using polling.
*/
void console_outbyte_polled(
int port,
char ch
void htif_console_context_init(
rtems_termios_device_context *base,
int device_tree_node
)
{
outbyte_console( ch );
rtems_termios_device_context_initialize(base, "HTIF");
}
/*
* console_inbyte_nonblocking
*
* This routine polls for a character.
*/
int console_inbyte_nonblocking(int port)
static bool htif_console_first_open(
struct rtems_termios_tty *tty,
rtems_termios_device_context *base,
struct termios *term,
rtems_libio_open_close_args_t *args
)
{
char c;
c = inbyte_console();
if (!c) {
return -1;
}
return (int) c;
return true;
}
/*
* To support printk
*/
#include <rtems/bspIo.h>
static void RISCV_output_char(char c)
{
console_outbyte_polled( 0, c );
}
BSP_output_char_function_type BSP_output_char = RISCV_output_char;
BSP_polling_getchar_function_type BSP_poll_char =
(void *)console_inbyte_nonblocking;
const rtems_termios_device_handler htif_console_handler = {
.first_open = htif_console_first_open,
.write = htif_console_write_polled,
.poll_read = htif_console_poll_char,
.mode = TERMIOS_POLLED
};
@@ -0,0 +1,58 @@
/*
* Copyright (c) 2018 embedded brains GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <rtems/termiostypes.h>
#ifndef DEV_SERIAL_HTIF_H
#define DEV_SERIAL_HTIF_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef struct {
rtems_termios_device_context base;
} htif_console_context;
void htif_console_context_init(
rtems_termios_device_context *base,
int device_tree_node
);
void htif_console_write_polled(
rtems_termios_device_context *base,
const char *buf,
size_t len
);
int htif_console_poll_char(rtems_termios_device_context *base);
const rtems_termios_device_handler htif_console_handler;
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* DEV_SERIAL_HTIF_H */
+4 -5
View File
@@ -49,9 +49,6 @@ librtemsbsp_a_SOURCES +=../../../../../../bsps/riscv/riscv/clock/clockdrv.c
# Timer
librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/btimer/btimer.c
# console
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-polled.c
# IRQ
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/irq/irq-default-handler.c
librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/irq/irq.c
@@ -59,8 +56,10 @@ librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/irq/irq.c
# Cache
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/cache/nocache.c
# debugio
librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/console-io.c
# Console
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/dev/serial/console-termios.c
librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/console-config.c
librtemsbsp_a_SOURCES += ../../../../../../bsps/riscv/riscv/console/htif.c
if HAS_SMP
librtemsbsp_a_SOURCES += ../../../../../../bsps/shared/start/bspsmp-dummy.c
@@ -27,6 +27,9 @@ RTEMS_BSPOPTS_HELP([BSP_FDT_BLOB_READ_ONLY],[place the FDT blob into the read-on
RTEMS_BSPOPTS_SET([BSP_FDT_BLOB_COPY_TO_READ_ONLY_LOAD_AREA],[*],[1])
RTEMS_BSPOPTS_HELP([BSP_FDT_BLOB_COPY_TO_READ_ONLY_LOAD_AREA],[copy the FDT blob into the read-only load area via bsp_fdt_copy()])
RTEMS_BSPOPTS_SET([RISCV_ENABLE_HTIF_SUPPORT],[*],[1])
RTEMS_BSPOPTS_HELP([RISCV_ENABLE_HTIF_SUPPORT],[enables the HTIF support if defined to a non-zero value, otherwise it is disabled (enabled by default)])
RTEMS_BSP_CLEANUP_OPTIONS
case "${RTEMS_BSP}" in