QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”

UART driver for QEMU receiving `delete` byte instead of `backspace`

我按下键盘上的退格键,我得到了delete字节,它是127而不是8,这是backspace的代表使用下面简单的get/put串口功能。

#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) & (1 << 5)) == 0);
    mmio_write_byte(UART0_BASE, UART_THR, c);
}

char uart0_get() {
    while ((mmio_read_byte(UART0_BASE, UART_LSR) & (1 << 0)) == 0);
    return mmio_read_byte(UART0_BASE, UART_RHR);
}

在我的驱动程序代码中,我有以下内容:

    while (1) {
        char c = read_char();
        if (c == 127) {
            puts("HERE: delete\n");
        } else if (c == 8) {
            puts("HERE: backspace\n");
        } else if (c == 10 || c == 13) {
            putchar('\n');
        } else {
            putchar(c);
        }
    }

当我 运行 QEMU 并反复按下键盘上的退格键时,我收到以下信息:

$ 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)...

这是正确的行为。如果按键盘上的退格键,它的功能是删除光标后面的字符,而不是不删除就把光标移回去。

delete 按钮不转换为任何 ASCII 字符。它在终端内部但未发送。