Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions include/sbi_utils/serial/altr-juart.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2025 ISCAS
*
* Authors:
* Icenowy Zheng <zhengxingda@iscas.ac.cn>
*/

#ifndef __SERIAL_ALTR_JUART_H__
#define __SERIAL_ALTR_JUART_H__

#include <sbi/sbi_types.h>

int altr_juart_init(unsigned long base);

#endif
9 changes: 9 additions & 0 deletions lib/utils/serial/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ config FDT_SERIAL

if FDT_SERIAL

config FDT_SERIAL_ALTR_JUART
bool "Altera JTAG UART FDT driver"
select SERIAL_ALTR_JUART
default n

config FDT_SERIAL_CADENCE
bool "Cadence UART FDT driver"
select SERIAL_CADENCE
Expand Down Expand Up @@ -56,6 +61,10 @@ config FDT_SERIAL_XILINX_UARTLITE

endif

config SERIAL_ALTR_JUART
bool "Altera JTAG UART support"
default n

config SERIAL_CADENCE
bool "Cadence UART support"
default n
Expand Down
74 changes: 74 additions & 0 deletions lib/utils/serial/altr-juart.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2025 ISCAS
*
* Authors:
* Icenowy Zheng <zhengxingda@iscas.ac.cn>
*/

#include <sbi/riscv_io.h>
#include <sbi/sbi_console.h>
#include <sbi_utils/serial/altr-juart.h>

/* clang-format off */

#define JUART_DATA_OFFSET 0x00
# define JUART_DATA_DATA_MASK 0x000000ff
# define JUART_DATA_RVALID (1 << 15)
# define JUART_DATA_RAVAIL_MASK 0xffff0000
# define JUART_DATA_RAVAIL_SHIFT 16
#define JUART_CTRL_OFFSET 0x04
# define JUART_CTRL_RE (1 << 0)
# define JUART_CTRL_WE (1 << 1)
# define JUART_CTRL_RI (1 << 8)
# define JUART_CTRL_WI (1 << 9)
# define JUART_CTRL_AC (1 << 10)
# define JUART_CTRL_WSPACE_MASK 0xffff0000
# define JUART_CTRL_WSPACE_SHIFT 16

/* clang-format on */

static volatile char *altr_juart_base;

static u32 get_reg(u32 offset)
{
return readl(altr_juart_base + offset);
}

static void set_reg(u32 offset, u32 val)
{
writel(val, altr_juart_base + offset);
}

static void altr_juart_putc(char ch)
{
while(!(get_reg(JUART_CTRL_OFFSET) & JUART_CTRL_WSPACE_MASK))
;

set_reg(JUART_DATA_OFFSET, (unsigned char)ch);
}

static int altr_juart_getc(void)
{
u32 reg = get_reg(JUART_DATA_OFFSET);
if (reg & JUART_DATA_RVALID)
return reg & JUART_DATA_DATA_MASK;

return -1;
}

static struct sbi_console_device altr_juart_console = {
.name = "altr-juart",
.console_putc = altr_juart_putc,
.console_getc = altr_juart_getc
};

int altr_juart_init(unsigned long base)
{
altr_juart_base = (volatile char *)base;

sbi_console_set_device(&altr_juart_console);

return 0;
}
40 changes: 40 additions & 0 deletions lib/utils/serial/fdt_serial_altr_juart.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2025 ISCAS
*
* Authors:
* Icenowy Zheng <zhengxingda@iscas.ac.cn>
*/

#include <sbi/sbi_error.h>
#include <sbi_utils/fdt/fdt_helper.h>
#include <sbi_utils/serial/fdt_serial.h>
#include <sbi_utils/serial/altr-juart.h>

static int serial_altr_juart_init(const void *fdt, int nodeoff,
const struct fdt_match *match)
{
uint64_t reg_addr, reg_size;
int rc;

if (nodeoff < 0 || !fdt)
return SBI_ENODEV;

rc = fdt_get_node_addr_size(fdt, nodeoff, 0, &reg_addr, &reg_size);
/* Two 32-bit registers */
if (rc < 0 || !reg_addr || !reg_size || reg_size < 0x8)
return SBI_ENODEV;

return altr_juart_init(reg_addr);
}

static const struct fdt_match serial_altr_juart_match[] = {
{ .compatible = "altr,juart-1.0" },
{ },
};

const struct fdt_driver fdt_serial_altr_juart = {
.match_table = serial_altr_juart_match,
.init = serial_altr_juart_init,
};
4 changes: 4 additions & 0 deletions lib/utils/serial/objects.mk
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
libsbiutils-objs-$(CONFIG_FDT_SERIAL) += serial/fdt_serial.o
libsbiutils-objs-$(CONFIG_FDT_SERIAL) += serial/fdt_serial_drivers.carray.o

carray-fdt_serial_drivers-$(CONFIG_FDT_SERIAL_ALTR_JUART) += fdt_serial_altr_juart
libsbiutils-objs-$(CONFIG_FDT_SERIAL_ALTR_JUART) += serial/fdt_serial_altr_juart.o

carray-fdt_serial_drivers-$(CONFIG_FDT_SERIAL_CADENCE) += fdt_serial_cadence
libsbiutils-objs-$(CONFIG_FDT_SERIAL_CADENCE) += serial/fdt_serial_cadence.o

Expand Down Expand Up @@ -37,6 +40,7 @@ libsbiutils-objs-$(CONFIG_FDT_SERIAL_UART8250) += serial/fdt_serial_uart8250.o
carray-fdt_serial_drivers-$(CONFIG_FDT_SERIAL_XILINX_UARTLITE) += fdt_serial_xlnx_uartlite
libsbiutils-objs-$(CONFIG_FDT_SERIAL_XILINX_UARTLITE) += serial/fdt_serial_xlnx_uartlite.o

libsbiutils-objs-$(CONFIG_SERIAL_ALTR_JUART) += serial/altr-juart.o
libsbiutils-objs-$(CONFIG_SERIAL_CADENCE) += serial/cadence-uart.o
libsbiutils-objs-$(CONFIG_SERIAL_GAISLER) += serial/gaisler-uart.o
libsbiutils-objs-$(CONFIG_SERIAL_RENESAS_SCIF) += serial/renesas_scif.o
Expand Down
1 change: 1 addition & 0 deletions platform/generic/configs/defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ CONFIG_FDT_RESET_SG2042_HWMON_MCU=y
CONFIG_FDT_RESET_SUNXI_WDT=y
CONFIG_FDT_RESET_SYSCON=y
CONFIG_FDT_SERIAL=y
CONFIG_FDT_SERIAL_ALTR_JUART=y
CONFIG_FDT_SERIAL_CADENCE=y
CONFIG_FDT_SERIAL_GAISLER=y
CONFIG_FDT_SERIAL_HTIF=y
Expand Down