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 字符。它在终端内部但未发送。
我按下键盘上的退格键,我得到了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 字符。它在终端内部但未发送。