#include "devfs.h" #include "device.h" #include "common.h" #include "gfx.h" #include "framebuffer.h" #include "vmm.h" #include "process.h" static BOOL fb_open(File *file, uint32 flags); static int32 fb_read(File *file, uint32 size, uint8 *buffer); static int32 fb_write(File *file, uint32 size, uint8 *buffer); static int32 fb_ioctl(File *node, int32 request, void * argp); static void* fb_mmap(File* file, uint32 size, uint32 offset, uint32 flags); static BOOL fb_munmap(File* file, void* address, uint32 size); static uint8* gFrameBufferPhysical = 0; static uint8* gFrameBufferVirtual = 0; void initializeFrameBuffer(uint8* p_address, uint8* v_address) { gFrameBufferPhysical = p_address; gFrameBufferVirtual = v_address; Device device; memset((uint8*)&device, 0, sizeof(Device)); strcpy(device.name, "fb0"); device.deviceType = FT_CharacterDevice; device.open = fb_open; device.read = fb_read; device.write = fb_write; device.ioctl = fb_ioctl; device.mmap = fb_mmap; device.munmap = fb_munmap; registerDevice(&device); } static BOOL fb_open(File *file, uint32 flags) { return TRUE; } static int32 fb_read(File *file, uint32 size, uint8 *buffer) { if (size == 0) { return 0; } return -1; } static int32 fb_write(File *file, uint32 size, uint8 *buffer) { if (size == 0) { return 0; } int32 requestedSize = size; int32 length = Gfx_GetWidth() * Gfx_GetHeight() * 4; int32 availableSize = length - file->offset; if (availableSize <= 0) { return -1; } int32 targetSize = MIN(requestedSize, availableSize); memcpy(gFrameBufferVirtual + file->offset, buffer, targetSize); file->offset += targetSize; return targetSize; } static int32 fb_ioctl(File *node, int32 request, void * argp) { int32 result = -1; switch (request) { case FB_GET_WIDTH: result = Gfx_GetWidth(); break; case FB_GET_HEIGHT: result = Gfx_GetHeight(); break; case FB_GET_BITSPERPIXEL: result = 32; break; } return result; } static void* fb_mmap(File* file, uint32 size, uint32 offset, uint32 flags) { return mapMemory(file->thread->owner, size, (uint32)(gFrameBufferPhysical + offset), NULL); } static BOOL fb_munmap(File* file, void* address, uint32 size) { return unmapMemory(file->thread->owner, size, (uint32)address); }