diff options
author | Ian Moffett <ian@osmora.org> | 2024-04-24 19:52:56 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2024-04-24 19:52:56 -0400 |
commit | d06eca1772190435e5dcb370db734653d3989bc8 (patch) | |
tree | db09ef7b5b28f033a0313722516c0eae105b3bf3 | |
parent | eb5d1c92c4e79c04a9d2e0027728e1378ba61f49 (diff) |
kernel: fbdev: Add framebuffer ioctl
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | sys/dev/video/fbdev.c | 24 | ||||
-rw-r--r-- | sys/include/dev/video/fbdev.h | 9 |
2 files changed, 33 insertions, 0 deletions
diff --git a/sys/dev/video/fbdev.c b/sys/dev/video/fbdev.c index 1f20ab6..af020a1 100644 --- a/sys/dev/video/fbdev.c +++ b/sys/dev/video/fbdev.c @@ -31,6 +31,8 @@ #include <sys/limine.h> #include <sys/device.h> #include <sys/driver.h> +#include <sys/system.h> +#include <sys/errno.h> #include <dev/video/fbdev.h> #include <vm/vm.h> #include <fs/devfs.h> @@ -45,6 +47,27 @@ static volatile struct limine_framebuffer_request framebuffer_req = { static struct device *dev; +static int +fbdev_ioctl(struct device *dev, uint32_t cmd, uintptr_t arg) +{ + struct fbdev_info info = { + .width = FRAMEBUFFER->width, + .height = FRAMEBUFFER->height, + .pitch = FRAMEBUFFER->pitch, + .bits_per_pixel = FRAMEBUFFER->bpp + }; + + switch (cmd) { + case FBIOCTL_INFO: + copyout(&info, arg, sizeof(info)); + break; + default: + return -EINVAL; + } + + return 0; +} + static paddr_t fbdev_mmap(struct device *dev, off_t off, vm_prot_t prot) { @@ -80,6 +103,7 @@ fbdev_init(void) dev->read = NULL; dev->write = NULL; dev->mmap = fbdev_mmap; + dev->ioctl = fbdev_ioctl; device_create(dev, device_alloc_major(), 1); devfs_add_dev("fb", dev); diff --git a/sys/include/dev/video/fbdev.h b/sys/include/dev/video/fbdev.h index 123182f..e9c9282 100644 --- a/sys/include/dev/video/fbdev.h +++ b/sys/include/dev/video/fbdev.h @@ -32,6 +32,15 @@ #include <sys/types.h> +#define FBIOCTL_INFO 0x00000000 + +struct fbdev_info { + uint32_t width; + uint32_t height; + uint32_t pitch; + uint32_t bits_per_pixel; +}; + struct fbdev { void *mem; uint32_t width; |