summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/vbe.c23
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);
}