feat: gfxm: a layer provides user space access to low level interfacing of graphic...
[lunaix-os.git] / lunaix-os / hal / gfxa / vga / vga_gfxm_ops.c
diff --git a/lunaix-os/hal/gfxa/vga/vga_gfxm_ops.c b/lunaix-os/hal/gfxa/vga/vga_gfxm_ops.c
new file mode 100644 (file)
index 0000000..0813da3
--- /dev/null
@@ -0,0 +1,71 @@
+#include "vga.h"
+#include <hal/gfxm.h>
+#include <klibc/string.h>
+
+static int
+__vga_gfxa_update_profile(struct gfxa* gfxa)
+{
+    struct vga* v = (struct vga*)gfxa->hw_obj;
+    struct disp_profile* profile = &gfxa->disp_info;
+
+    v->crt.depth = profile->mon.depth;
+    v->options = VGA_MODE_GFX;
+
+    vga_config_rect(
+      v, profile->mon.w_px, profile->mon.h_px, profile->mon.freq, 0);
+
+    int err = vga_reload_config(v);
+
+    if (!err && profile->clut.val) {
+        vga_update_palette(v, profile->clut.val, profile->clut.len);
+    }
+
+    return err;
+}
+
+static int
+__vga_gfxa_rreads(struct gfxa* gfxa, u32_t* map, void* rxbuf, size_t map_sz)
+{
+    return 0;
+}
+
+static int
+__vga_gfxa_rwrites(struct gfxa* gfxa, u32_t* map, void* txbuf, size_t map_sz)
+{
+    return 0;
+}
+
+static int
+__vga_gfxa_vmcpy(struct gfxa* gfxa, void* buf, off_t off, size_t sz)
+{
+    struct vga* v = (struct vga*)gfxa->hw_obj;
+
+    if (off + sz > v->fb_sz) {
+        return 0;
+    }
+
+    ptr_t vram_start = v->fb + off;
+    memcpy((void*)vram_start, buf, sz);
+
+    return sz;
+}
+
+static int
+__vga_gfxa_lfbcpy(struct gfxa* gfxa, void* buf, off_t off, size_t sz)
+{
+    return __vga_gfxa_vmcpy(gfxa, buf, off, sz);
+}
+
+static int
+__vga_gfxa_hwioctl(struct gfxa* gfxa, int req, va_list args)
+{
+    // TODO
+    return 0;
+}
+
+struct gfxa_ops vga_gfxa_ops = { .update_profile = __vga_gfxa_update_profile,
+                                 .rreads = __vga_gfxa_rreads,
+                                 .rwrites = __vga_gfxa_rwrites,
+                                 .vmcpy = __vga_gfxa_vmcpy,
+                                 .lfbcpy = __vga_gfxa_lfbcpy,
+                                 .hwioctl = __vga_gfxa_hwioctl };
\ No newline at end of file