diff options
Diffstat (limited to 'src/kernel/HALKit/ARM64/HalDebugOutput.cpp')
| -rw-r--r-- | src/kernel/HALKit/ARM64/HalDebugOutput.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/kernel/HALKit/ARM64/HalDebugOutput.cpp b/src/kernel/HALKit/ARM64/HalDebugOutput.cpp new file mode 100644 index 00000000..4e47d38e --- /dev/null +++ b/src/kernel/HALKit/ARM64/HalDebugOutput.cpp @@ -0,0 +1,69 @@ +// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) +// Licensed under the Apache License, Version 2.0 (see LICENSE file) +// Official repository: https://github.com/nekernel-org/nekernel + +#include <ArchKit/ArchKit.h> +#include <KernelKit/DebugOutput.h> +#include <NeKit/New.h> +#include <NeKit/Utils.h> + +namespace Kernel { +EXTERN_C void ke_io_write(IDevice<const Char*>* self, const Char* bytes) { +#ifdef __DEBUG__ + if (*bytes == 0) return; + + SizeT index = 0; + SizeT len = 0; + + index = 0; + len = rt_string_len(bytes, 256U); + + volatile UInt8* uart_ptr = (UInt8*) 0x09000000; + + while (index < len) { + if (bytes[index] == '\r') *uart_ptr = '\r'; + + *uart_ptr = bytes[index] == '\r' ? '\n' : bytes[index]; + ++index; + } +#endif // __DEBUG__ +} + +TerminalDevice::~TerminalDevice() = default; + +EXTERN_C void ke_io_read(IDevice<const Char*>* self, const Char* bytes) { +#ifdef __DEBUG__ + SizeT index = 0; + + volatile UInt8* uart_ptr = (UInt8*) 0x09000000; + + ///! TODO: Look on how to wait for the UART to complete. + while (Yes) { + auto in = *uart_ptr; + + ///! If enter pressed then break. + if (in == 0xD) { + break; + } + + if (in < '0' || in < 'A' || in < 'a') { + if (in != '@' || in != '!' || in != '?' || in != '.' || in != '/' || in != ':') { + continue; + } + } + + ((char*) bytes)[index] = in; + + ++index; + } + + ((char*) bytes)[index] = 0; +#endif // __DEBUG__ +} + +TerminalDevice TerminalDevice::The() { + TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read); + return out; +} + +} // namespace Kernel |
