Есть ли проблемы с обработкой клавиатурных прерываний в QEMU?

Здравствуйте! У меня возникли трудности с обработкой брейк-кодов при отпускании клавиш в QEMU. Я выяснил, что при нажатии клавиши приходит одно прерывание со сканкодом, а при отпускании - два прерывания: сначала сканкод 0xf0, а затем сканкод отпущенной клавиши. Я также проверил набор сканкодов контроллера клавиатуры и получил значение 0x41, что указывает на наличие двух наборов сканкодов. Однако, похоже, брейк-коды не приходят после отпускания клавиш. 

Правильно ли я понимаю, как устроены клавиатурные прерывания? Следует ли мне провести какие-либо настройки контроллера, например, перезапустить его и заново задать набор?
  • 20 января 2025 г. 10:33
Ответы на вопрос 2
Здравствуйте!

Да, вы правильно уловили логику работы клавиатурных прерываний и сканкодов. В общем случае, при нажатии клавиши вам отправляется сканкод нажатой клавиши, а при отпускании - сначала сканкод `0xF0` (который указывает на отпускание клавиши), а затем сам сканкод отпущенной клавиши.

Если в вашем случае после отпускания клавиши не приходит ожидаемый брейк-код (сканкод отпущенной клавиши) или грамотно не распознаются все коды, это может быть вызвано несколькими факторами:

1. **Состояние контроллера клавиатуры**: Возможно, контроллер клавиатуры нужно настроить или сбросить. Проверьте, правильно ли установлены режимы работы контроллера, который обрабатывает клавиатурные прерывания. 

2. **Проблемы аппаратного обеспечения или виртуализации**: Иногда в средах виртуализации, таких как QEMU, могут возникать проблемы с эмуляцией определенных устройств. Убедитесь, что используемая вами версия QEMU поддерживает правильную эмуляцию контроллера клавиатуры.

3. **Обработка прерываний**: Убедитесь, что ваш код правильно обрабатывает все входящие прерывания. Возможно, вам стоит реализовать специальную логику для игнорирования или корректной обработки кодов `0xF0`.

4. **Настройки BIOS/UEFI**: В редких случаях некоторые настройки BIOS/UEFI могут влиять на работу клавиатуры. Иногда стоит проверить настройки виртуальной машины на предмет поддержки клавиатурных функций.

5. **Документация и примеры**: Посмотрите на документацию QEMU и примеры, которые могут проиллюстрировать, как именно они работают с клавиатурными входами и прерываниями.

Если после всех ваших проверок проблемы сохраняются, возможно, стоит обратиться к сообществу QEMU или разработчикам, чтобы получить помощь в диагностике неполадки.
Правильно ли я вообще понимаю как устроенны клавиатурные прерывания?

Пишут такое:
In the default configuration, break codes are the make scan codes with the high bit set; make codes 60h,61h,70h, etc. are not available because the corresponding break codes conflict with prefix codes (code 2Ah is available because the self-test result code AAh is only sent on keyboard initialization). An alternate keyboard configuration can be enabled on AT and later systems with enhanced keyboards, in which break codes are the same as make codes, but prefixed with an F0h scan code.

т.е. понимаешь правильно, но это 1) настройка для альтернативной конфигурации и 2) бывают многобайтовые скан-коды ( см . например).
Похожие вопросы