From f55723c227cd6bca6d76704197dd2502300e2d1f Mon Sep 17 00:00:00 2001 From: xamidev <121681048+xamidev@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:32:11 +0200 Subject: [PATCH] minor bug fixes + bmp first try (not working) --- makefile | 2 +- src/initrd/flower.bmp | Bin 0 -> 30138 bytes src/kernel/kmain.c | 21 +++++++---- src/kernel/kmain.h | 5 +++ src/programs/bmp.c | 81 ++++++++++++++++++++++++++++++++++++++++ src/programs/programs.h | 2 + 6 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 src/initrd/flower.bmp create mode 100644 src/programs/bmp.c diff --git a/makefile b/makefile index c87007f..7d37811 100644 --- a/makefile +++ b/makefile @@ -50,12 +50,12 @@ toolchain: tar xf $(TOOLCHAIN_FILE) iso: kernel.elf initrd - mkdir -p iso/boot/grub cp kernel.elf iso/boot/kernel.elf cp grub.cfg iso/boot/grub/grub.cfg grub-mkrescue iso -o blankos.iso initrd: + mkdir -p iso/boot/grub tar -cf $(OBJ_DIR)/initrd.tar -C $(SRC_DIR)/initrd . cp $(OBJ_DIR)/initrd.tar iso/boot diff --git a/src/initrd/flower.bmp b/src/initrd/flower.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4f434c19c598c99132672ca55b1e14cd743d0c5f GIT binary patch literal 30138 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 - serial_printf(3, "Framebuffer Width: %u", fb_info->framebuffer_width); - serial_printf(3, "Framebuffer Height: %u", fb_info->framebuffer_height); - serial_printf(3, "Framebuffer Pitch: %u", fb_info->framebuffer_pitch); - serial_printf(3, "Framebuffer BPP: %u", fb_info->framebuffer_bpp); - if (fb_info) { // fb setup framebuffer = (uint32_t *)(uintptr_t) fb_info->framebuffer_addr; uint32_t width = fb_info->framebuffer_width; uint32_t height = fb_info->framebuffer_height; - uint32_t bpp = fb_info->framebuffer_bpp; + bpp = fb_info->framebuffer_bpp; + pitch = fb_info->framebuffer_pitch; //8x16 font, not padded VGA_WIDTH = width/8; VGA_HEIGHT = height/16; serial_printf(3, "VGA_WIDTH=%d, VGA_HEIGHT=%d", VGA_WIDTH, VGA_HEIGHT); scanline = width * (bpp/8); + + serial_printf(3, "Framebuffer Address: 0x%x", fb_info->framebuffer_addr); + serial_printf(3, "Framebuffer Width: %u", fb_info->framebuffer_width); + serial_printf(3, "Framebuffer Height: %u", fb_info->framebuffer_height); + serial_printf(3, "Framebuffer Pitch: %u", fb_info->framebuffer_pitch); + serial_printf(3, "Framebuffer BPP: %u", fb_info->framebuffer_bpp); } printf("[kernel] multiboot2 info at 0x%x, size=%u\n", mb_info, mb_info->total_size); @@ -116,6 +118,11 @@ void kmain(multiboot2_info *mb_info) printf("[debug] malloc test ptr1=0x%x, ptr2=0x%x\n", ptr1, ptr2); free(ptr1); free(ptr2); + + //display_bmp(framebuffer, pitch, bpp, (uint8_t*)initrd_addr); + + //putpixel(framebuffer, pitch, bpp, i, j, yellow); + timer_install(); keyboard_install(); printf("[kernel] spawning shell...\n"); diff --git a/src/kernel/kmain.h b/src/kernel/kmain.h index 0cf54ba..9475f4d 100644 --- a/src/kernel/kmain.h +++ b/src/kernel/kmain.h @@ -6,6 +6,8 @@ #ifndef KMAIN_H #define KMAIN_H +#include + typedef struct { uint32_t type; uint32_t size; @@ -34,4 +36,7 @@ uint32_t initrd_addr; uint32_t VGA_WIDTH; uint32_t VGA_HEIGHT; +uint32_t bpp; +uint32_t pitch; + #endif diff --git a/src/programs/bmp.c b/src/programs/bmp.c new file mode 100644 index 0000000..f3f89d2 --- /dev/null +++ b/src/programs/bmp.c @@ -0,0 +1,81 @@ +// Bitmap image renderer +// Author: xamidev +// Licensed under the Unlicense. See the repo below. +// https://github.com/xamidev/blankos + +#include "../kernel/kmain.h" +#include +#include "../kernel/initrd.h" +#include "../drivers/framebuffer.h" +#include "../libc/stdio.h" + +typedef struct +{ + uint16_t bfType; + uint32_t bfSize; + uint16_t bfReserved1; + uint16_t bfReserved2; + uint32_t bfOffBits; +} BMPHeader; + +typedef struct +{ + uint32_t biSize; + int32_t biWidth; + int32_t biHeight; + uint16_t biPlanes; + uint16_t biBitCount; + uint32_t biCompression; + uint32_t biSizeImage; + int32_t biXPelsPerMeter; + int32_t biYPelsPerMeter; + uint32_t biClrUsed; + uint32_t biClrImportant; +} BMPInfoHeader; + +void display_bmp(uint32_t* fb, int pitch, int bpp, uint8_t* initrd) +{ + char buffer[1024*1024]; + int file_status = tar_file_to_buffer(initrd, "./flower.bmp", buffer); + + if (file_status != 0) + { + puts("Error loading BMP\n"); + return; + } + + BMPHeader* bmp_header = (BMPHeader*)buffer; + BMPInfoHeader* bmp_info = (BMPInfoHeader*) (buffer+sizeof(BMPHeader)); + + if (bmp_header->bfType != 0x4D42) + { + puts("Not a valid BMP\n"); + return; + } + + int width = bmp_info->biWidth; + int height = bmp_info->biHeight; + int pixel_offset = bmp_header->bfOffBits; + + if (bmp_info->biBitCount != 24) + { + puts("Not a 24-bit BMP\n"); + return; + } + + uint8_t* pixel_data = (uint8_t*)(buffer + pixel_offset); + + for (int y=0; y