#include #include #include #include #include #include #include #include #include "log.h" #include "fbinit.h" #include "scode.h" /* references to splash screen data in splash.o/splash.bin */ extern uint8_t _binary_splash_bin_start[]; extern uint8_t _binary_splash_bin_end; extern uint8_t _binary_splash_bin_size; static int fb_fd = -1; static FBINFO local_info; PCFBINFO Fb_Info = &local_info; UINT16 *Fb_Ptr = NULL; inline static UINT16 makemask(unsigned offset, unsigned length) { return (UINT16)(((1 << length) - 1) << offset); } HRESULT Fb_setup(void) { HRESULT hr = S_OK; struct fb_fix_screeninfo fixed; struct fb_var_screeninfo var; fb_fd = open("/dev/fb1", O_RDWR); if (fb_fd == -1) { hr = ERRNO_AS_SCODE; Log(LFATAL, "Unable to open framebuffer (%08X)", hr); return hr; } if (ioctl(fb_fd, FBIOGET_FSCREENINFO, &fixed)) { hr = ERRNO_AS_SCODE; Log(LFATAL, "Could not get fixed screen info (%08X)", hr); return hr; } local_info.linebytes = fixed.line_length; local_info.screenbytes = fixed.smem_len; if (ioctl(fb_fd, FBIOGET_VSCREENINFO, &var)) { hr = ERRNO_AS_SCODE; Log(LFATAL, "Could not get variable screen info (%08X)", hr); return hr; } local_info.width = var.xres; local_info.height = var.yres; local_info.virtual_width = var.xres_virtual; local_info.virtual_height = var.yres_virtual; local_info.bpp = var.bits_per_pixel; local_info.red_offset = var.red.offset; local_info.red_length = var.red.length; local_info.red_mask = makemask(var.red.offset, var.red.length); local_info.green_offset = var.green.offset; local_info.green_length = var.green.length; local_info.green_mask = makemask(var.green.offset, var.green.length); local_info.blue_offset = var.blue.offset; local_info.blue_length = var.blue.length; local_info.blue_mask = makemask(var.blue.offset, var.blue.length); Fb_Ptr = (UINT16 *)mmap(0, fixed.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fb_fd, 0); if ((int)Fb_Ptr == -1) { hr = ERRNO_AS_SCODE; Log(LFATAL, "Unable to memmap framebuffer (%08X)", hr); Fb_Ptr = NULL; close(fb_fd); fb_fd = -1; return hr; } /* display the splash screen */ memcpy(Fb_Ptr, _binary_splash_bin_start, (size_t)(&_binary_splash_bin_size)); /* additional setup here */ return hr; } void Fb_cleanup(void) { /* additional cleanup here */ memset(Fb_Ptr, 0, local_info.screenbytes); munmap((void *)Fb_Ptr, local_info.screenbytes); Fb_Ptr = NULL; close(fb_fd); fb_fd = -1; } void Fb_clear(void) { memset(Fb_Ptr, 0, local_info.screenbytes); }