From 7e54f0de667f4de2154ccfab304f41c15cfdb9d7 Mon Sep 17 00:00:00 2001 From: Gregory Bowne Date: Wed, 26 Nov 2025 15:53:58 -0800 Subject: [PATCH 1/5] Update display.h updated header for display driver display.c and display.h this will need to be finished wired up. Old display driver would have done nothing. --- kernel/display.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kernel/display.h b/kernel/display.h index 1ae4765..fa84652 100644 --- a/kernel/display.h +++ b/kernel/display.h @@ -2,13 +2,21 @@ #define DISPLAY_H #include +#include "vga.h" // Include VGA functions -#define VGA_PORT 0x3C0 // Base port for VGA +#define VGA_PORT 0x3C0 // Base port for VGA (Often used for general control, though 0x3D4/0x3D5 are used for cursor) // Function prototypes void init_display(void); void enumerate_displays(void); -void set_display_mode(uint8_t mode); +void set_display_mode(uint8_t mode); // In this context, modes are typically BIOS or VESA modes, which are complex. + // We'll treat this as a placeholder/simple mode call. void clear_display(void); +// New function to write a string using the VGA driver +void display_write_string(const char* str); + +// New function to print a formatted string using the VGA driver +void display_printf(const char* format, ...); + #endif // DISPLAY_H From 4047bc3936b91d0af0bae6685686b70087a02ff7 Mon Sep 17 00:00:00 2001 From: Gregory Bowne Date: Wed, 26 Nov 2025 16:02:07 -0800 Subject: [PATCH 2/5] Update display.c Added the 95% completely wired up display driver implementation file --- kernel/display.c | 77 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/kernel/display.c b/kernel/display.c index 3f8d14c..a22dc24 100644 --- a/kernel/display.c +++ b/kernel/display.c @@ -1,36 +1,79 @@ #include "display.h" -#include "io.h" // Include your I/O header for port access +#include "io.h" #include "vga.h" // Initialize the display void init_display(void) { - // Initialize VGA settings, if necessary - // This could involve setting up the VGA mode, etc. - set_display_mode(0x13); // Example: Set to 320x200 256-color mode + // Initialize the VGA driver. This typically sets up the 80x25 text mode, + // clears the screen, and sets the cursor. + vga_init(); } // Enumerate connected displays void enumerate_displays(void) { - // This is a simplified example. Actual enumeration may require - // reading from specific VGA registers or using BIOS interrupts. + // This function is often a complex operation in a real driver. + // In this simplified kernel/VGA text mode environment, we use printf + // to output a message and rely on the fact that VGA is present. - // For demonstration, we will just print a message - // In a real driver, you would check the VGA registers - // to determine connected displays. - clear_display(); - // Here you would typically read from VGA registers to find connected displays - // For example, using inb() to read from VGA ports + // Clear the display before printing a message + vga_clear(vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK)); + + // Output a simplified enumeration message + vga_printf("Display: Standard VGA Text Mode (80x25) Detected.\n"); + + // In a real driver, you would use inb() and outb() with specific VGA ports + // to read information (e.g., from the CRTC registers 0x3D4/0x3D5) + // to check for display presence or configuration. } // Set the display mode +// NOTE: Setting arbitrary VGA modes (like 0x13 for 320x200) is very complex +// and requires writing hundreds of register values, often done via BIOS in +// real mode. Since we are in protected mode and have a simple text driver, +// this function is kept simple or treated as a placeholder for full mode changes. void set_display_mode(uint8_t mode) { - // Set the VGA mode by writing to the appropriate registers - outb(VGA_PORT, mode); // Example function to write to a port + // Check if the requested mode is a known mode (e.g., VGA Text Mode 3) + // For this example, we simply acknowledge the call. + // A true mode set would involve complex register sequencing. + + // The provided vga.c is a Text Mode driver, so a graphical mode set + // like 0x13 (320x200 256-color) would break the existing vga_printf functionality. + + // A simplified text-mode-specific response: + if (mode == 0x03) { // Mode 3 is standard 80x25 text mode + vga_printf("Display mode set to 80x25 Text Mode (Mode 0x03).\n"); + vga_init(); // Re-initialize the text mode + } else { + // Simple I/O example based on the original structure (Caution: Incomplete for full mode set) + outb(VGA_PORT, mode); // Example function to write to a port + vga_printf("Attempting to set display mode to 0x%x. (Warning: May break current display)\n", mode); + } } // Clear the display void clear_display(void) { - // Clear the display by filling it with a color - // This is a placeholder for actual clearing logic - // You would typically write to video memory here + // Use the VGA driver's clear function, typically clearing to black on light grey + // or black on black. We'll use the black on light grey from vga_init for consistency. + vga_clear(vga_entry_color(VGA_COLOR_BLACK, VGA_COLOR_LIGHT_GREY)); + // Reset cursor to 0, 0 + vga_set_cursor_position(0, 0); +} + +// Helper function to write a string +void display_write_string(const char* str) { + // Use the VGA driver's string writing function + vga_write_string(str, my_strlen(str)); +} + +// Helper function to print a formatted string +void display_printf(const char* format, ...) { + // Use the VGA driver's printf function + va_list args; + va_start(args, format); + + // The vga_printf function already handles the va_list internally, + // so we can just call it directly. + vga_printf(format, args); + + va_end(args); } From f516334e0db95973e0d3a42cb8d36f7530f9f71e Mon Sep 17 00:00:00 2001 From: Gregory Bowne Date: Thu, 15 Jan 2026 17:00:37 -0800 Subject: [PATCH 3/5] Update vga.h Add vga_init(); function prototype --- kernel/vga.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/vga.h b/kernel/vga.h index e37b2cf..9dfc859 100644 --- a/kernel/vga.h +++ b/kernel/vga.h @@ -35,6 +35,7 @@ typedef enum { // Function prototypes uint8_t vga_entry_color(vga_color fg, vga_color bg); uint16_t vga_entry(unsigned char uc, uint8_t color); +void vga_init(void); void vga_put_entry_at(char c, uint8_t color, size_t x, size_t y); void vga_clear(uint8_t color); @@ -50,4 +51,4 @@ void vga_set_cursor_blink_rate(uint8_t rate); void vga_printf(const char* format, ...); -#endif \ No newline at end of file +#endif From c5f7e4e563873458caa3f944ecd9bc329bbdf147 Mon Sep 17 00:00:00 2001 From: Gregory Bowne Date: Fri, 16 Jan 2026 01:19:01 -0800 Subject: [PATCH 4/5] Update vga.c Change my_strlen to use our klibc strlen in klibc/include/string.h --- kernel/vga.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/vga.c b/kernel/vga.c index 0f21c62..4a070ac 100644 --- a/kernel/vga.c +++ b/kernel/vga.c @@ -3,7 +3,7 @@ #include #include #include -#include "string_utils.h" +#include "klibc/include/string.h" void outb(uint16_t port, uint8_t value) { __asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port)); @@ -134,7 +134,7 @@ void vga_printf(const char* format, ...) { va_end(args); // Now you can use the buffer with vga_write_string - vga_write_string(buffer, my_strlen(buffer)); // Use my_strlen instead of strlen + vga_write_string(buffer, strlen(buffer)); // Use my_strlen instead of strlen } void vga_init(void) { From 19ef0a8627687a25410b83ecfd8a0a27d3dc4aa5 Mon Sep 17 00:00:00 2001 From: vmttmv Date: Fri, 16 Jan 2026 20:49:06 +0200 Subject: [PATCH 5/5] Fix includes for string.h/string_utils.h --- kernel/display.c | 3 ++- kernel/vga.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/kernel/display.c b/kernel/display.c index a22dc24..c4acb37 100644 --- a/kernel/display.c +++ b/kernel/display.c @@ -1,3 +1,4 @@ +#include #include "display.h" #include "io.h" #include "vga.h" @@ -62,7 +63,7 @@ void clear_display(void) { // Helper function to write a string void display_write_string(const char* str) { // Use the VGA driver's string writing function - vga_write_string(str, my_strlen(str)); + vga_write_string(str, strlen(str)); } // Helper function to print a formatted string diff --git a/kernel/vga.c b/kernel/vga.c index 4a070ac..205d392 100644 --- a/kernel/vga.c +++ b/kernel/vga.c @@ -1,9 +1,9 @@ -#include "vga.h" #include #include #include #include -#include "klibc/include/string.h" +#include "string_utils.h" +#include "vga.h" void outb(uint16_t port, uint8_t value) { __asm__ volatile("outb %0, %1" : : "a"(value), "Nd"(port));