12 static void cleanup(void);
17 static struct fb_fix_screeninfo finfo;
18 static struct fb_var_screeninfo vinfo;
19 static struct fb_var_screeninfo saved_vinfo;
20 static int saved_vinfo_valid;
21 static struct fbgfx_vmode curvm;
27 if((fd = open("/dev/fb0", O_RDWR)) == -1) {
28 fprintf(stderr, "failed to open framebuffer device\n");
32 ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
34 curvm.pitch = finfo.line_length;
40 static void cleanup(void)
43 munmap(vmem, vmem_size);
50 void *fbgfx_set_video_mode(int x, int y, int depth)
52 struct fb_var_screeninfo new_vinfo;
58 ioctl(fd, FBIOGET_VSCREENINFO, &new_vinfo);
61 new_vinfo.bits_per_pixel = depth;
63 if(ioctl(fd, FBIOPUT_VSCREENINFO, &new_vinfo) == -1) {
64 fprintf(stderr, "failed to set video mode %dx%d %dbpp: %s\n", x, y, depth, strerror(errno));
69 munmap(vmem, vmem_size);
74 return fbgfx_get_video_mode(0, 0, 0);
77 void *fbgfx_get_video_mode(int *xptr, int *yptr, int *depthptr)
83 ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
84 /*vmem_size = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;*/
85 vmem_size = finfo.smem_len;
87 curvm.width = vinfo.xres;
88 curvm.height = vinfo.yres;
89 curvm.bpp = vinfo.bits_per_pixel;
90 curvm.fbsize = vmem_size;
91 curvm.rshift = vinfo.red.offset;
92 curvm.gshift = vinfo.green.offset;
93 curvm.bshift = vinfo.blue.offset;
94 curvm.rmask = (0xffffffff >> (32 - vinfo.red.length)) << curvm.rshift;
95 curvm.gmask = (0xffffffff >> (32 - vinfo.green.length)) << curvm.gshift;
96 curvm.bmask = (0xffffffff >> (32 - vinfo.blue.length)) << curvm.bshift;
99 if((vmem = mmap(0, vmem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void*)-1) {
100 fprintf(stderr, "failed to map video memory\n");
105 if(xptr) *xptr = vinfo.xres;
106 if(yptr) *yptr = vinfo.yres;
107 if(depthptr) *depthptr = vinfo.bits_per_pixel;
111 void fbgfx_save_video_mode(void)
117 if(ioctl(fd, FBIOGET_VSCREENINFO, &saved_vinfo) == -1) {
120 saved_vinfo_valid = 1;
123 void fbgfx_restore_video_mode(void)
125 if(init() == -1 || !saved_vinfo_valid) {
128 ioctl(fd, FBIOPUT_VSCREENINFO, &saved_vinfo);
131 struct fbgfx_vmode *fbgfx_video_mode_info(void)