Skip to content

Implement drivers for microwindows#3624

Open
Acfboy wants to merge 14 commits into
apache:masterfrom
Acfboy:add-microwindows
Open

Implement drivers for microwindows#3624
Acfboy wants to merge 14 commits into
apache:masterfrom
Acfboy:add-microwindows

Conversation

@Acfboy

@Acfboy Acfboy commented Jul 9, 2026

Copy link
Copy Markdown

Hello the community! Here is the work I have done for the first half of GSoC, now complete and ready for review.

Work Completed

The GDI-level Microwindows core, drivers, and mwdemo are functional on QEMU x86-64 and the simulator.

Build System Integration

  • Based on the initial proof-of-concept branch by @ppisa, the Microwindows core (engine, drivers, precompiled bitmap fonts) has been successfully compiled into the NuttX apps library.
  • Uses MWCONFIG_FILE="mwconfig.nuttx" to inject NuttX-specific configuration into Microwindows without touching upstream headers.
  • Image resources used by mwdemo.c are compiled into binary using the convbmp tool during the build.

NuttX Hardware Drivers

Framebuffer driver (scr_nuttx.c), keyboard drivers (kbd_nuttx_event.c for event-mode and kbd_nuttx_raw.c for raw byte-stream), mouse driver (mou_nuttx_mouse.c), and touchscreen driver (mou_nuttx_ts.c) have been implemented and submitted to upstream Microwindows mainline ghaerr/microwindows#193. The graphics/microwindows/Makefile selects the appropriate drivers via ARCH=NUTTX and Kconfig-driven KEYBOARD/MOUSE variables.

Kconfig Options

Flexible Kconfig for keyboard driver: event-mode (/dev/kbd), raw byte-stream via kbd_codec (/dev/kbda), none, or custom. For mouse/touchscreen: relative mouse (/dev/mouse0), touchscreen (/dev/input0), none, or custom. Custom options allow BSP/app-level overrides without modifying the Microwindows build logic.

Demo Application

Ported mwdemo.c (a complex Windows-like demo) into a standalone NuttX example application. The demo runs successfully on both qemu-intel64:mw and the NuttX simulator (sim:mw).

I have also tested the demo with #define CONTROL 1 enabled in mwdemo.c, which represents a more complex use case.

Upstream Bug Fixes

Several issues were discovered, analysed, and most of them already fixed:

Issue Root Cause Fix
Animation freezing in mwdemo MwSelect() blocked forever when a timer had already expired, because the code assumed no timer existed when GdGetNextTimeout returned false. Patch by ppisa, correctly handle the case where timeout == 0 and return immediately.
Cursor leaving a blue ghost image #if defined(ELKS) in mwtypes.h forced MWPIXELVALHW to unsigned char even when ELKS=0 (intended to disable it). This truncated 32-bit pixel values read from the framebuffer. Changed to #if ELKS
System freeze when dragging a window caption During drag, MwSelect switches to polling (select(…, timeout=0)). The USB input thread had a lower priority (50) than the application (100), so it never got CPU time to generate events. Short-term: adjusted thread priorities in defconfigs. A permanent solution in Microwindows may be discussed later.
Mouse drift in simulator after dragging TOUCH_POS_VALID flag was not being checked in the touchscreen driver, causing uninitialized coordinate values to be used. Fixed in mou_nuttx.c by checking TOUCH_POS_VALID before using touch coordinates.
KEYCODE_xxx and ASCII range conflict NuttX's KEYCODE_xxx macros (e.g., KEYCODE_PAUSE = 0x20) overlap with ASCII characters, making it impossible to distinguish special keys from normal input in the event-mode keyboard driver. Still under discussions apache/nuttx#19527

How to Reproduce (QEMU / Simulator)

qemu-intel64:mw

make distclean
./tools/configure.sh qemu-intel64:mw
make -j$(nproc)

Then create a bootable disk following the documentation and run:

qemu-system-x86_64 -cpu host -enable-kvm -m 2G \
        -cdrom boot_mw.iso \
        -serial stdio -monitor none -no-reboot -device qemu-xhci -device usb-kbd -device usb-mouse

sim:mw

make distclean
./tools/configure.sh sim:mw
make -j$(nproc)
./nuttx

Notice

  • You can set #define CONTROL 1 manually in mwdemo.c to test more complex case.
  • Most of the nxstyle problems in mwdemo.c are fixed, except the names of Win32 API.
  • A draft document for microwindows is at Acfboy/nuttx@f4d9316
  • The Nano-X X11 supprot is still work in progress.

@ppisa

ppisa commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Thanks to @Acfboy for the work and this draft request for discussion and @ghaerr for consultations and support on Microwidows side.

I am leaving for four days now, but there are some my thoughts, the NuttX Microwidows screen, mouse and keyboard drivers should be submitted with appropriate build enable options to the mainline Microwindows https://github.com/ghaerr/microwindows before the final nuttx-apps pull request.

Comment thread examples/microwindows/Make.defs Outdated
@acassis

acassis commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

@Acfboy please fix the issues on mwdemo:
image

@simbit18

Copy link
Copy Markdown
Contributor

Hi @Acfboy , could you also add support for building with CMake?

@Acfboy

Acfboy commented Jul 15, 2026

Copy link
Copy Markdown
Author

Hi @Acfboy , could you also add support for building with CMake?

Thank you for the reminder. I will add CMake support later.

@acassis

acassis commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

@Acfboy could you spend some time fixing and improving this PR? It still as Draft. It is important to get it merged and let more people to test and review it. Also please remember to include a proper nuttx/Documentation about nanox/microwindows support on NuttX

@Acfboy

Acfboy commented Jul 21, 2026

Copy link
Copy Markdown
Author

Hi @acassis , thank for the reminder. I agree I should submit the previous work as a proper PR for the community to review. However, for it to be a proper PR, I think I need to merge the existing NuttX drivers into the Microwindows mainline first. I apologize for postponing this part of the work earlier. I will submit a PR for upstream MW review soon.

@ppisa

ppisa commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Yes, this what I have proposed and expect as well.

You should set something like SCREEN=NUTTX or SCREEN=NUTTX_FB in the local graphics/microwindows/Makefile and then Microwindows with merged code should add correct driver sources when you include microwindows/src/drivers/Objects.rules.

Same for the MOUSE and KEYBOARD. The question is if the mouse should be a single driver or one for relative motion mouse device and other for touchscreen.

As for the keyboard, there can be space to think how to map it the best way. The NnuttX provides its KEYCODE_xxx macros in kbd_codec.h for special keys. But only for these and rest is expected to be ASCII. Microwindows works with MWKEY and MWSCANCODE which aligns with concept of real X11 where the keyboards provide "position" of pressed key by scancode and it can be remapped to symbol even latter in application. But usually MWKEY code is used and its definitions are provided in src/include/mwtypes.h.

You provide translation in translate_keycode when keyboard is in g_kbd_mode set to KBD_MODE_EVENT but there is heuristics during open. I think that there could be two drivers, one for event type and another for raw keyboards. This could be configured through Kconfig, same would be useful for device name. So it is necessary to think a little what is the best option there.

You should try even if Nano-X server and clients can be run on NuttX. I do not see X11 graphics option as the main priority, but it would prove that even complex setup can be build and check if it is stable on NuttX.

@Acfboy

Acfboy commented Jul 21, 2026

Copy link
Copy Markdown
Author

The NnuttX provides its KEYCODE_xxx macros in kbd_codec.h for special keys. But only for these and rest is expected to be ASCII.

Hi, @ppisa . I have a question about this statement. It seems to me that the ranges of the KEYCODE_xxx macros and ASCII are conflicting, which makes it impossible for my driver to distinguish whether it's a character or a special key. In my sim:mw setup, this results in being unable to type a space.

I think that there could be two drivers, one for event type and another for raw keyboards. This could be configured through Kconfig, same would be useful for device name.

Two drivers makes the code cleaner. But specify the device path/name via Kconfig risks inconsistency with the real device. Alternatively, if Microwindows auto-selects the device based on NuttX config, then we have to keep both sides in sync — which adds maintenance overhead.

You should try even if Nano-X server and clients can be run on NuttX.

Okay, I'll try server and client of NanoX.

@ppisa

ppisa commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

The NnuttX provides its KEYCODE_xxx macros in kbd_codec.h for special keys. But only for these and rest is expected to be ASCII.

Hi, @ppisa . I have a question about this statement. It seems to me that the ranges of the KEYCODE_xxx macros and ASCII are conflicting, which makes it impossible for my driver to distinguish whether it's a character or a special key. In my sim:mw setup, this results in being unable to type a space.

Yes, you are right, I expected that for KEYCODE_NORMAL the ASCII value is returned in another field of the event structure, but there is only

struct keyboard_event_s
{
  uint32_t type;
  uint32_t code;
};

where type is KEYBOARD_PRESS or KEYBOARD_RELEASE. But into code sent to keyboard_event() is ASCII code for example in g_km_keymap in STM32 matrix keyboard but some other drivers call keyboard_event() even with X11 encoded KeySim (arch/sim/src/sim/posix/sim_x11eventloop.c) and some with keys translated to KEYCODE_xxx where is no space for ASCII.

So this seems to be call for priority issue.

@acassis @gregory-nutt Please, do you have some some insight what is right?

The simple fix is to push KEYCODE_FWDDEL in include/nuttx/input/kbd_codec.h to be above ASCII, for example 128 or 129. But may it be it can break some targets where it would result in some large arrays, etc. When keyboards with interpreted national symbols are used then it would worth to push special codes even further after basic unicode...

I think that there could be two drivers, one for event type and another for raw keyboards. This could be configured through Kconfig, same would be useful for device name.

Two drivers makes the code cleaner. But specify the device path/name via Kconfig risks inconsistency with the real device. Alternatively, if Microwindows auto-selects the device based on NuttX config, then we have to keep both sides in sync — which adds maintenance overhead.

Yes but NuttX is based on configuration and it is better to fail then to do lot of testing of different device names and even deciding if it is raw driver or event based. But in general it seems that there is pace for some discussion and making KBD simple on the NuttX side.

You should try even if Nano-X server and clients can be run on NuttX.

Okay, I'll try server and client of NanoX.

Thanks.

@acassis

acassis commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

The NnuttX provides its KEYCODE_xxx macros in kbd_codec.h for special keys. But only for these and rest is expected to be ASCII.

Hi, @ppisa . I have a question about this statement. It seems to me that the ranges of the KEYCODE_xxx macros and ASCII are conflicting, which makes it impossible for my driver to distinguish whether it's a character or a special key. In my sim:mw setup, this results in being unable to type a space.

Yes, you are right, I expected that for KEYCODE_NORMAL the ASCII value is returned in another field of the event structure, but there is only

struct keyboard_event_s
{
  uint32_t type;
  uint32_t code;
};

where type is KEYBOARD_PRESS or KEYBOARD_RELEASE. But into code sent to keyboard_event() is ASCII code for example in g_km_keymap in STM32 matrix keyboard but some other drivers call keyboard_event() even with X11 encoded KeySim (arch/sim/src/sim/posix/sim_x11eventloop.c) and some with keys translated to KEYCODE_xxx where is no space for ASCII.

So this seems to be call for priority issue.

@acassis @gregory-nutt Please, do you have some some insight what is right?

The simple fix is to push KEYCODE_FWDDEL in include/nuttx/input/kbd_codec.h to be above ASCII, for example 128 or 129. But may it be it can break some targets where it would result in some large arrays, etc. When keyboards with interpreted national symbols are used then it would worth to push special codes even further after basic unicode...

I think that there could be two drivers, one for event type and another for raw keyboards. This could be configured through Kconfig, same would be useful for device name.

Two drivers makes the code cleaner. But specify the device path/name via Kconfig risks inconsistency with the real device. Alternatively, if Microwindows auto-selects the device based on NuttX config, then we have to keep both sides in sync — which adds maintenance overhead.

Yes but NuttX is based on configuration and it is better to fail then to do lot of testing of different device names and even deciding if it is raw driver or event based. But in general it seems that there is pace for some discussion and making KBD simple on the NuttX side.

You should try even if Nano-X server and clients can be run on NuttX.

Okay, I'll try server and client of NanoX.

Thanks.

Hi @ppisa I don't know the right approach to keyboard input keys symbols. Actually @linguini1 faced similar issue when porting Doom to NuttX. Unfortunately NuttX doesn't have a standard keyboard symbols

@github-actions github-actions Bot added Size: L and removed Size: XL labels Jul 23, 2026
@linguini1

Copy link
Copy Markdown
Contributor

One option suggested by @cederom was to adopt the EVDEV codec: https://en.wikipedia.org/wiki/Evdev

@ppisa

ppisa commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Hi @ppisa I don't know the right approach to keyboard input keys symbols. Actually @linguini1 faced similar issue when porting Doom to NuttX. Unfortunately NuttX doesn't have a standard keyboard symbols

@linguini1 and @acassis, I propose simple fix include/nuttx/input/kbd_codec.h

-  KEYCODE_FWDDEL,
+  KEYCODE_FWDDEL = 128,     

Or even larger shift to something like 0xF800 as used on Microwindows.

This would solve problem with overlap of letters and other ASCII codes with special keys.

I can open issue for this. The question is if there is something, some other keyboard driver or application, which breaks by this shift of KEYCODE_xxx. It would be problem if somebody uses the codes as index into some array etc... 128 or 129 shift is not so big so it less expensive if somebody uses arrays for some key code transformation.

I think that that this is reasonable solution for NuttX and current model.

@linguini1

Copy link
Copy Markdown
Contributor

I agree, and this was a solution I considered but ultimately did not have enough time to verify if it would break other things in the kernel. I think that is at least a good interim solution which is less invasive.

@ghaerr

ghaerr commented Jul 24, 2026

Copy link
Copy Markdown

Or even larger shift to something like 0xF800 as used on Microwindows.

Looking ahead at Unicode, Microwindows moved its key code base to F800 because that belongs to the Unicode BMP Private Use Area. This won't overlap other Unicode values if/when NuttX applications move to Unicode.

It would be problem if somebody uses the codes as index into some array etc... 128 or 129 shift is not so big

Possibly good idea, but pushes off actively looking through source for problems now, and not having to change them again perhaps later. FWIW, myself knowing very little about NuttX, if a small shift is thought better for now, choosing a base of 256 at least allows space for using the upper half of various 256-byte multilingual code pages for non-US (e.g. European) accented characters, etc. OTOH, if keycodes are stored in byte arrays, then 128/129 would likely be mandated.

@Acfboy
Acfboy marked this pull request as ready for review July 26, 2026 15:08
acassis
acassis previously approved these changes Jul 26, 2026
@github-actions github-actions Bot added Size: XL and removed Size: L labels Jul 26, 2026
Comment thread graphics/microwindows/Make.defs Outdated
Comment thread graphics/microwindows/Makefile Outdated

include $(APPDIR)/Make.defs

# LVGL graphic library

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fix the comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the careful review!

Comment thread graphics/microwindows/Makefile Outdated
MICROWINDOWS_DIR = .
MICROWINDOWS_DIR_NAME = microwindows

#-include ./lvgl/lvgl.mk

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Comment thread graphics/microwindows/Makefile Outdated

MICROWINDOWS_COMMIT_HASH := 8809effdd0dfe6c2ac8fd0f455a31407e8495a93

#CONFIG_GRAPH_MICROWINDOWS_URL ?= "https://codeload.github.com/ghaerr/microwindows/zip/refs/heads/master"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove

Comment thread graphics/microwindows/Makefile Outdated

CSRCS += $(MW_CORE_OBJS:%.o=%.c)

#$(error EXTOBJS=$(EXTOBJS))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove

Comment thread examples/microwindows/mwexample.c Outdated
Comment thread graphics/microwindows/mwin-local/scr_nuttx.c Outdated
Comment thread graphics/microwindows/Make.defs Outdated
CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/microwindows/microwindows/src/include
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/graphics/microwindows/microwindows/src/drivers

ifeq ($(CONFIG_VIDEO_FB),)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add the dependence to Kconfig

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks!

Comment thread graphics/microwindows/Make.defs Outdated
Comment thread examples/microwindows/mwexample.c Outdated
# License for the specific language governing permissions and limitations
# under the License.
#
############################################################################

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Acfboy please clean up your patch before merging, @acassis don't merge this patch before I approve.

ppisa and others added 14 commits July 27, 2026 01:46
…to NuttX

The Microwidows/Nano-X (https://microwindows.org/) is project
developed and maintained by Gregory Haerr. It is heavily
extended from predecessor NanoGUI and supports multiple APIs.

The initial integration build only core parts engine,
drivers and basic/included precompiled bitmap fonts.

The source files are derived from list provided by Objects.rules
files in appropriate Microwindows directories.

The build requires fix includes in src/engine/devfont.c
where

  #include <strings.h>

is missing for strcasecmp().

Only dummy keyboard and mouse drivers are compiled.
Screen driver has to be implemented/ported for NuttX
FrameBuffer device API.

Signed-off-by: Pavel Pisa <ppisa@pikron.com>
Added scr_nuttx.c under mwin-local/, using /dev/fb0 via the NuttX
framebuffer API. Added examples/microwindows Kconfig, Make.defs
and Makefile with a simple mwexample.c test app.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Added kbd_nuttx.c and mou_nuttx.c under mwin-local/ for keyboard
and mouse input via NuttX input subsystem. Updated mwexample.c
with a mouse/keyboard input demo.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Replaced mwexample.c with mwdemo.c, the Microwindows Win32 API demo
with 3D graphics, controls, timers and images. Added mwdemo_main.c
as the NuttX entry point calling WinMain. Updated Makefile to
include the mwin library sources.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Renamed mwdemo_main() back to main() per POSIX convention; the
NuttX build system handles the name transformation for builtins.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Added car8, zion208, penguin, under4, cs1, rle8 and microwin
images from mw demos to mwdemo.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Fixed backspace/del handling in the raw keyboard driver by using
lib_meminstream to properly decode escape sequences from USB HID
keyboards.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Fixed nxstyle violations in mwdemo.c reported by CI.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Added CONFIG_LIBC_KBDCODEC guards around kbd_codec-dependent code
in the raw keyboard driver to fix compilation when the library is
not enabled.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Check TOUCH_POS_VALID before using touch coordinates to avoid
using uninitialized values when the flag is not set by the
touchscreen driver.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
…ions

Removed local mwin-local/ drivers; the NuttX screen, keyboard,
mouse and touchscreen drivers are now pulled from upstream
Microwindows (ghaerr/microwindows#193). Added Kconfig for
keyboard and mouse driver selection. Use MWCONFIG_FILE mechanism
instead of hardcoded CFLAGS defines.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Added NOKBD/NOMOUSE and custom driver options to Kconfig so that
display-only applications or BSP-level custom drivers can be used
without compiling the built-in input drivers.

Signed-off-by: Acfboy <AcfboyU@outlook.com>
fix some nxstyle errors in mwdemo.c

Signed-off-by: Acfboy <AcfboyU@outlook.com>
Removed leftover LVGL comments and debug lines. Moved distclean
block next to context download block under the same ifeq. Added
depends on VIDEO_FB in Kconfig to replace the Make.defs error
check. Changed MODULE = y to MODULE = $(CONFIG_EXAMPLES_MICROWINDOWS).

Signed-off-by: Acfboy <AcfboyU@outlook.com>
@Acfboy

Acfboy commented Jul 26, 2026

Copy link
Copy Markdown
Author

Hi @xiaoxiang781216 @acassis thanks for the thorough review! I've addressed all your feedback and fixed the non-standard commit messages flagged by checkpatch.

@xiaoxiang781216

Copy link
Copy Markdown
Contributor

Hi @xiaoxiang781216 @acassis thanks for the thorough review! I've addressed all your feedback and fixed the non-standard commit messages flagged by checkpatch.

please merge your temp change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants