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);
}
}
}