/*
 * kbd_raw_open — включить эксклюзивный raw-канал клавиатуры: с этого
 * момента байты SIO-A клавиатуры декодирует трамплин ПРЯМО в
 * прерывании (_kbdraw_down[], см. libc/irq/_irq_tramp.c), DSS их
 * больше не видит — kbhit/getch/getkey/kbd_mod_state перестают
 * получать новые события (applications/PoP/docs/PORT_PLAN.md §2).
 *
 * Захватывает IM2-таблицу тем же счётчиком ссылок, что
 * irq_chain_add/cbl_open (_irq_table_ref) — можно сочетать с кадровой
 * цепочкой и CBL одновременно, они независимы (разные условия ветвления
 * в трамплине).  atexit подстрахует close.
 */

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sprinter_exit.h>
#include <kbd_raw.h>
#include "_kbdraw.h"
#include "../irq/_irq.h"

int kbd_raw_open(void)
{
    if (_kbdraw_active) { errno = EBUSY; return -1; }
    if (_irq_table_ref() != 0) return -1;

    memset(_kbdraw_down, 0, sizeof(_kbdraw_down));
    _kbdraw_pending = 0;

    static uint8_t atexit_armed;
    if (!atexit_armed) {
        atexit_armed = 1;
        atexit(kbd_raw_close);
    }

    IRQ_DISABLE();
    _kbdraw_active = 1;
    IRQ_ENABLE();
    return 0;
}
