es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)…

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema en este caso probablemente se debe a la diferencia entre el valor ASCII para backspace y delete. El valor ASCII para backspace es 8, mientras que el valor ASCII para delete 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ón uart0_get() para leer el carácter del UART. La función uart0_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í:

        while (1) {
            char c = read_char();
            if (c == 127) {  // verificar el byte de eliminar
                puts("AQUÍ: eliminar\n");
            } else if (c == 8) {  // verificar el byte de retroceso
                puts("AQUÍ: retroceso\n");
            } else if (c == 10 || c == 13) {
                putchar('\n');
            } else {
                putchar(c);
            }
        }
    

    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”.

Comments are closed.