From e1a91b03714e8f93479a57fa13af6e36bbe125fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 25 Sep 2020 17:11:45 +0200 Subject: [PATCH] Made console device configurable independently from input device. --- .../circuity/client/gui/RISCVTestScreen.java | 47 ++++++++++--------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/main/java/li/cil/circuity/client/gui/RISCVTestScreen.java b/src/main/java/li/cil/circuity/client/gui/RISCVTestScreen.java index 7ac6f7ba..9ced5924 100644 --- a/src/main/java/li/cil/circuity/client/gui/RISCVTestScreen.java +++ b/src/main/java/li/cil/circuity/client/gui/RISCVTestScreen.java @@ -28,7 +28,8 @@ import java.util.Objects; public final class RISCVTestScreen extends Screen { private static final Logger LOGGER = LogManager.getLogger(); - private static final boolean USE_VIRT_IO = false; + private static final boolean USE_VIRTIO_CONSOLE = true; + private static final boolean USE_VIRTIO_KEYBOARD = false; private final Terminal terminal = new Terminal(); private VirtualMachineRunner runner; @@ -100,6 +101,9 @@ public final class RISCVTestScreen extends Screen { @Override public boolean charTyped(final char ch, final int modifier) { + if (USE_VIRTIO_KEYBOARD) { + return false; + } terminal.putInput((byte) ch); return true; } @@ -110,7 +114,7 @@ public final class RISCVTestScreen extends Screen { return super.keyPressed(keyCode, scanCode, modifiers); } - if (USE_VIRT_IO) { + if (USE_VIRTIO_KEYBOARD) { if (KeyCodeMapping.MAPPING.containsKey(keyCode)) { keyboard.sendKeyEvent(KeyCodeMapping.MAPPING.get(keyCode), true); return true; @@ -138,7 +142,7 @@ public final class RISCVTestScreen extends Screen { @Override public boolean keyReleased(final int keyCode, final int scanCode, final int modifiers) { - if (USE_VIRT_IO) { + if (USE_VIRTIO_KEYBOARD) { if (KeyCodeMapping.MAPPING.containsKey(keyCode)) { keyboard.sendKeyEvent(KeyCodeMapping.MAPPING.get(keyCode), false); return true; @@ -157,33 +161,27 @@ public final class RISCVTestScreen extends Screen { final PhysicalMemory rom = Memory.create(128 * 1024); final PhysicalMemory memory = Memory.create(32 * 1014 * 1024); final VirtIOBlockDevice hdd = new VirtIOBlockDevice(board.getMemoryMap(), ByteBufferBlockDevice.createFromFile(rootfsFile, true)); + uart = new UART16550A(); + console = new VirtIOConsoleDevice(board.getMemoryMap()); + keyboard = new VirtIOKeyboardDevice(board.getMemoryMap()); final StringBuilder bootargs = new StringBuilder(); bootargs.append("root=/dev/vda ro"); - if (USE_VIRT_IO) { - console = new VirtIOConsoleDevice(board.getMemoryMap()); - keyboard = new VirtIOKeyboardDevice(board.getMemoryMap()); - - console.getInterrupt().set(0x1, board.getInterruptController()); - keyboard.getInterrupt().set(0x2, board.getInterruptController()); - + if (USE_VIRTIO_CONSOLE) { board.addDevice(console); - board.addDevice(keyboard); - bootargs.append(" console=hvc0"); } else { - uart = new UART16550A(); - - uart.getInterrupt().set(0xA, board.getInterruptController()); - board.addDevice(uart); - bootargs.append(" console=ttyS0"); } + console.getInterrupt().set(0x1, board.getInterruptController()); + keyboard.getInterrupt().set(0x2, board.getInterruptController()); hdd.getInterrupt().set(0x3, board.getInterruptController()); + uart.getInterrupt().set(0xA, board.getInterruptController()); + board.addDevice(keyboard); board.addDevice(hdd); board.addDevice(0x80000000, rom); board.addDevice(0x80000000 + 0x400000, memory); @@ -230,7 +228,7 @@ public final class RISCVTestScreen extends Screen { @Override protected void step() { - if (USE_VIRT_IO) { + if (USE_VIRTIO_CONSOLE) { boolean wrote = false; while (!inputBuffer.isEmpty() && console.canPutByte()) { wrote = true; @@ -239,15 +237,20 @@ public final class RISCVTestScreen extends Screen { if (wrote) { console.flush(); } + + int value; + while ((value = console.read()) != -1) { + outputBuffer.enqueue((byte) value); + } } else { while (!inputBuffer.isEmpty() && uart.canPutByte()) { uart.putByte(inputBuffer.dequeueByte()); } - } - int value; - while ((value = uart.read()) != -1) { - outputBuffer.enqueue((byte) value); + int value; + while ((value = uart.read()) != -1) { + outputBuffer.enqueue((byte) value); + } } }