tianole/docs/agents/tasks/05-input-events.md

100 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 05 输入事件与键盘
## 目标
建立输入事件模型,让键盘成为输入设备的一种,而不是直接绑定 shell 的特殊逻辑。
## 前置条件
- 中断可用。
- 等待队列或事件队列可用。
- early log 可用于调试。
## 建议边界
- `drivers/input/`:通用输入事件。
- `drivers/input/keyboard/`:键盘设备。
- `arch/x86/`PS/2 控制器相关 I/O。
## 实现内容
- 接入 PS/2 keyboard。
- 解码 scancode。
- 生成标准 key event。
- 建立输入事件队列。
- 为终端输入提供读取接口。
### 1. Input core
- 建立通用 input device 和 input event 结构,键盘只是 input device 的一种。
- input core 负责设备注册、事件入队、事件读取和等待队列唤醒。
- event 结构要能表达 key press/release、key code、modifier、设备来源和时间戳。
- 事件队列要有容量、溢出策略和统计信息,不能无限增长。
### 2. Keyboard driver
- PS/2 keyboard driver 只负责读取 scancode、维护按键状态、转换为通用 key event。
- scancode set、keyboard layout 和 keymap 要分层,不能把美式键盘布局写死到驱动主路径。
- modifier、repeat、release event、extended scancode 要逐步补齐。
- 键盘驱动不直接写 terminal、shell 或 VFS。
### 3. IRQ 与 deferred processing
- keyboard IRQ handler 只做短路径:读取数据、确认硬件状态、入队原始或半处理事件。
- 复杂解码、repeat 和 terminal line discipline 可以推迟到线程上下文。
- IRQ handler 不能 sleep不能直接等待队列条件不能调用 shell。
- 如果需要较复杂处理,先建立 deferred work 或 input worker。
### 4. Terminal input boundary
- terminal/tty 层从 input core 读取 key event再处理行编辑、回显、控制字符和后续 job control。
- shell 只读取 terminal 字节流或行,不直接读取 keyboard scancode。
- 后续 USB HID、图形终端或串口终端应复用同一 terminal/input 边界。
- 输入路径要保留 blocking read、nonblocking read 和 poll/select 的接口位置。
## Linux 参考原则
- 参考 Linux input subsystem设备驱动上报通用 input event上层消费者不绑定具体硬件。
- 参考 Linux serio/i8042/atkbd 分层:控制器、键盘协议和 input 事件上报分开。
- 参考 Linux tty/line discipline 思路:键盘事件到 shell 输入之间应有 terminal 层,不让 shell 直接处理硬件事件。
- 参考 Linux IRQ bottom half/workqueue 思路:中断路径短,复杂处理推迟。
## 非玩具化约束
- 键盘驱动只产生事件,不直接操作 shell。
- 键盘布局要可替换。
- 输入队列接口要允许未来接 USB HID。
- 中断 handler 中不要做复杂处理。
- input core 不依赖 PS/2PS/2 driver 不依赖 terminal。
- event queue 要有锁和等待语义,不能靠忙等读取。
- 事件丢失、队列满和未知 scancode 必须可观测。
- blocking read 必须通过 wait queue 或等价机制睡眠,不能轮询。
- terminal 控制字符和 shell 命令解析不能写进 keyboard driver。
## 验收方式
- 按键触发中断。
- kernel 能读取 key event。
- 后续 shell 可复用同一输入接口。
- press/release event 可区分。
- unknown scancode 不会破坏输入队列。
- 没有输入时读取方会睡眠,有输入时被唤醒。
- keyboard selftest 或 QEMU 输入测试能验证事件路径。
- 后续接入 shell 时不需要修改 keyboard driver 主逻辑。
## 当前状态
未开始。
进入本阶段前,`04-time-scheduler.md` 至少应具备可靠 wait queue 和明确的可睡眠/不可睡眠上下文规则。
## 后续扩展
- USB HID keyboard。
- 鼠标和相对/绝对坐标事件。
- key repeat。
- 多 keyboard 设备。
- terminal line discipline。
- nonblocking input、poll/select。
- session、foreground process group 和 job control。