Драйвер UART для QEMU, получающий байт » удалить` вместо `backspace`

#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. Он является внутренним для терминала, но не отправляется.