diff options
Diffstat (limited to 'src/sysbin/giosrv/main.c')
-rw-r--r-- | src/sysbin/giosrv/main.c | 112 |
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 :*/ |