public inbox for devicetree@vger.kernel.org
 help / color / mirror / Atom feed
From: marlonwu@126.com
To: robh@kernel.org, dmitry.torokhov@gmail.com, krzk+dt@kernel.org
Cc: linux-input@vger.kernel.org, devicetree@vger.kernel.org,
	marlonwu@126.com, MenglongWoo@aliyun.com
Subject: [PATCH 1/2] dt-bindings vnc virtual input
Date: Tue, 29 Jul 2025 14:43:45 +0800	[thread overview]
Message-ID: <20250729064346.22834-2-marlonwu@126.com> (raw)
In-Reply-To: <20250729064346.22834-1-marlonwu@126.com>

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=y, Size: 7929 bytes --]

From: Menglong Wu <marlonwu@126.com>

Add documentation for virtual GPIO keys to enable full ANSI keyboard
emulation via VNC on embedded devices without physical keyboards.

- vnc-virtual-input.txt: Usage scenario and implementation details
- vnc-virtual-input.yaml: Formal DT binding specification
- MAINTAINERS: Add entry for VNC virtual input support

The solution registers virtual GPIOs (starting from 400) to avoid conflicts
with physical GPIOs while supporting standard Linux input codes.

Signed-off-by: Menglong Wu <marlonwu@126.com>
---
 .../bindings/input/vnc-virtual-input.txt      | 153 ++++++++++++++++++
 .../bindings/input/vnc-virtual-input.yaml     |  86 ++++++++++
 MAINTAINERS                                   |   7 +
 3 files changed, 246 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/input/vnc-virtual-input.txt
 create mode 100644 Documentation/devicetree/bindings/input/vnc-virtual-input.yaml

diff --git a/Documentation/devicetree/bindings/input/vnc-virtual-input.txt b/Documentation/devicetree/bindings/input/vnc-virtual-input.txt
new file mode 100644
index 000000000000..77d12308c553
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/vnc-virtual-input.txt
@@ -0,0 +1,153 @@
+Register virtual GPIO keys for VNC
+==========================
+
+# Purpose
+
+To emulate a full ANSI keyboard on embedded devices without physical
+keyboards.The server responds to key events via x11vnc.
+This resolves the limitation where embedded systems only register a few
+GPIO keys, making them unable to process full keyboard inputs.
+
+documented in Documentation/devicetree/bindings/input/vnc-virtual-input.yaml
+
+# Scenario
+
+- /dev/input/event1: Physical GPIO buttons
+
+- /dev/input/event2: Physical touchscreen
+
+Assume my-pcb.dts defines two GPIO-based hardware keys (‘A’ and ‘B’).
+When the VNC server x11vnc is started, a remote PC connects via a VNC
+client and attempts to send key inputs.
+Since the Linux kernel only recognizes two keys, the UI on the embedded
+device only responds to ‘A’ and ‘B’.
+
+Start x11vnc server:
+
+```
+    x11vnc -noipv6 -rawfb /dev/fb0 -forever -clip 640x480+0+0 \
+      -pipeinput UINPUT:touch,tslib_cal=/etc/pointercal,\
+      direct_key=/dev/input/event1,\
+      direct_abs=/dev/input/event2
+```
+
+Monitor key events:
+
+```
+    hexdump /dev/input/event1
+```
+
+Check registered virtual GPIOs:
+
+```
+    mount -t debugfs none /sys/kernel/debug/
+    cat /sys/kernel/debug/gpio
+
+    gpiochip5: GPIOs 400-503, parent: platform/gpio_mockup_hw, gpio-mockup-A:
+    gpio-400 (                    |vk_key_0            ) in  lo
+    gpio-401 (                    |vk_key_1            ) in  lo
+```
+
+Original my-pcb.dts:
+
+
+```
+    gpio_keys {
+        compatible = "gpio-keys";
+        pinctrl-0 = <&pinctrl_gpio_keys>;
+
+        key-a {
+            label = "btn-key-a";
+            gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+            linux,code = <KEY_A>;
+        };
+        key-b {
+            label = "btn-key-b";
+            gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
+            linux,code = <KEY_A>;
+        };
+    };
+```
+
+
+# Solution
+
+Modify my-pcb.dts to support a virtual ANSI keyboard:
+
+```
+    #include "vnc-virtual-input.dtsi"
+
+    // Originally, the DTS relied on physical GPIO keys
+    gpio_keys {
+        // Disable the original physical key node
+        status = "disable";
+    };
+
+    // The virtual GPIO DTS node now integrates physical GPIO
+    vnc_key {
+        compatible = "gpio-keys";
+        pinctrl-0 = <&pinctrl_gpio_keys>;
+
+        key-a {
+            label = "btn-key-a";
+            gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+            linux,code = <KEY_A>;
+        };
+        key-b {
+            label = "btn-key-b";
+            gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
+            linux,code = <KEY_A>;
+        };
+    }
+```
+
+# Explanation
+
+A virtual GPIO driver gpio_mockup_hw is registered, providing 104 GPIOs,
+starting from number 400.
+
+The starting number (400) avoids conflicts with physical GPIOs on
+commercialSoCs, which typically do not exceed 400. Most SoC vendors also
+start GPIO numbering from 0 in their drivers.
+
+The gpio_key_mockup node defines 100 ANSI standard keyboard keys.
+
+Key codes (KEY_xx) follow the definitions in
+include/uapi/linux/input-event-codes.h.
+
+
+
+ANSI Keyboard Layout (Symbolic Representation):
+
+```
+L FFFFFFFFFFFFFFF   MMM
+L NNNNNNNNNNNN  R   CCC   PPPP
+LL  AAAAAAAAA RRR   CCC   PPPP
+LLL  AAAAAAA RRRR         PPPP
+LLL   AAAAA RRRRR    C    PPPP
+LLLL  LLLLL RRRRR   CCC   PPPP
+```
+
+
+Key Layout Categories
+
+L: Left-side keys (ESC, TAB, CAPS LOCK, etc.)
+F: Function keys (F1–F12)
+N: Number row (1–0)
+A: Alphabet keys (A–Z)
+R: Right-side keys (BACKSPACE, [, ], , ENTER, etc.)
+M: Miscellaneous (Print Screen, Scroll Lock, Pause/Break)
+C: Cursor controls (Insert, Home, Arrow keys, etc.)
+P: Numpad keys (0–9, -, +, etc.)
+
+
+Example from vnc-virtual-input.dtsi:
+
+```
+    /* Left of a-z */
+    vk_78 {
+        label = "vk_key_78";
+        gpios = <&gpio_mockup_hw 78 GPIO_ACTIVE_HIGH>;
+        linux,code = <KEY_ESC>;
+    };
+```
diff --git a/Documentation/devicetree/bindings/input/vnc-virtual-input.yaml b/Documentation/devicetree/bindings/input/vnc-virtual-input.yaml
new file mode 100644
index 000000000000..8b5414cb2bea
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/vnc-virtual-input.yaml
@@ -0,0 +1,86 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/a.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: VNC Virtual GPIO Keys
+
+maintainers:
+  - Menglong Wu <marlonwu@126.com>
+
+description: |
+  This binding describes a virtual GPIO key input node for VNC remote
+  input.
+  It is based on the standard gpio-keys binding.
+
+select: false
+
+allOf:
+  - $ref: gpio-keys.yaml#
+
+properties:
+  compatible:
+    const: gpio-keys
+
+  status:
+    enum:
+      - okay
+      - disabled
+
+patternProperties:
+  "^key(-)?[0-9a-zA-Z_-]+$":
+    type: object
+    properties:
+      label:
+        description: Descriptive name of the button
+        $ref: /schemas/types.yaml#/definitions/string
+
+      gpios:
+        maxItems: 1
+
+      linux,code:
+        description: Linux input event code
+        $ref: /schemas/types.yaml#/definitions/uint32
+
+      debounce-interval:
+        description: Debounce time in milliseconds
+        $ref: /schemas/types.yaml#/definitions/uint32
+
+      gpio-key,wakeup:
+        description: Enables wakeup function from suspend
+        type: boolean
+
+    required:
+      - label
+      - gpios
+      - linux,code
+
+additionalProperties: false
+
+required:
+  - compatible
+
+examples:
+  - |
+    #include <dt-bindings/input/input.h>
+    #include <dt-bindings/gpio/gpio.h>
+
+    test {
+      vnc_key: vnc_key {
+          compatible = "gpio-keys";
+
+          key-a {
+            label = "btn-key-a";
+            gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+            linux,code = <KEY_A>;
+          };
+          key-b {
+            label = "btn-key-b";
+            gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
+            linux,code = <KEY_A>;
+          };
+      };
+    };
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index c0b444e5fd5a..658ef6619542 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -27476,6 +27476,13 @@ S:	Maintained
 T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
 F:	sound/pci/hda/patch_senarytech.c
 
+VNC VIRTUAL INPUT SUPPORT
+M:	Menglong Wu <marlonwu@126.com>
+L:	linux-kernel@vger.kernel.org
+S:	Maintained
+F:	Documentation/devicetree/bindings/input/vnc-virtual-input.txt
+F:	Documentation/devicetree/bindings/input/vnc-virtual-input.yaml
+
 THE REST
 M:	Linus Torvalds <torvalds@linux-foundation.org>
 L:	linux-kernel@vger.kernel.org
-- 
2.39.5


  reply	other threads:[~2025-07-29  7:29 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-29  6:43 [PATCH 0/2] Register virtual GPIO keys for VNC marlonwu
2025-07-29  6:43 ` marlonwu [this message]
2025-07-29  7:33   ` [PATCH 1/2] dt-bindings vnc virtual input Krzysztof Kozlowski
2025-07-29  6:43 ` [PATCH 2/2] ARM: dts: Add virtual GPIO input for VNC keyboard marlonwu
2025-07-29  7:52   ` Krzysztof Kozlowski
2025-07-29  7:39 ` [PATCH 0/2] Register virtual GPIO keys for VNC Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250729064346.22834-2-marlonwu@126.com \
    --to=marlonwu@126.com \
    --cc=MenglongWoo@aliyun.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=robh@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox