diff options
author | Anton Kling <anton@kling.gg> | 2023-10-23 15:34:26 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2023-10-23 15:34:26 +0200 |
commit | ab7b019e405ce1fa97606924223ed1542f179a69 (patch) | |
tree | 4fb58ef79a1ce5c48433a65dfab451ffc351c183 /drivers/vbe.c | |
parent | 54886a05223459e13bcb57e0c8a870caf9f70a17 (diff) |
VBE: Add a interface for getting width, height information about the display
Diffstat (limited to 'drivers/vbe.c')
-rw-r--r-- | drivers/vbe.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/vbe.c b/drivers/vbe.c index 97f5507..c67b7b4 100644 --- a/drivers/vbe.c +++ b/drivers/vbe.c @@ -14,6 +14,15 @@ uint64_t framebuffer_size; vfs_vm_object_t vbe_vm_object; #define CHECK_FLAG(flags, bit) ((flags) & (1 << (bit))) +#define min(_a, _b) (((_a) > (_b)) ? (_b) : (_a)) + +struct DISPLAY_INFO { + uint32_t width; + uint32_t height; + uint8_t bpp; +}; + +struct DISPLAY_INFO vbe_info; void display_driver_init(multiboot_info_t *mbi) { assert(CHECK_FLAG(mbi->flags, 12)); @@ -28,6 +37,10 @@ void display_driver_init(multiboot_info_t *mbi) { framebuffer_physical = mbi->framebuffer_addr; framebuffer = mmu_map_frames((void *)(uint32_t)mbi->framebuffer_addr, framebuffer_size); + + vbe_info.width = framebuffer_width; + vbe_info.height = framebuffer_height; + vbe_info.bpp = mbi->framebuffer_bpp; } vfs_vm_object_t *vbe_get_vm_object(uint64_t length, uint64_t offset, @@ -44,7 +57,17 @@ vfs_vm_object_t *vbe_get_vm_object(uint64_t length, uint64_t offset, return &vbe_vm_object; } +int display_info_read(uint8_t *buffer, uint64_t offset, uint64_t len, + vfs_fd_t *fd) { + (void)offset; + int read_len = min(sizeof(struct DISPLAY_INFO), len); + memcpy(buffer, &vbe_info, read_len); + return read_len; +} + void add_vbe_device(void) { devfs_add_file("/vbe", NULL, NULL, vbe_get_vm_object, 1, 1, FS_TYPE_BLOCK_DEVICE); + devfs_add_file("/display_info", display_info_read, NULL, NULL, 1, 0, + FS_TYPE_BLOCK_DEVICE); } |