QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”
Posted
技术标签:
【中文标题】QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”【英文标题】:UART driver for QEMU receiving `delete` byte instead of `backspace` 【发布时间】:2022-01-09 19:53:41 【问题描述】:我按下键盘上的退格键,我得到 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) & (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)...
【问题讨论】:
【参考方案1】:这是正确的行为。如果你按键盘上的退格键,它的作用是删除光标后面的字符,而不是将光标向后移动而不删除。
delete
按钮不会转换为任何 ASCII 字符。它在终端内部但未发送。
【讨论】:
非常感谢!那么ASCII码08
在键盘上翻译成什么?以上是关于QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”的主要内容,如果未能解决你的问题,请参考以下文章