From 03cf875a92963b1149ca056429a7274477c4fbc1 Mon Sep 17 00:00:00 2001 From: ozkl Date: Thu, 29 Mar 2018 08:55:49 +0300 Subject: [PATCH] adding gfx files --- bootdisk-root/boot/grub/grub.cfg | 4 ++++ kernel/boot.asm | 14 +++++++++-- kernel/gfx.c | 40 ++++++++++++++++++++++++++++++++ kernel/gfx.h | 8 +++++++ kernel/main.c | 15 ++---------- kernel/multiboot.h | 3 +++ kernel/vmm.c | 6 ++--- soso.files | 2 ++ 8 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 kernel/gfx.c create mode 100644 kernel/gfx.h diff --git a/bootdisk-root/boot/grub/grub.cfg b/bootdisk-root/boot/grub/grub.cfg index 724e2f00..e8d992d6 100644 --- a/bootdisk-root/boot/grub/grub.cfg +++ b/bootdisk-root/boot/grub/grub.cfg @@ -1,8 +1,11 @@ +insmod vbe +insmod vga menuentry "SOSO DISK" { set root=(hd0,1) multiboot /boot/kernel.bin module /boot/initrd.fat + set gfxpayload=1024x768x32 boot } @@ -10,5 +13,6 @@ menuentry "SOSO CD" { set root=(cd) multiboot /boot/kernel.bin module /boot/initrd.fat + set gfxpayload=1024x768x32 boot } diff --git a/kernel/boot.asm b/kernel/boot.asm index 8f684055..b2e5a0ae 100644 --- a/kernel/boot.asm +++ b/kernel/boot.asm @@ -1,7 +1,8 @@ MBOOT_PAGE_ALIGN equ 1<<0 MBOOT_MEM_INFO equ 1<<1 +MBOOT_USE_GFX equ 1<<2 MBOOT_HEADER_MAGIC equ 0x1BADB002 -MBOOT_HEADER_FLAGS equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO +MBOOT_HEADER_FLAGS equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO ;| MBOOT_USE_GFX MBOOT_CHECKSUM equ -(MBOOT_HEADER_MAGIC + MBOOT_HEADER_FLAGS) @@ -13,7 +14,16 @@ align 4 dd MBOOT_HEADER_MAGIC dd MBOOT_HEADER_FLAGS dd MBOOT_CHECKSUM - + dd 0x00000000 ; header_addr + dd 0x00000000 ; load_addr + dd 0x00000000 ; load_end_addr + dd 0x00000000 ; bss_end_addr + dd 0x00000000 ; entry_addr + ; Graphics requests + dd 0x00000000 ; 0 = linear graphics + dd 1024 + dd 768 + dd 32 section .bss align 16 diff --git a/kernel/gfx.c b/kernel/gfx.c new file mode 100644 index 00000000..5cd6de1d --- /dev/null +++ b/kernel/gfx.c @@ -0,0 +1,40 @@ +#include "gfx.h" +#include "vmm.h" +#include "serial.h" + +static uint32 gWidth = 0; +static uint32 gHeight = 0; +static uint32 gBytePerPixel = 0; +static uint32* gPixels = NULL; + +void Gfx_Initialize(uint32* pixels, uint32 width, uint32 height, uint32 bytePerPixel) +{ + gPixels = pixels; + gWidth = width; + gHeight = height; + gBytePerPixel = bytePerPixel; + + Serial_PrintF("Gfx_Initialize\n"); + + char* p_address = (char*)gPixels; + char* v_address = (char*)gPixels; + + Serial_PrintF("Gfx_Initialize: %x\n", gPixels); + + BOOL success = addPageToPd(gKernelPageDirectory, v_address, p_address, 0); + + if (success) + { + Serial_PrintF("Gfx_Initialize: success\n"); + + for (int y = 0; y < gHeight; ++y) + { + for (int x = 0; x < gWidth; ++x) + { + gPixels[x + y * gWidth] = 255; + } + } + } + + Serial_PrintF("Gfx_Initialize: end\n"); +} diff --git a/kernel/gfx.h b/kernel/gfx.h new file mode 100644 index 00000000..3cdefce4 --- /dev/null +++ b/kernel/gfx.h @@ -0,0 +1,8 @@ +#ifndef GFX_H +#define GFX_H + +#include "common.h" + +void Gfx_Initialize(uint32* pixels, uint32 width, uint32 height, uint32 bytePerPixel); + +#endif // GFX_H diff --git a/kernel/main.c b/kernel/main.c index 2ac40196..20440813 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -22,6 +22,7 @@ #include "fatfilesystem.h" #include "vbe.h" #include "fifobuffer.h" +#include "gfx.h" extern uint32 _start; extern uint32 _end; @@ -425,19 +426,7 @@ int kmain(struct Multiboot *mboot_ptr) Debug_initialize("/dev/tty10"); - vbe_mode_info_t* vbe_info = (vbe_mode_info_t*)mboot_ptr->vbe_mode_info; - if (vbe_info) - { - Screen_PrintF("Video: x:%d, y:%d\n", vbe_info->XResolution, vbe_info->YResolution); - } - - Serial_PrintF("framebuffer_addr: %x\n", mboot_ptr->framebuffer_addr); - Serial_PrintF("framebuffer_pitch: %d\n", mboot_ptr->framebuffer_pitch); - Serial_PrintF("framebuffer_width: %d\n", mboot_ptr->framebuffer_width); - Serial_PrintF("framebuffer_height: %d\n", mboot_ptr->framebuffer_height); - Serial_PrintF("framebuffer_bpp: %d\n", mboot_ptr->framebuffer_bpp); - Serial_PrintF("framebuffer_type: %d\n", mboot_ptr->framebuffer_type); - + //Gfx_Initialize((uint32*)(uint32)mboot_ptr->framebuffer_addr, mboot_ptr->framebuffer_width, mboot_ptr->framebuffer_height, mboot_ptr->framebuffer_bpp / 32); initializeRandom(); diff --git a/kernel/multiboot.h b/kernel/multiboot.h index a324a93c..9dbda630 100644 --- a/kernel/multiboot.h +++ b/kernel/multiboot.h @@ -3,6 +3,9 @@ #include "common.h" +#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 +#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 +#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 struct Multiboot { diff --git a/kernel/vmm.c b/kernel/vmm.c index dd7d7a01..719bae95 100644 --- a/kernel/vmm.c +++ b/kernel/vmm.c @@ -224,7 +224,7 @@ BOOL addPageToPd(uint32* pd, char *v_addr, char *p_addr, int flags) { uint32 *pde = NULL; - //Screen_PrintF("DEBUG: pd_add_page(): v_addr:%x p_addr:%x flags:%x\n", v_addr, p_addr, flags); + //Screen_PrintF("DEBUG: addPageToPd(): v_addr:%x p_addr:%x flags:%x\n", v_addr, p_addr, flags); int index = (((uint32) v_addr & 0xFFC00000) >> 20) / 4; @@ -232,11 +232,11 @@ BOOL addPageToPd(uint32* pd, char *v_addr, char *p_addr, int flags) if ((*pde & PG_PRESENT) == PG_PRESENT) { //Already assigned! - Debug_PrintF("ERROR: pd_add_page(): pde:%x is already assigned!!\n", pde); + Debug_PrintF("ERROR: addPageToPd(): pde:%x is already assigned!!\n", pde); return FALSE; } - //Screen_PrintF("pd_add_page(): pde:%x\n", pde); + //Screen_PrintF("addPageToPd(): pde:%x\n", pde); *pde = ((uint32) p_addr) | (PG_PRESENT | PG_4MB | PG_WRITE | flags); //Screen_PrintF("pde:%x *pde:%x\n", pde, *pde); diff --git a/soso.files b/soso.files index 282c0568..221771f1 100644 --- a/soso.files +++ b/soso.files @@ -70,3 +70,5 @@ kernel/list.c kernel/list.h kernel/pipe.h kernel/pipe.c +kernel/gfx.h +kernel/gfx.c