From: Chao-ying Fu <c...@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 <c...@mips.com> Signed-off-by: Uros Stajic <uros.sta...@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, w...@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, w...@denx.de. + * + * (C) Copyright 2010 + * Sergei Poselenov, Emcraft Systems, sposele...@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