// 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/ne-foss-org/nekernel #include #include #include #include namespace Kernel { EXTERN_C void ke_io_write(IDevice* 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* 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