boredos_mirror/docs/architecture/input/keyboard.md
Lluciocc 915e33434e
feature(input): implement keyboard layouts and utf-8 input subsystem
* Adding keyboard layout (backend)

* Update settings.c with new keyboard tab

* Fixing keyboard icon && Fixing long loading time in settings.c

* Refactor of key handling for a larger compatibility with the keyboard layout

* Adding keyboard handler

* Udating ps2.c with the new logic

* Updating WM/kernel/userland with the new input system

* Fixing keycode range && Updating dead keys handling

* Add comments for explanation

* Update notepad & vm.c to parse utf-8

* Adding utf-8 parsing utils in libc && Update notepad.c

* Adding icon for icon settings

* Fixing a warning with double definition

* Adding new kb kayout: QWERTZ and DVORAK && Update new layout instrauction

* Add documentation for keyboard input subsystem

This document outlines the architecture and design of the input subsystem, focusing on keyboard input processing, driver responsibilities, keycode representation, and keymap functionality.

---------

Co-authored-by: boreddevnl <chris@boreddev.nl>
2026-04-23 21:31:52 +02:00

6.2 KiB
Raw Blame History

Input Subsystem

Overview

The input subsystem is responsible for handling user input, primarily from the keyboard.

It provides a structured pipeline that transforms low-level hardware signals into usable data for the kernel and higher-level components. This subsystem abstracts hardware-specific behavior and exposes a consistent interface to the rest of the operating system.


Scope

The /input directory focuses on keyboard input. It includes:

  • A keyboard driver responsible for handling hardware events
  • A keycode layer used as an intermediate representation
  • A keymap system that translates keycodes into characters

Design Principles

  • Hardware abstraction
    Hardware-specific logic is isolated from higher-level components.

  • Simplicity
    The input path is kept minimal and efficient, especially in interrupt context.

  • Modularity
    Each stage of input processing is handled by a dedicated component.

  • Extensibility
    The system is designed to support additional input devices and layouts in the future.


Directory Structure

input/
├── keyboard.c
├── keyboard.h
├── keycodes.h
├── keymap.c
├── keymap.h

Input Processing Model

Keyboard input is processed in three distinct stages:

  1. Raw scancodes are received from the hardware
  2. Scancodes are converted into keycodes
  3. Keycodes are translated into characters or control signals

Each stage is handled independently to ensure clarity and maintainability.


Components

Keyboard Driver

Overview

The keyboard driver interfaces directly with the keyboard hardware. It handles interrupts and processes raw input data from the controller.

Responsibilities

  • Handle keyboard interrupts
  • Read scancodes from the PS/2 controller
  • Convert scancodes into keycodes
  • Forward processed data to higher layers

Behavior

The driver operates in an interrupt-driven context. When a key event occurs, the hardware triggers an interrupt. The driver reads the corresponding scancode and processes it immediately.

Because this code runs at a low level, it must be fast, predictable, and minimal.

Integration

The keyboard driver depends on:

  • The PS/2 controller driver for hardware communication
  • The interrupt subsystem for event handling

It provides output to:

  • The keycode system
  • The keymap system

Constraints

  • Must not block execution
  • Must minimize processing time per interrupt
  • Must correctly handle key press and key release events

Keycodes

Overview

Keycodes define a hardware-independent representation of keyboard keys.

They serve as an abstraction layer between raw scancodes and higher-level logic.

Purpose

The keycode system standardizes keyboard input by mapping all physical key events to a consistent set of identifiers.

This allows the system to:

  • Remain independent from specific hardware implementations
  • Simplify input handling logic
  • Support multiple layouts and configurations

Design

Each key is represented by a unique constant, such as:

  • KEY_A
  • KEY_ENTER
  • KEY_SHIFT

Role in the System

Keycodes act as the intermediate layer between:

  • Hardware-level scancodes
  • Character-level or command-level input

Usage

  • Generated by the keyboard driver
  • Consumed by the keymap system

Extensibility

The keycode system can be extended to support:

  • Additional keys (function keys, multimedia keys)
  • Non-standard input devices
  • Custom mappings

Keymap

Overview

The keymap system translates keycodes into characters or control signals.

It defines how physical key presses are interpreted based on layout and modifier state.

Responsibilities

  • Convert keycodes into ASCII or equivalent representations
  • Apply modifier logic such as Shift and Control
  • Provide consistent character output

Behavior

The keymap takes a keycode as input and produces an output depending on:

  • The current keyboard layout
  • Active modifier keys

The same keycode may produce different results depending on modifier state.

Integration

  • Receives keycodes from the keyboard driver
  • Outputs characters to the kernel or userland

Control Signals

In addition to character generation, the input subsystem produces control signals representing non-printable keys and command-oriented input.

These signals are derived from keycodes that do not map directly to ASCII characters.


Definition

A control signal is an abstract representation of a key event used to trigger system-level behavior rather than text output.

Typical control signals include:

  • Enter
  • Backspace
  • Escape
  • Tab
  • Arrow keys
  • Function keys

Encoding

Control signals may be represented in different ways depending on the layer:

ASCII Control Characters (when applicable)

Some keys map to standard ASCII control codes:

  • ENTER0x0A (Line Feed) or 0x0D (Carriage Return)
  • BACKSPACE0x08
  • TAB0x09
  • ESC0x1B

These values are part of the ASCII control range (0x000x1F).


Non-ASCII Keys

Keys that do not belong to the ASCII set are typically handled as extended keycodes or internal constants:

Examples:

  • Arrow keys
  • Insert / Delete
  • Home / End
  • Function keys (F1F12)

Non-ASCII Characters

Non-ASCII characters include any character outside the standard 7-bit ASCII range (0x000x7F).

Examples:

  • Accented characters: é, à, ç
  • Symbols: , £
  • Unicode characters from non-Latin scripts

Encoding Considerations

The current system typically assumes ASCII output. However, supporting non-ASCII characters requires:

  • A wider character encoding (e.g. UTF-8)
  • Extended keymaps capable of mapping key combinations to multi-byte sequences

Example:

  • 'é' in UTF-8 → 0xC3 0xA9

Modifier and Layout Impact

Non-ASCII characters are often produced through:

  • Keyboard layout differences (AZERTY vs QWERTY)
  • Modifier combinations (Shift, AltGr)

Example:

  • AltGr + E'€' (depending on layout)
  • KEY_E'e'
  • KEY_E + SHIFT'E'

Usage

  • Control signals are used for command handling and system interaction
  • Non-ASCII characters are used for text input and require proper encoding support