int fb_gc(void) { fb_clear_mem(); fb_clear_screen(); fb_cleanup(); sfree((void *)&zmap); close(fbfd); return EXIT_SUCCESS; }
void Fatal(const char *fmt, ...) { va_list ap; va_start(ap, fmt); PrintMessage(TXT_FATAL, fmt, ap); va_end(ap); fb_cleanup(); exit(1); }
int main(int argc, char *argv[]) { page_mask = ~(sysconf(_SC_PAGE_SIZE)-1); ProgramName = argv[0]; while (argc > 1 && argv[1][0] == '-') { if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help")) Usage(); else if (!strcmp(argv[1], "-f") || !strcmp(argv[1], "--fbdev")) { if (argc <= 2) Usage(); else { Opt_Fbdev = argv[2]; argv += 2; argc -= 2; } } else if (!strcmp(argv[1], "-d") || !strcmp(argv[1], "--debug")) { Opt_Debug = 1; argv++; argc--; } else if (!strcmp(argv[1], "-l") || !strcmp(argv[1], "--list")) { Opt_List = 1; argv++; argc--; } else if(!strcmp(argv[1], "-q") || !strcmp(argv[1], "--quiet")) { Opt_Quiet = 1; argv++; argc--; } else if (!strcmp(argv[1], "-v") || !strcmp(argv[1], "--verbose")) { Opt_Verbose = 1; argv++; argc--; } else Usage(); } /* * Install signal handlers */ signal(SIGINT, SigHandler); signal(SIGQUIT, SigHandler); signal(SIGILL, SigHandler); signal(SIGFPE, SigHandler); signal(SIGSEGV, SigHandler); signal(SIGTERM, SigHandler); if (Opt_List) { if (argc < 2) { Message("Listing all tests\n"); test_list(NULL, Opt_Verbose); } else while (argc > 1) { test_list(argv[1], Opt_Verbose); argc--; argv++; } } else { fb_init(); drawops_init(); visops_init(); if (argc < 2) { Message("Running all tests\n"); test_run(NULL); } else while (argc > 1) { test_run(argv[1]); argc--; argv++; } fb_cleanup(); } exit(0); }
void fb_init(void) { unsigned long page_mask; struct vt_stat vts; fb_setvt(); if(ioctl(tty, VT_GETSTATE, &vts) == -1) { logprintf(LOG_ERR, "ioctl VT_GETSTATE: %s (not a linux console?)\n", strerror(errno)); exit(EXIT_FAILURE); } fbfd = open(DEFAULT_FB, O_RDWR); if (fbfd == -1) { logprintf(LOG_ERR, "cannot open framebuffer device"); exit(EXIT_FAILURE); } if(ioctl(fbfd, FBIOGET_VSCREENINFO, &ovinfo) == -1) { logprintf(LOG_ERR, "cannnot read variable screen information"); exit(EXIT_FAILURE); } if(ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) { logprintf(LOG_ERR, "cannot read fixed screen information"); exit(EXIT_FAILURE); } if(ovinfo.bits_per_pixel == 8 || finfo.visual == FB_VISUAL_DIRECTCOLOR) { if(ioctl(fbfd, FBIOGETCMAP, &ocmap) == -1) { logprintf(LOG_ERR, "ioctl FBIOGETCMAP"); exit(EXIT_FAILURE); } } if(ioctl(tty, KDGETMODE, &kd_mode) == -1) { logprintf(LOG_ERR, "ioctl KDGETMODE"); exit(EXIT_FAILURE); } if(ioctl(tty, VT_GETMODE, &vt_omode) == -1) { logprintf(LOG_ERR, "ioctl VT_GETMODE"); exit(EXIT_FAILURE); } tcgetattr(tty, &term); if(ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo) == -1) { logprintf(LOG_ERR,"ioctl FBIOGET_VSCREENINFO"); exit(EXIT_FAILURE); } if(ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo) == -1) { logprintf(LOG_ERR, "ioctl FBIOGET_FSCREENINFO"); exit(EXIT_FAILURE); } screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; page_mask = (unsigned long)getpagesize()-1; fb_mem_offset = (unsigned long)(finfo.smem_start) & page_mask; fbp = (char *)mmap(0, finfo.smem_len+fb_mem_offset, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); if((int)fbp == -1) { logprintf(LOG_ERR, "failed to map framebuffer device to memory"); exit(EXIT_FAILURE); } if(ioctl(tty, KDSETMODE, KD_GRAPHICS) == -1) { logprintf(LOG_ERR, "ioctl KDSETMODE"); fb_cleanup(); exit(EXIT_FAILURE); } fb_memset(fbp+fb_mem_offset, 0, finfo.line_length * vinfo.yres); fb_init_zmap(); }