summaryrefslogtreecommitdiff
path: root/sys/dev/video
diff options
context:
space:
mode:
authorIan Moffett <ian@osmora.org>2025-06-03 17:24:25 -0400
committerIan Moffett <ian@osmora.org>2025-06-03 17:24:25 -0400
commit115a58e4b48c665a00d0dcc6eec9c9d4ed9cc381 (patch)
treeddbe330faa8c6e91fe957d2bb9b16e50577a99dd /sys/dev/video
parentaf62be7cb7db9197326082e188b3f8e066050291 (diff)
kernel: video: Add /ctl/fb0/attr
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'sys/dev/video')
-rw-r--r--sys/dev/video/fbdev.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/sys/dev/video/fbdev.c b/sys/dev/video/fbdev.c
index b4b465b..8a2499d 100644
--- a/sys/dev/video/fbdev.c
+++ b/sys/dev/video/fbdev.c
@@ -28,17 +28,22 @@
*/
#include <sys/types.h>
+#include <sys/errno.h>
#include <sys/limine.h>
#include <sys/device.h>
#include <sys/driver.h>
+#include <sys/fbdev.h>
#include <dev/video/fbdev.h>
#include <fs/devfs.h>
+#include <fs/ctlfs.h>
#include <vm/vm.h>
+#include <string.h>
#define FRAMEBUFFER \
framebuffer_req.response->framebuffers[0]
static struct cdevsw fb_cdevsw;
+static const struct ctlops fb_size_ctl;
static volatile struct limine_framebuffer_request framebuffer_req = {
.id = LIMINE_FRAMEBUFFER_REQUEST,
.revision = 0
@@ -57,6 +62,31 @@ fbdev_mmap(dev_t dev, size_t size, off_t off, int flags)
return VIRT_TO_PHYS(FRAMEBUFFER->address);
}
+static int
+ctl_attr_read(struct ctlfs_dev *cdp, struct sio_txn *sio)
+{
+ struct fbattr attr;
+ size_t len = sizeof(attr);
+
+ if (sio == NULL) {
+ return -EINVAL;
+ }
+ if (sio->buf == NULL) {
+ return -EINVAL;
+ }
+
+ if (len > sio->len) {
+ len = sio->len;
+ }
+
+ attr.width = FRAMEBUFFER->width;
+ attr.height = FRAMEBUFFER->height;
+ attr.pitch = FRAMEBUFFER->pitch;
+ attr.bpp = FRAMEBUFFER->bpp;
+ memcpy(sio->buf, &attr, len);
+ return len;
+}
+
struct fbdev
fbdev_get(void)
{
@@ -73,6 +103,7 @@ fbdev_get(void)
static int
fbdev_init(void)
{
+ struct ctlfs_dev ctl;
char devname[] = "fb0";
devmajor_t major;
dev_t dev;
@@ -82,6 +113,14 @@ fbdev_init(void)
dev = dev_alloc(major);
dev_register(major, dev, &fb_cdevsw);
devfs_create_entry(devname, major, dev, 0444);
+
+
+ /* Register control files */
+ ctl.mode = 0444;
+ ctlfs_create_node(devname, &ctl);
+ ctl.devname = devname;
+ ctl.ops = &fb_size_ctl;
+ ctlfs_create_entry("attr", &ctl);
return 0;
}
@@ -91,4 +130,9 @@ static struct cdevsw fb_cdevsw = {
.mmap = fbdev_mmap
};
+static const struct ctlops fb_size_ctl = {
+ .read = ctl_attr_read,
+ .write = NULL,
+};
+
DRIVER_EXPORT(fbdev_init);