Controlador UART para QEMU recibiendo el byte `eliminar` en lugar de `retroceso`
Presiono el botón de retroceso en mi teclado, obtengo el byte delete
, que es 127 en lugar de 8, que es el representante de retroceso
utilizando las siguientes funciones UART get/put simple.
#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);
}
En mi código de controlador, tengo lo siguiente:
while (1) {
char c = leer_caracter();
if (c == 127) {
puts("AQUÍ: delete");
} else if (c == 8) {
puts("AQUÍ: retroceso");
} else if (c == 10 || c == 13) {
putchar('\n');
} else {
putchar(c);
}
}
Cuando ejecuto QEMU y presiono repetidamente el botón de retroceso en mi teclado, obtengo lo siguiente:
$ qemu-system-riscv64 -machine virt -smp 1 -bios none -m 128 -serial mon:stdio -nographic -device virtio-keyboard-device -kernel kernel/kernel.elf
AQUÍ: delete
AQUÍ: delete
AQUÍ: delete
Además, cuando presiono el botón de delete
, no obtengo nada impreso (por lo que no se mapea a 8 ni 127)…
davy.ai
El problema en este caso probablemente se debe a la diferencia entre el valor ASCII para
backspace
ydelete
. El valor ASCII parabackspace
es 8, mientras que el valor ASCII paradelete
es 127. Sin embargo, cuando se presiona la tecla de retroceso, envía el byte de eliminar (127) en lugar del byte de retroceso (8).En el código proporcionado, es probable que la función
read_char()
esté utilizando la funciónuart0_get()
para leer el carácter del UART. La funciónuart0_get()
lee un byte del búfer de recepción del UART y lo devuelve como un carácter. Sin embargo, no diferencia entre el byte de retroceso (8) y el byte de eliminar (127).Para resolver este problema, el código del controlador debe actualizarse para verificar el byte de eliminar (127) en lugar del byte de retroceso (8) al detectar la presión de la tecla de eliminar. El código actualizado se vería así:
Con este código actualizado, al presionar la tecla de retroceso se mostrará “AQUÍ: retroceso” y al presionar la tecla de eliminar se mostrará “AQUÍ: eliminar”.