Загрузка данных


if (raw_code != 0) {
    bool pressed = (raw_code & 0x40) ? true : false;
    
    // Очищаем бит нажатия 0x40, оставляя чистый адрес из таблицы (0x04 - 0x1F)
    uint8_t clean_addr = raw_code & 0x3F; 

    // Из таблицы даташита: колонки DIG определяются младшими битами 1-0
    uint8_t dig = clean_addr & 0x03; 
    
    // Строки SEG определяются битами 5-3 чистого адреса
    uint8_t seg = (clean_addr >> 3) & 0x07; 

    // Теперь seg будет гарантированно принимать значения 0, 1, 2 или 3!
    if (seg < 4 && dig < 4) {
        uint32_t map_idx = (seg * 4) + dig;

        if (map_idx < data->keymap_size) {
            uint16_t key_code = data->keymap[map_idx];
            input_report_key(data->dev, key_code, pressed, true, K_FOREVER);
        }
    }
}