[PATCH 09/11] riscv: boston: Add support for LED character display command
Uros Stajic
uros.stajic at htecgroup.com
Tue Jun 3 15:40:44 CEST 2025
From: Chao-ying Fu <cfu at mips.com>
Add basic support for the 8-char LED display on P8700-based Boston
Board using display_set() and display_putc(), enabling the generic
'display' command with clear and home support.
Signed-off-by: Chao-ying Fu <cfu at mips.com>
Signed-off-by: Uros Stajic <uros.stajic at htecgroup.com>
---
board/mips/boston-riscv/Kconfig | 4 ++
board/mips/boston-riscv/MAINTAINERS | 3 ++
board/mips/boston-riscv/Makefile | 1 +
board/mips/boston-riscv/display.c | 33 ++++++++++++++++
board/mips/boston-riscv/lowlevel_init.S | 2 +
cmd/Kconfig | 8 ++++
cmd/Makefile | 1 +
cmd/display.c | 51 +++++++++++++++++++++++++
doc/README.LED_display | 26 +++++++++++++
include/led-display.h | 33 ++++++++++++++++
10 files changed, 162 insertions(+)
create mode 100644 board/mips/boston-riscv/display.c
create mode 100644 cmd/display.c
create mode 100644 doc/README.LED_display
create mode 100644 include/led-display.h
diff --git a/board/mips/boston-riscv/Kconfig b/board/mips/boston-riscv/Kconfig
index 4d55d96603e..5ab89cb5a69 100644
--- a/board/mips/boston-riscv/Kconfig
+++ b/board/mips/boston-riscv/Kconfig
@@ -44,4 +44,8 @@ config TFTP_FILE_NAME_MAX_LEN
int "Maximum length of TFTP file name"
default 256
+config CMD_DISPLAY
+ bool "Enable display command"
+ default y
+
endif
diff --git a/board/mips/boston-riscv/MAINTAINERS b/board/mips/boston-riscv/MAINTAINERS
index 0d9a951441f..b04dcde943a 100644
--- a/board/mips/boston-riscv/MAINTAINERS
+++ b/board/mips/boston-riscv/MAINTAINERS
@@ -9,3 +9,6 @@ F: configs/boston-p8700_defconfig
F: arch/riscv/dts/boston-p8700.dts
F: drivers/gpio/eg20t-gpio.c
F: arch/riscv/lib/mips_gic.c
+F: cmd/display.c
+F: include/led-display.h
+F: doc/README.LED_display
diff --git a/board/mips/boston-riscv/Makefile b/board/mips/boston-riscv/Makefile
index 007f68287bd..8ca0967b09e 100644
--- a/board/mips/boston-riscv/Makefile
+++ b/board/mips/boston-riscv/Makefile
@@ -7,3 +7,4 @@ obj-y += lowlevel_init.o
obj-y += boston-riscv.o
obj-y += iocu.o
obj-y += reset.o
+obj-y += display.o
diff --git a/board/mips/boston-riscv/display.c b/board/mips/boston-riscv/display.c
new file mode 100644
index 00000000000..cd222cb6648
--- /dev/null
+++ b/board/mips/boston-riscv/display.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2017 Imagination Technologies
+ *
+ */
+#include <led-display.h>
+#include <asm/io.h>
+#include "boston-lcd.h"
+#include <string.h>
+
+static char buf[8];
+static int pos;
+
+void display_set(int cmd)
+{
+ if (cmd & DISPLAY_CLEAR)
+ memset(buf, ' ', sizeof(buf));
+
+ if (cmd & DISPLAY_HOME)
+ pos = 0;
+
+ lowlevel_display(buf);
+}
+
+int display_putc(char c)
+{
+ if (pos >= 8)
+ return -1;
+
+ buf[pos++] = c;
+ lowlevel_display(buf);
+ return c;
+}
diff --git a/board/mips/boston-riscv/lowlevel_init.S b/board/mips/boston-riscv/lowlevel_init.S
index 8fa85749e40..f65021a0974 100644
--- a/board/mips/boston-riscv/lowlevel_init.S
+++ b/board/mips/boston-riscv/lowlevel_init.S
@@ -15,4 +15,6 @@ msg_ddr_ok: .ascii "DDR OK "
.globl lowlevel_display
lowlevel_display:
li t0, BOSTON_LCD_BASE
+ ld t1, 0(a0)
+ sd t1, 0(t0)
jr ra
diff --git a/cmd/Kconfig b/cmd/Kconfig
index f21d27cb27f..e40fbded3e3 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2313,6 +2313,14 @@ config CMD_CLS
Enable the 'cls' command which clears the screen contents
on video frame buffer.
+config CMD_DISPLAY
+ bool "Enable the 'display' command, for character displays"
+ help
+ (this needs porting to driver model)
+ This enables the 'display' command which allows a string to be
+ displayed on a simple board-specific display. Implement
+ display_putc() to use it.
+
config CMD_EFIDEBUG
bool "efidebug - display/configure UEFI environment"
depends on EFI_LOADER
diff --git a/cmd/Makefile b/cmd/Makefile
index 80cf70b7fe8..e1ce7bbaff9 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -59,6 +59,7 @@ obj-$(CONFIG_CMD_SOUND) += sound.o
ifdef CONFIG_POST
obj-$(CONFIG_CMD_DIAG) += diag.o
endif
+obj-$(CONFIG_CMD_DISPLAY) += display.o
obj-$(CONFIG_CMD_ADTIMG) += adtimg.o
obj-$(CONFIG_CMD_ABOOTIMG) += abootimg.o
obj-$(CONFIG_CMD_CYCLIC) += cyclic.o
diff --git a/cmd/display.c b/cmd/display.c
new file mode 100644
index 00000000000..0602345e6c9
--- /dev/null
+++ b/cmd/display.c
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * (C) Copyright 2005
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ */
+
+#include <command.h>
+#include <led-display.h>
+
+#undef DEBUG_DISP
+
+int do_display(struct cmd_tbl *cmdtp, int flag, int argc, char * const argv[])
+{
+ int i;
+
+ /* Clear display */
+ display_set(DISPLAY_CLEAR | DISPLAY_HOME);
+
+ if (argc < 2)
+ return (0);
+
+ for (i = 1; i < argc; i++) {
+ char *p = argv[i];
+
+ if (i > 1) { /* Insert a space between strings */
+ display_putc(' ');
+ }
+
+ while ((*p)) {
+#ifdef DEBUG_DISP
+ putc(*p);
+#endif
+ display_putc(*p++);
+ }
+ }
+
+#ifdef DEBUG_DISP
+ putc('\n');
+#endif
+
+ return (0);
+}
+
+/***************************************************/
+
+U_BOOT_CMD(display, CONFIG_SYS_MAXARGS, 1, do_display,
+ "display string on dot matrix display",
+ "[<string>]\n"
+ " - with <string> argument: display <string> on dot matrix display\n"
+ " - without arguments: clear dot matrix display"
+);
diff --git a/doc/README.LED_display b/doc/README.LED_display
new file mode 100644
index 00000000000..19977ea7e0d
--- /dev/null
+++ b/doc/README.LED_display
@@ -0,0 +1,26 @@
+LED display internal API
+=======================================
+
+This README describes the LED display API.
+
+The API is defined by the include file include/led-display.h
+
+The first step in to define CONFIG_CMD_DISPLAY in the board config file.
+Then you need to provide the following functions to access LED display:
+
+void display_set(int cmd);
+
+This function should control the state of the LED display. Argument is
+an ORed combination of the following values:
+ DISPLAY_CLEAR -- clear the display
+ DISPLAY_HOME -- set the position to the beginning of display
+
+int display_putc(char c);
+
+This function should display it's parameter on the LED display in the
+current position. Returns the displayed character on success or -1 in
+case of failure.
+
+With this functions defined 'display' command will display it's
+arguments on the LED display (or clear the display if called without
+arguments).
diff --git a/include/led-display.h b/include/led-display.h
new file mode 100644
index 00000000000..50830903b0d
--- /dev/null
+++ b/include/led-display.h
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * (C) Copyright 2005-2010
+ * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
+ *
+ * (C) Copyright 2010
+ * Sergei Poselenov, Emcraft Systems, sposelenov at emcraft.com.
+ */
+
+#ifndef _led_display_h_
+#define _led_display_h_
+
+/* Display Commands */
+#define DISPLAY_CLEAR 0x1 /* Clear the display */
+#define DISPLAY_HOME 0x2 /* Set cursor at home position */
+#define DISPLAY_LINE2 0x4 /* Move to line 2 */
+
+void display_set(int cmd);
+int display_putc(char c);
+
+static inline void display_puts(const char *str)
+{
+ while (str[0])
+ display_putc(*str++);
+}
+
+static inline void display_sets(const char *str)
+{
+ display_set(DISPLAY_CLEAR | DISPLAY_HOME);
+ display_puts(str);
+}
+
+#endif
--
2.34.1
More information about the U-Boot
mailing list