libc/kbd: raw-клавиатура — вычерпывание FIFO + селективный wipe модификаторов
- kbd_raw_sync: цикл вычерпывания SIO FIFO (не 1 байт/прерывание) — фикс залипания клавиш; overrun-wipe сбрасывает только пострадавшие клавиши, не модификаторы (typematic их не перечитывает). - Гайд docs/kbd-games.md; заметка о Rx-overrun в docs/TODO.md; справочник скан-кодов в docs/libc-reference.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+11
-3
@@ -48,9 +48,13 @@ uint8_t kbd_raw_down(uint16_t code);
|
||||
|
||||
/* Восстановление после Rx-overrun SIO: звать РАЗ В КАДР (до чтения
|
||||
* kbd_raw_down). Аппаратный FIFO SIO 3 байта; при длинных DI-окнах пачка
|
||||
* скан-кодов (напр. shift+стрелка release) переполняет его → потерян break
|
||||
* → залипшая клавиша. Трамплин ловит overrun и взводит флаг; kbd_raw_sync
|
||||
* по флагу сбрасывает ВСЁ held-состояние (реально зажатые перечитаются). */
|
||||
* скан-кодов (напр. быстрый тап стрелки: make+break = 5 байт) переполняет
|
||||
* его → потерян break → залипшая клавиша. Трамплин ловит overrun и
|
||||
* взводит флаг; kbd_raw_sync по флагу сбрасывает held-состояние всех
|
||||
* клавиш КРОМЕ модификаторов (Shift/Ctrl/Alt): PS/2 автоповторяет только
|
||||
* последнюю нажатую клавишу, поэтому обычные зажатые перечитаются
|
||||
* typematic'ом, а сброшенный модификатор восстановить нечем — он бы
|
||||
* «отваливался» при каждом overrun (см. kbd_raw_sync.c). */
|
||||
void kbd_raw_sync(void);
|
||||
|
||||
#define KBD_EXT 0x0100 /* база кода была расширенной (0xE0-префикс) */
|
||||
@@ -66,5 +70,9 @@ void kbd_raw_sync(void);
|
||||
#define KBD_ESC 0x76
|
||||
#define KBD_LSHIFT 0x12
|
||||
#define KBD_RSHIFT 0x59
|
||||
#define KBD_LCTRL 0x14
|
||||
#define KBD_LALT 0x11
|
||||
#define KBD_RCTRL (KBD_EXT | 0x14)
|
||||
#define KBD_RALT (KBD_EXT | 0x11)
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user