1/** 2 * \file 3 * \brief Framebuffer glue 4 */ 5 6/* 7 * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich. 8 * All rights reserved. 9 * 10 * This file is distributed under the terms in the attached LICENSE file. 11 * If you do not find this file, copies can be found by writing to: 12 * ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group. 13 */ 14 15#include <stdio.h> 16#include <stdlib.h> 17#include <barrelfish/barrelfish.h> 18#include <barrelfish/nameservice_client.h> 19#include <if/fb_defs.h> 20 21#include "demo.h" 22 23static struct fb_binding *fb_client; 24static bool init = false; 25 26static void fb_bind_cb(void *st, errval_t err, struct fb_binding *b) 27{ 28 assert(err_is_ok(err)); 29 30 fb_client = b; 31 fb_rpc_client_init(fb_client); 32 init = true; 33} 34 35static int fb_client_connect(void) 36{ 37 iref_t iref; 38 errval_t err; 39 40 err = nameservice_blocking_lookup("framebuffer", &iref); 41 if (err_is_fail(err)) { 42 USER_PANIC_ERR(err, "nameserver lookup"); 43 } 44 45 err = fb_bind(iref, fb_bind_cb, NULL, get_default_waitset(), 46 IDC_BIND_FLAG_RPC_CAP_TRANSFER); 47 if (err_is_fail(err)) { 48 USER_PANIC_ERR(err, "fb bind"); 49 } 50 51 while(!init) { 52 messages_wait_and_handle_next(); 53 } 54 55 return 0; 56} 57 58void wait_for_vsync(void) 59{ 60 errval_t err = fb_client->rpc_tx_vtbl.vsync(fb_client); 61 assert(err_is_ok(err)); 62} 63 64int main(int argc, char *argv[]) 65{ 66 errval_t err, ret; 67 68 // Parse commandline 69 if(argc < 4) { 70 fprintf(stderr, "Usage: %s <xres> <yres> <bpp>\n", 71 argv[0]); 72 return EXIT_FAILURE; 73 } 74 75 int xres = atoi(argv[1]); 76 int yres = atoi(argv[2]); 77 int bpp = atoi(argv[3]); 78 79 fb_client_connect(); 80 81 err = fb_client->rpc_tx_vtbl.set_videomode(fb_client, xres, yres, bpp, &ret); 82 assert(err_is_ok(err)); 83 if(err_is_fail(ret)) { 84 fprintf(stderr, "Error: failed to set video mode %dx%d %dbpp\n", 85 xres, yres, bpp); 86 return EXIT_FAILURE; 87 } 88 89 // Get and map framebuffer 90 struct capref fbcap; 91 uint32_t fboffset; 92 err = fb_client->rpc_tx_vtbl.get_framebuffer(fb_client, &ret, &fbcap, &fboffset); 93 assert(err_is_ok(err)); 94 assert(err_is_ok(ret)); 95 96 struct frame_identity fbid = { .base = 0, .bytes = 0 }; 97 err = frame_identify(fbcap, &fbid); 98 assert(err == 0); 99 char *vidmem; 100 err = vspace_map_one_frame((void**)&vidmem, fbid.bytes, fbcap, 101 NULL, NULL); 102 assert(err_is_ok(err)); 103 104 vidmem += fboffset; 105 106 vesa_demo(vidmem, xres, yres, bpp); 107 108 return 0; 109} 110