This is an automated email from the ASF dual-hosted git repository.
linguini1 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 2e7910fef6d boards/stm32h7/linum-stm32h753bi: enable USB FS host, add
lvglterm_kbda
2e7910fef6d is described below
commit 2e7910fef6d04d44ca72828bdfb08212cc029dbe
Author: Jorge Guzman <[email protected]>
AuthorDate: Mon Jul 6 18:07:49 2026 -0300
boards/stm32h7/linum-stm32h753bi: enable USB FS host, add lvglterm_kbda
Enable the OTG FS host on the Linum board so an external USB HID keyboard
can be used: configure the USB VBUS, power-switch and over-current GPIOs
at board bring-up (the power switch on PI12 is active low) and start the
USB host from stm32_bringup() through stm32_usbhost_initialize().
Add the lvglterm_kbda configuration - the LVGL terminal driven by a USB
HID keyboard on /dev/kbda - with the microSD card enabled alongside the
USB host. They coexist once CONFIG_MMCSD_MMCSUPPORT is left disabled, so
an SD card is not probed as an MMC device.
Also switch esp32s3-m5-cardputer:lvglterm to the renamed matrix-keyboard
input option (EXAMPLES_LVGLTERM_INPUT_KBD_MATRIX) to match the reworked
lvglterm example Kconfig.
Update the documentation accordingly: the LVGL Terminal example page for
the three-way input choice (touch, matrix, USB HID) with cursor-key
scrolling and per-variant configuration plus a photo of the USB variant
running on the Linum, the lvglterm_kbda entry on the Linum board page,
and the matrix-keyboard variant name on the M5Stack Cardputer board page.
Signed-off-by: Jorge Guzman <[email protected]>
---
.../applications/examples/lvglterm/index.rst | 58 +++++++++----
.../examples/lvglterm/lvglterm-usb.png | Bin 0 -> 448337 bytes
.../arm/stm32h7/boards/linum-stm32h753bi/index.rst | 48 +++++++++++
.../esp32s3/boards/esp32s3-m5-cardputer/index.rst | 4 +-
.../configs/lvglterm_kbda/defconfig | 93 +++++++++++++++++++++
.../arm/stm32h7/linum-stm32h753bi/include/board.h | 14 +++-
.../linum-stm32h753bi/src/linum-stm32h753bi.h | 18 ++++
.../arm/stm32h7/linum-stm32h753bi/src/stm32_boot.c | 8 ++
.../stm32h7/linum-stm32h753bi/src/stm32_bringup.c | 12 +++
.../arm/stm32h7/linum-stm32h753bi/src/stm32_usb.c | 6 +-
.../configs/lvglterm/defconfig | 1 +
11 files changed, 239 insertions(+), 23 deletions(-)
diff --git a/Documentation/applications/examples/lvglterm/index.rst
b/Documentation/applications/examples/lvglterm/index.rst
index 0b236f81c58..18e93d34b86 100644
--- a/Documentation/applications/examples/lvglterm/index.rst
+++ b/Documentation/applications/examples/lvglterm/index.rst
@@ -4,18 +4,20 @@
LVGL application that runs an interactive NuttShell (NSH) on the display. NSH
is started with its standard streams redirected through pipes, its output is
-rendered in an LVGL text area, and the input comes from one of two sources
+rendered in an LVGL text area, and the input comes from one of three sources
selected at build time.
The shared code lives in ``lvglterm.c`` (NSH startup, output rendering, main
-loop); ``lvglterm_touch.c`` and ``lvglterm_kbd.c`` implement the two input
+loop); ``lvglterm_touch.c`` and ``lvglterm_kbd.c`` implement the input
variants.
Input variants
==============
The input source is chosen with the *LVGL Terminal input source* Kconfig
-choice (only one is built at a time):
+choice (only one is built at a time). The physical-keyboard options differ in
+the data the keyboard device returns on ``read()``, so the one that matches the
+hardware must be selected.
On-screen keyboard (touch)
``CONFIG_EXAMPLES_LVGLTERM_INPUT_TOUCH`` (default). An LVGL keyboard
@@ -29,23 +31,39 @@ On-screen keyboard (touch)
On-screen keyboard (touch) variant
-Physical keyboard
- ``CONFIG_EXAMPLES_LVGLTERM_INPUT_KBD``. Key events are read from a
- ``/dev/kbdN`` keyboard device and streamed to the shell; the output fills
- the whole screen. Requires ``CONFIG_INPUT_KEYBOARD``.
-
- The device defaults to ``CONFIG_EXAMPLES_LVGLTERM_KBD_DEV``
- (``/dev/kbd0``) and can be overridden at run time by passing the path as
- the first argument (``lvglterm /dev/kbd1``) when more than one keyboard is
- present. Keyboards that report the Fn navigation cluster as cursor keys
- can scroll the output with Up/Down.
+Matrix / upper-half keyboard
+ ``CONFIG_EXAMPLES_LVGLTERM_INPUT_KBD_MATRIX``. ``struct
+ keyboard_event_s`` events are read from a keyboard registered through the
+ ``CONFIG_INPUT_KEYBOARD`` upper half (for example the M5Stack Cardputer
+ matrix keyboard on ``/dev/kbd0``) and streamed to the shell; the output
+ fills the whole screen. The Fn Up/Down cursor keys scroll the output.
.. figure:: lvglterm-kbd.png
:align: center
:width: 500px
- :alt: LVGL Terminal driven by a physical keyboard
+ :alt: LVGL Terminal driven by a matrix keyboard
+
+ Matrix / upper-half keyboard variant
+
+USB HID keyboard
+ ``CONFIG_EXAMPLES_LVGLTERM_INPUT_KBD_USB``. A USB HID keyboard (for
+ example on ``/dev/kbda`` with ``CONFIG_USBHOST_HIDKBD``) delivers a byte
+ stream that is decoded with the keyboard codec and streamed to the shell.
+ When the driver is built with ``CONFIG_HIDKBD_ENCODED`` the Up/Down cursor
+ keys scroll the terminal.
+
+ .. figure:: lvglterm-usb.png
+ :align: center
+ :width: 500px
+ :alt: LVGL Terminal driven by a USB HID keyboard
+
+ USB HID keyboard variant
- Physical keyboard variant
+Both keyboard variants default the device to
+``CONFIG_EXAMPLES_LVGLTERM_KBD_DEV`` (``/dev/kbd0`` for the matrix keyboard,
+``/dev/kbda`` for USB) and can be overridden at run time by passing the path
+as the first argument (``lvglterm /dev/kbd1``) when more than one keyboard is
+present.
Font
====
@@ -63,9 +81,13 @@ Configuration
- ``CONFIG_SYSTEM_NSH=y`` -- the NSH library must be enabled.
- ``CONFIG_GRAPHICS_LVGL=y`` and ``CONFIG_LV_USE_NUTTX=y`` -- LVGL with its
NuttX integration.
-- A display (``CONFIG_LV_USE_NUTTX_LCD`` or a framebuffer). The touch variant
- also needs a touchscreen input (``CONFIG_LV_USE_NUTTX_TOUCHSCREEN``); the
- keyboard variant needs a keyboard driver (``CONFIG_INPUT_KEYBOARD``).
+- A display (``CONFIG_LV_USE_NUTTX_LCD`` or a framebuffer). Each input variant
+ also needs its own driver: a touchscreen
+ (``CONFIG_LV_USE_NUTTX_TOUCHSCREEN``) for the touch variant,
+ ``CONFIG_INPUT_KEYBOARD`` for the matrix variant, or
+ ``CONFIG_USBHOST_HIDKBD`` for the USB variant. The USB variant selects
+ ``CONFIG_LIBC_KBDCODEC`` automatically and, for the cursor keys, the driver
+ should be built with ``CONFIG_HIDKBD_ENCODED``.
- The selected font (``CONFIG_LV_FONT_UNSCII_8`` or
``CONFIG_LV_FONT_UNSCII_16``) is enabled automatically by the font choice.
diff --git a/Documentation/applications/examples/lvglterm/lvglterm-usb.png
b/Documentation/applications/examples/lvglterm/lvglterm-usb.png
new file mode 100644
index 00000000000..4d4dc467be9
Binary files /dev/null and
b/Documentation/applications/examples/lvglterm/lvglterm-usb.png differ
diff --git
a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst
b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst
index ff07a5230f7..c6f68b67ec6 100644
--- a/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst
+++ b/Documentation/platforms/arm/stm32h7/boards/linum-stm32h753bi/index.rst
@@ -909,6 +909,54 @@ Type a command on the on-screen keyboard and press Enter;
the command line
``nsh> <command>`` and its output appear in the terminal area above the
keyboard.
+lvglterm_kbda
+-------------
+
+**Purpose:** runs the ``lvglterm`` example -- an interactive NuttShell (NSH)
+terminal rendered on the display -- driven by an external **USB HID keyboard**,
+demonstrating that the OTG FS USB host and the microSD card can be used at the
+same time on this board.
+
+The board's OTG FS port is enabled as a USB host (VBUS power switch on PI12),
+so a USB HID keyboard plugged into the service connector is enumerated as
+``/dev/kbda`` and its keys are streamed to NSH. The microSD card is enabled as
+well and, because ``CONFIG_MMCSD_MMCSUPPORT`` is disabled, an SD card is probed
+correctly (not as an MMC device) and registered as ``/dev/mmcsd0``.
+
+**Build and flash:**
+
+.. code-block:: console
+
+ $ ./tools/configure.sh linum-stm32h753bi:lvglterm_kbda
+ $ make -j
+
+Flash the resulting ``nuttx.bin`` to the board.
+
+**How to test:** plug a USB HID keyboard and an SD card, reset the board and
+check that both devices are present::
+
+ nsh> ls /dev
+ /dev:
+ console
+ fb0
+ kbda
+ mmcsd0
+ null
+ rtc0
+ ttyS0
+ zero
+
+Start the terminal and type on the USB keyboard; the command line and its
+output appear on the display, and the Up/Down cursor keys scroll it::
+
+ nsh> lvglterm
+
+The SD card can be mounted and read while the keyboard is in use, confirming
+that the USB host and the SDMMC peripheral coexist::
+
+ nsh> mount -t vfat /dev/mmcsd0 /data
+ nsh> ls /data
+
tone
----
diff --git
a/Documentation/platforms/xtensa/esp32s3/boards/esp32s3-m5-cardputer/index.rst
b/Documentation/platforms/xtensa/esp32s3/boards/esp32s3-m5-cardputer/index.rst
index a8258dec019..eda4fe85e84 100644
---
a/Documentation/platforms/xtensa/esp32s3/boards/esp32s3-m5-cardputer/index.rst
+++
b/Documentation/platforms/xtensa/esp32s3/boards/esp32s3-m5-cardputer/index.rst
@@ -60,7 +60,7 @@ turns it on).
The key-position-to-character table follows the M5Cardputer layout; verify
it against the printed legends on first bring-up. Applications read
``/dev/kbd0`` for key events (for example the ``lvglterm`` example, built
- with its physical-keyboard input variant, feeds it into an on-screen
+ with its matrix-keyboard input variant, feeds it into an on-screen
shell).
Pin Mapping
@@ -141,7 +141,7 @@ lvgl
lvglterm
On-screen NuttShell terminal with LVGL and the physical keyboard. Runs
- the ``lvglterm`` example built with its physical-keyboard input variant:
+ the ``lvglterm`` example built with its matrix-keyboard input variant:
NSH output is rendered in an LVGL text area and the keyboard
(``/dev/kbd0``) feeds the input. Wi-Fi is included, so the on-screen
shell can associate with an access point using ``wapi``. ``Fn`` + ``;`` /
diff --git
a/boards/arm/stm32h7/linum-stm32h753bi/configs/lvglterm_kbda/defconfig
b/boards/arm/stm32h7/linum-stm32h753bi/configs/lvglterm_kbda/defconfig
new file mode 100644
index 00000000000..2c052238fb6
--- /dev/null
+++ b/boards/arm/stm32h7/linum-stm32h753bi/configs/lvglterm_kbda/defconfig
@@ -0,0 +1,93 @@
+#
+# This file is autogenerated: PLEASE DO NOT EDIT IT.
+#
+# You can use "make menuconfig" to make any modifications to the installed
.config file.
+# You can then do "make savedefconfig" to generate a new defconfig file that
includes your
+# modifications.
+#
+# CONFIG_MMCSD_HAVE_WRITEPROTECT is not set
+# CONFIG_MMCSD_MMCSUPPORT is not set
+# CONFIG_STANDARD_SERIAL is not set
+# CONFIG_STM32_FB_CMAP is not set
+# CONFIG_STM32_LTDC_L1_CHROMAKEYEN is not set
+# CONFIG_STM32_LTDC_L2 is not set
+CONFIG_ARCH="arm"
+CONFIG_ARCH_BOARD="linum-stm32h753bi"
+CONFIG_ARCH_BOARD_LINUM_STM32H753BI=y
+CONFIG_ARCH_CHIP="stm32h7"
+CONFIG_ARCH_CHIP_STM32=y
+CONFIG_ARCH_CHIP_STM32H753BI=y
+CONFIG_ARCH_CHIP_STM32H7=y
+CONFIG_ARCH_CHIP_STM32H7_CORTEXM7=y
+CONFIG_ARCH_STACKDUMP=y
+CONFIG_ARMV7M_DCACHE=y
+CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
+CONFIG_ARMV7M_DTCM=y
+CONFIG_ARMV7M_ICACHE=y
+CONFIG_BOARD_LOOPSPERMSEC=43103
+CONFIG_BUILTIN=y
+CONFIG_DEBUG_FEATURES=y
+CONFIG_DEBUG_SYMBOLS=y
+CONFIG_DRIVERS_VIDEO=y
+CONFIG_EXAMPLES_LVGLTERM=y
+CONFIG_EXAMPLES_LVGLTERM_INPUT_KBD_USB=y
+CONFIG_FAT_DMAMEMORY=y
+CONFIG_FAT_LCNAMES=y
+CONFIG_FAT_LFN=y
+CONFIG_FB_OVERLAY=y
+CONFIG_FS_FAT=y
+CONFIG_FS_PROCFS=y
+CONFIG_GRAN=y
+CONFIG_GRAN_INTR=y
+CONFIG_GRAPHICS_LVGL=y
+CONFIG_HIDKBD_ENCODED=y
+CONFIG_INIT_ENTRYPOINT="nsh_main"
+CONFIG_INPUT=y
+CONFIG_INTELHEX_BINARY=y
+CONFIG_LIBC_EXECFUNCS=y
+CONFIG_LIBM=y
+CONFIG_LINE_MAX=64
+CONFIG_LV_MEM_SIZE_KILOBYTES=128
+CONFIG_LV_USE_NUTTX=y
+CONFIG_MMCSD=y
+CONFIG_MMCSD_SDIO=y
+CONFIG_MMCSD_SDIOWAIT_WRCOMPLETE=y
+CONFIG_MM_REGIONS=5
+CONFIG_NSH_BUILTIN_APPS=y
+CONFIG_NSH_DISABLE_IFUPDOWN=y
+CONFIG_NSH_FILEIOSIZE=512
+CONFIG_NSH_READLINE=y
+CONFIG_PIPES=y
+CONFIG_PREALLOC_TIMERS=4
+CONFIG_RAM_SIZE=245760
+CONFIG_RAM_START=0x20010000
+CONFIG_RAW_BINARY=y
+CONFIG_RR_INTERVAL=200
+CONFIG_RTC_ALARM=y
+CONFIG_RTC_DATETIME=y
+CONFIG_RTC_DRIVER=y
+CONFIG_SCHED_HPWORK=y
+CONFIG_SCHED_WAITPID=y
+CONFIG_SDMMC1_SDIO_MODE=y
+CONFIG_START_DAY=6
+CONFIG_START_MONTH=12
+CONFIG_START_YEAR=2011
+CONFIG_STM32_FMC=y
+CONFIG_STM32_HSI48=y
+CONFIG_STM32_I2C3=y
+CONFIG_STM32_LTDC=y
+CONFIG_STM32_LTDC_FB_BASE=0xC0600000
+CONFIG_STM32_LTDC_FB_SIZE=2097152
+CONFIG_STM32_OTGFS=y
+CONFIG_STM32_PWR=y
+CONFIG_STM32_RTC=y
+CONFIG_STM32_SDMMC1=y
+CONFIG_STM32_USART1=y
+CONFIG_SYSTEM_NSH=y
+CONFIG_TASK_NAME_SIZE=0
+CONFIG_TESTING_RAMTEST=y
+CONFIG_USART1_SERIAL_CONSOLE=y
+CONFIG_USBHOST=y
+CONFIG_USBHOST_HIDKBD=y
+CONFIG_USEC_PER_TICK=1000
+CONFIG_VIDEO_FB=y
diff --git a/boards/arm/stm32h7/linum-stm32h753bi/include/board.h
b/boards/arm/stm32h7/linum-stm32h753bi/include/board.h
index fc345aa0d2c..28ede095363 100644
--- a/boards/arm/stm32h7/linum-stm32h753bi/include/board.h
+++ b/boards/arm/stm32h7/linum-stm32h753bi/include/board.h
@@ -391,6 +391,15 @@
#define GPIO_OTGFS_DM (GPIO_OTGFS_DM_0|GPIO_SPEED_100MHz) /* PA11 */
#define GPIO_OTGFS_DP (GPIO_OTGFS_DP_0|GPIO_SPEED_100MHz) /* PA12 */
+/* The Linum board wires the USB connector for host/device use without an
+ * OTG_FS_ID pin (mode is forced by the driver), so PA10 is NOT used as
+ * OTG_FS_ID. The OTG host driver still configures GPIO_OTGFS_ID
+ * unconditionally, so map it to a harmless floating input instead of the
+ * OTG_FS_ID alternate function to keep PA10 free.
+ */
+
+#define GPIO_OTGFS_ID (GPIO_INPUT|GPIO_FLOAT|GPIO_PORTA|GPIO_PIN10)
+
/* SDMMC1 - Used SD Card memory */
/* Init 400 kHz, PLL1Q/(2*300) = 240 MHz / (2*300) = 400 Khz */
@@ -502,7 +511,10 @@
* this value will need to be doubled.
*/
-#ifdef CONFIG_STM32_LTDC
+#if defined(CONFIG_STM32_LTDC) && defined(CONFIG_STM32_LTDC_L1_ARGB8888)
+/* A 32-bpp ARGB8888 framebuffer (1024x600x4 = 2.4M) needs the last 3M */
+# define BOARD_SDRAM1_SIZE (5*1024*1024)
+#elif defined(CONFIG_STM32_LTDC)
# define BOARD_SDRAM1_SIZE (6*1024*1024)
#else
# define BOARD_SDRAM1_SIZE (8*1024*1024)
diff --git a/boards/arm/stm32h7/linum-stm32h753bi/src/linum-stm32h753bi.h
b/boards/arm/stm32h7/linum-stm32h753bi/src/linum-stm32h753bi.h
index 64027b170b9..6162d3d84b7 100644
--- a/boards/arm/stm32h7/linum-stm32h753bi/src/linum-stm32h753bi.h
+++ b/boards/arm/stm32h7/linum-stm32h753bi/src/linum-stm32h753bi.h
@@ -305,4 +305,22 @@ int board_tone_initialize(int devno);
int stm32_tsc_setup(int minor);
#endif
+/****************************************************************************
+ * Name: stm32_usbhost_initialize
+ *
+ * Description:
+ * Called at application startup time to initialize the USB host
+ * functionality. This function will start a thread that will monitor for
+ * device connection/disconnection events.
+ *
+ * Returned Value:
+ * Zero is returned on success. Otherwise, a negated errno value is
+ * returned to indicate the nature of the failure.
+ *
+ ****************************************************************************/
+
+#ifdef CONFIG_USBHOST
+int stm32_usbhost_initialize(void);
+#endif
+
#endif /* __BOARDS_ARM_STM32H7_LINUM_STM32H753BI_SRC_LINUM_STM32H753BI_H */
diff --git a/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_boot.c
b/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_boot.c
index 01c91d90986..588e3122f42 100644
--- a/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_boot.c
+++ b/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_boot.c
@@ -55,6 +55,14 @@ void stm32_boardinitialize(void)
board_autoled_initialize();
#endif
+
+#ifdef CONFIG_STM32_OTGFS
+ /* Initialize USB-related GPIOs (VBUS sensing, power switch enable and
+ * over-current) so the OTG FS port can drive VBUS in host mode.
+ */
+
+ stm32_usbinitialize();
+#endif
}
/****************************************************************************
diff --git a/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_bringup.c
b/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_bringup.c
index 02f6a1cc0ae..5936c0d50ae 100644
--- a/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_bringup.c
+++ b/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_bringup.c
@@ -359,5 +359,17 @@ int stm32_bringup(void)
}
#endif
+#ifdef CONFIG_USBHOST
+ /* Initialize USB host to support an external HID keyboard (e.g. as the
+ * NXDoom game controller) plugged into the OTG FS service port.
+ */
+
+ ret = stm32_usbhost_initialize();
+ if (ret < 0)
+ {
+ syslog(LOG_ERR, "ERROR: stm32_usbhost_initialize() failed: %d\n", ret);
+ }
+#endif
+
return OK;
}
diff --git a/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_usb.c
b/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_usb.c
index 884e370b0c9..a9d4fabdcdd 100644
--- a/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_usb.c
+++ b/boards/arm/stm32h7/linum-stm32h753bi/src/stm32_usb.c
@@ -271,9 +271,11 @@ void stm32_usbhost_vbusdrive(int iface, bool enable)
{
DEBUGASSERT(iface == 0);
- /* Set the Power Switch by driving the active high enable pin */
+ /* Set the Power Switch by driving the enable pin. On the Linum board the
+ * USB power switch enable (PI12) is active low, so invert the request.
+ */
- stm32_gpiowrite(GPIO_OTGFS_PWRON, enable);
+ stm32_gpiowrite(GPIO_OTGFS_PWRON, !enable);
}
#endif
diff --git
a/boards/xtensa/esp32s3/esp32s3-m5-cardputer/configs/lvglterm/defconfig
b/boards/xtensa/esp32s3/esp32s3-m5-cardputer/configs/lvglterm/defconfig
index 67bec4730d1..5bb9c031f09 100644
--- a/boards/xtensa/esp32s3/esp32s3-m5-cardputer/configs/lvglterm/defconfig
+++ b/boards/xtensa/esp32s3/esp32s3-m5-cardputer/configs/lvglterm/defconfig
@@ -47,6 +47,7 @@ CONFIG_ESP32S3_USBSERIAL=y
CONFIG_ESPRESSIF_WIFI=y
CONFIG_EXAMPLES_LVGLTERM=y
CONFIG_EXAMPLES_LVGLTERM_FONT_UNSCII_8=y
+CONFIG_EXAMPLES_LVGLTERM_INPUT_KBD_MATRIX=y
CONFIG_FAT_LCNAMES=y
CONFIG_FAT_LFN=y
CONFIG_FS_FAT=y