#c #serial-port #qemu #uart
#c #последовательный порт #qemu #uart
Вопрос:
Я нажимаю кнопку backspace на клавиатуре, я получаю delete
байт, который равен 127 вместо 8, что соответствует backspace
использованию следующих простых функций get/put UART.
#define mmio_write_byte(base, offset, value) *((uint8_t *) (base offset)) = (uint8_t) value #define mmio_read_byte(base, offset) *((uint8_t *) (base offset)) void uart0_put(char c) { while ((mmio_read_byte(UART0_BASE, UART_LSR) amp; (1 lt;lt; 5)) == 0); mmio_write_byte(UART0_BASE, UART_THR, c); } char uart0_get() { while ((mmio_read_byte(UART0_BASE, UART_LSR) amp; (1 lt;lt; 0)) == 0); return mmio_read_byte(UART0_BASE, UART_RHR); }
В моем коде драйвера у меня есть следующее:
while (1) { char c = read_char(); if (c == 127) { puts("HERE: deleten"); } else if (c == 8) { puts("HERE: backspacen"); } else if (c == 10 || c == 13) { putchar('n'); } else { putchar(c); } }
Когда я запускаю QEMU и несколько раз нажимаю кнопку backspace на клавиатуре, я получаю следующее:
$ qemu-system-riscv64 -machine virt -smp 1 -bios none -m 128 -serial mon:stdio -nographic -device virtio-keyboard-device -kernel kernel/kernel.elf HERE: delete HERE: delete HERE: delete
Кроме того, когда я нажимаю delete
кнопку, я ничего не печатаю (поэтому она не отображается ни на 8, ни на 127)…
Ответ №1:
Это правильное поведение. Если вы нажмете клавишу backspace на клавиатуре, ее функция заключается в удалении символа за курсором, а не в перемещении курсора назад без удаления.
delete
Кнопка не переводится ни в один символ ASCII. Он является внутренним для терминала, но не отправляется.