aboutsummaryrefslogtreecommitdiff
path: root/src/sysbin/giosrv/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sysbin/giosrv/main.c')
-rw-r--r--src/sysbin/giosrv/main.c112
1 files changed, 100 insertions, 12 deletions
diff --git a/src/sysbin/giosrv/main.c b/src/sysbin/giosrv/main.c
index 7827670..9dfd697 100644
--- a/src/sysbin/giosrv/main.c
+++ b/src/sysbin/giosrv/main.c
@@ -6,29 +6,117 @@
#include <debug.h>
#include <user_region.h>
-#include <proto/fb.h>
+#include <gip.h>
+
+typedef struct {
+ framebuffer_info_t mode;
+ fd_t fd;
+ uint32_t features;
+} giosrv_t;
+
+void reset(gip_handler_t *s, gip_msg_header *p);
+void enable_features(gip_handler_t *s, gip_msg_header *p);
+void disable_features(gip_handler_t *s, gip_msg_header *p);
+void query_mode(gip_handler_t *s, gip_msg_header *p);
+void set_mode(gip_handler_t *s, gip_msg_header *p);
+void unknown_msg(gip_handler_t *s, gip_msg_header *p);
+void fd_error(gip_handler_t *s);
+
+gip_handler_callbacks_t giosrv_cb = {
+ .reset = reset,
+ .initiate = 0,
+ .ok = 0,
+ .failure = 0,
+ .enable_features = enable_features,
+ .disable_features = disable_features,
+ .query_mode = query_mode,
+ .set_mode = set_mode,
+ .buffer_info = 0,
+ .mode_info = 0,
+ .buffer_damage = 0,
+ .unknown_msg = unknown_msg,
+ .fd_error = fd_error,
+};
int main(int argc, char **argv) {
dbg_print("[giosrv] Starting up.\n");
- fd_t fbdev = open("io:/display/vesa", FM_IOCTL | FM_READ | FM_WRITE | FM_MMAP);
- if (fbdev == 0) PANIC("Could not open fbdev");
+ giosrv_t srv;
+
+ srv.fd = open("io:/display/vesa", FM_IOCTL | FM_READ | FM_WRITE | FM_MMAP);
+ if (srv.fd == 0) PANIC("Could not open fbdev");
- framebuffer_info_t i;
- int r = ioctl(fbdev, IOCTL_FB_GET_INFO, &i);
- dbg_printf("[giosrv] ioctl -> %d\n", r);
+
+ int r = ioctl(srv.fd, IOCTL_FB_GET_INFO, &srv.mode);
ASSERT(r == 1);
- dbg_printf("[giosrv] Running on FB %dx%d\n", i.width, i.height);
+ dbg_printf("[giosrv] Running on FB %dx%d\n", srv.mode.width, srv.mode.height);
- void* fb_map = region_alloc(i.height * i.pitch, "Framebuffer");
- ASSERT(fb_map != 0);
+ gip_handler_t *h = new_gip_handler(&giosrv_cb, &srv);
+ ASSERT(h != 0);
- ASSERT(mmap_file(fbdev, 0, fb_map, i.height * i.pitch, MM_READ | MM_WRITE));
- memset(fb_map, 0, i.height * i.pitch);
+ h->mainloop_item.fd = 1;
+ mainloop_add_fd(&h->mainloop_item);
+ mainloop_run();
- while(true); // nothing to do
+ dbg_printf("[giosrv] Main loop exited, terminating.\n");
return 0;
}
+void send_buffer_info(gip_handler_t *h, giosrv_t *s) {
+ gip_msg_header msg = {
+ .code = GIPN_BUFFER_INFO,
+ .arg = 0,
+ };
+ gip_buffer_info_msg msg_data;
+
+ msg_data.geom = s->mode;
+ if (!gen_token(s->fd, &msg_data.tok)) {
+ dbg_printf("Could not generate token for buffer_info_msg.\n");
+ } else {
+ dbg_printf("Token: %x %x\n", ((uint32_t*)&msg_data.tok)[0], ((uint32_t*)&msg_data.tok)[1]);
+ gip_notify(h, &msg, &msg_data);
+ }
+}
+
+void reset(gip_handler_t *h, gip_msg_header *p) {
+ giosrv_t *s = (giosrv_t*)h->data;
+
+ s->features = 0;
+
+ // ---- Send initiate message
+ gip_msg_header msg = {
+ .code = GIPR_INITIATE,
+ .arg = GIPF_MODESET
+ };
+ gip_reply(h, p, &msg, 0);
+
+ // ---- Send buffer information
+ send_buffer_info(h, s);
+}
+
+void enable_features(gip_handler_t *h, gip_msg_header *p) {
+ gip_reply_fail(h, p);
+}
+
+void disable_features(gip_handler_t *h, gip_msg_header *p) {
+ gip_reply_fail(h, p);
+}
+
+void query_mode(gip_handler_t *h, gip_msg_header *p) {
+ // TODO
+}
+
+void set_mode(gip_handler_t *h, gip_msg_header *p) {
+ // TODO
+}
+
+void unknown_msg(gip_handler_t *h, gip_msg_header *p) {
+ // TODO
+}
+
+void fd_error(gip_handler_t *h) {
+ // TODO
+}
+
/* vim: set ts=4 sw=4 tw=0 noet :*/