void fbClass::unlock() { if (!locked) return; #if not defined(__sh__) if (locked == 2) // re-enable manualBlit enableManualBlit(); #endif locked=0; #if defined(__sh__) if (ioctl( fbFd, STMFBIO_SET_VAR_SCREENINFO_EX, &infoex ) < 0) perror("STMFBIO_SET_VAR_SCREENINFO_EX\n"); if (ioctl( fbFd, STMFBIO_SET_PLANEMODE, &planemode ) < 0) perror("STMFBIO_SET_PLANEMODE\n"); if (ioctl( fbFd, STMFBIO_SET_VAR_SCREENINFO_EX, &infoex ) < 0) perror("STMFBIO_SET_VAR_SCREENINFO_EX\n"); if (ioctl( fbFd, STMFBIO_SET_OUTPUTINFO, &outinfo ) < 0) perror("STMFBIO_SET_OUTPUTINFO\n"); if (ioctl( fbFd, STMFBIO_SET_OUTPUT_CONFIG, &outcfg ) < 0) perror("STMFBIO_SET_OUTPUT_CONFIG\n"); memset(lfb, 0, stride*yRes); #endif SetMode(xRes, yRes, bpp); PutCMAP(); }
fbClass::fbClass(const char *fb) { m_manual_blit=-1; instance=this; locked=0; lfb = 0; available=0; cmap.start=0; cmap.len=256; cmap.red=red; cmap.green=green; cmap.blue=blue; cmap.transp=trans; fbFd=open(fb, O_RDWR); if (fbFd<0) { perror(fb); goto nolfb; } if (ioctl(fbFd, FBIOGET_VSCREENINFO, &screeninfo)<0) { perror("FBIOGET_VSCREENINFO"); goto nolfb; } memcpy(&oldscreen, &screeninfo, sizeof(screeninfo)); fb_fix_screeninfo fix; if (ioctl(fbFd, FBIOGET_FSCREENINFO, &fix)<0) { perror("FBIOGET_FSCREENINFO"); goto nolfb; } available=fix.smem_len; m_phys_mem = fix.smem_start; eDebug("%dk video mem", available/1024); lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fbFd, 0); if (!lfb) { perror("mmap"); goto nolfb; } showConsole(0); enableManualBlit(); return; nolfb: if (fbFd >= 0) { ::close(fbFd); fbFd = -1; } printf("framebuffer not available.\n"); return; }
void fbClass::unlock() { if (!locked) return; if (locked == 2) // re-enable manualBlit enableManualBlit(); locked=0; SetMode(xRes, yRes, bpp); PutCMAP(); }
void eFbLCD::unlock() { if (!locked) return; if (locked == 2) // re-enable manualBlit enableManualBlit(); locked = 0; setMode(m_xRes, m_yRes, m_bpp); putCMAP(); }
fbClass::fbClass(const char *fb) { m_manual_blit=-1; instance=this; locked=0; lfb = 0; available=0; cmap.start=0; cmap.len=256; cmap.red=red; cmap.green=green; cmap.blue=blue; cmap.transp=trans; fbFd=open(fb, O_RDWR); if (fbFd<0) { eDebug("[fb] %s %m", fb); goto nolfb; } #if not defined(__sh__) if (ioctl(fbFd, FBIOGET_VSCREENINFO, &screeninfo)<0) { eDebug("[fb] FBIOGET_VSCREENINFO: %m"); goto nolfb; } #endif fb_fix_screeninfo fix; if (ioctl(fbFd, FBIOGET_FSCREENINFO, &fix)<0) { eDebug("[fb] FBIOGET_FSCREENINFO: %m"); goto nolfb; } available=fix.smem_len; m_phys_mem = fix.smem_start; eDebug("[fb] %s: %dk video mem", fb, available/1024); #if defined(__sh__) // The first 1920x1080x4 bytes are reserved // After that we can take 1280x720x4 bytes for our virtual framebuffer available -= 1920*1080*4; eDebug("%dk usable video mem", available/1024); lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fbFd, 1920*1080*4); #else lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fbFd, 0); #endif if (!lfb) { eDebug("[fb] mmap: %m"); goto nolfb; } #if not defined(__sh__) showConsole(0); enableManualBlit(); #endif return; nolfb: if (fbFd >= 0) { ::close(fbFd); fbFd = -1; } eDebug("[fb] framebuffer %s not available", fb); return; }
fbClass::fbClass(const char *fb) { m_manual_blit=-1; instance=this; locked=0; lfb = 0; available=0; cmap.start=0; cmap.len=256; cmap.red=red; cmap.green=green; cmap.blue=blue; cmap.transp=trans; #ifdef CONFIG_ION int ion; #endif fbFd=open(fb, O_RDWR); if (fbFd<0) { eDebug("[fb] %s %m", fb); goto nolfb; } #if not defined(__sh__) if (ioctl(fbFd, FBIOGET_VSCREENINFO, &screeninfo)<0) { eDebug("[fb] FBIOGET_VSCREENINFO: %m"); goto nolfb; } #endif fb_fix_screeninfo fix; if (ioctl(fbFd, FBIOGET_FSCREENINFO, &fix)<0) { eDebug("[fb] FBIOGET_FSCREENINFO: %m"); goto nolfb; } available = fix.smem_len; m_phys_mem = fix.smem_start; eDebug("[fb] %s: %dk video mem", fb, available/1024); #if defined(__sh__) // The first 1920x1080x4 bytes are reserved // After that we can take 1280x720x4 bytes for our virtual framebuffer available -= 1920*1080*4; eDebug("[fb] %s: %dk video mem", fb, available/1024); lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fbFd, 1920*1080*4); #elif defined(CONFIG_ION) /* allocate accel memory here... its independent from the framebuffer */ ion = open("/dev/ion", O_RDWR | O_CLOEXEC); if (ion >= 0) { struct ion_allocation_data alloc_data; struct ion_fd_data share_data; struct ion_handle_data free_data; struct ion_phys_data phys_data; int ret; unsigned char *lion; eDebug("[fb] Using ION allocator"); memset(&alloc_data, 0, sizeof(alloc_data)); alloc_data.len = ACCEL_MEM_SIZE; alloc_data.align = 4096; // 4k aligned alloc_data.heap_id_mask = ION_HEAP_ID_MASK; ret = ioctl(ion, ION_IOC_ALLOC, &alloc_data); if (ret < 0) { eDebug("[fb] ION_IOC_ALLOC failed"); eFatal("[fb] failed to allocate accel memory!!!"); return; } memset(&phys_data, 0, sizeof(phys_data)); phys_data.handle = alloc_data.handle; ret = ioctl(ion, ION_IOC_PHYS, &phys_data); if (ret < 0) { eDebug("[fb] ION_IOC_PHYS failed"); goto err_ioc_free; } memset(&share_data, 0, sizeof(share_data)); share_data.handle = alloc_data.handle; ret = ioctl(ion, ION_IOC_SHARE, &share_data); if (ret < 0) { eDebug("[fb] ION_IOC_SHARE failed"); goto err_ioc_free; } memset(&free_data, 0, sizeof(free_data)); free_data.handle = alloc_data.handle; if (ioctl(ion, ION_IOC_FREE, &free_data) < 0) eDebug("[fb] ION_IOC_FREE failed"); m_accel_fd = share_data.fd; lion=(unsigned char*)mmap(0, ACCEL_MEM_SIZE, PROT_WRITE|PROT_READ, MAP_SHARED, share_data.fd, 0); if (lion) { eDebug("[fb] %dkB available for acceleration surfaces (via ION).", ACCEL_MEM_SIZE / 1024); gAccel::getInstance()->setAccelMemorySpace(lion, phys_data.addr, ACCEL_MEM_SIZE); } else { close(m_accel_fd); eDebug("[fb] mmap lion failed"); err_ioc_free: eFatal("[fb] failed to allocate accel memory via ION!!!"); m_accel_fd = -1; memset(&free_data, 0, sizeof(free_data)); free_data.handle = alloc_data.handle; if (ioctl(ion, ION_IOC_FREE, &free_data) < 0) eDebug("[fb] ION_IOC_FREE %m"); } close(ion); } else { eFatal("[fb] failed to open ION device node! no allocate accel memory available !!"); m_accel_fd = -1; } #else eDebug("[fb] %dk video mem", available/1024); lfb=(unsigned char*)mmap(0, available, PROT_WRITE|PROT_READ, MAP_SHARED, fbFd, 0); #endif #ifndef CONFIG_ION if (!lfb) { eDebug("[fb] mmap %m"); goto nolfb; } #endif #if not defined(__sh__) showConsole(0); enableManualBlit(); #endif return; nolfb: if (fbFd >= 0) { ::close(fbFd); fbFd = -1; } eDebug("[fb] framebuffer not available"); return; }
eFbLCD::eFbLCD(const char *fb) { m_manual_blit = -1; instance = this; locked = 0; _buffer = 0; m_available = 0; m_cmap.start = 0; m_cmap.len = 256; m_cmap.red = m_red; m_cmap.green = m_green; m_cmap.blue = m_blue; m_cmap.transp = m_trans; m_alpha = 255; m_gamma = 128; m_brightness = 128; lcdfd = open(fb, O_RDWR); if (lcdfd < 0) { eDebug("[eFbLCD] %s: %m", fb); goto nolfb; } if (ioctl(lcdfd, FBIOGET_VSCREENINFO, &m_screeninfo) < 0) { eDebug("[eFbLCD] FBIOGET_VSCREENINFO: %m"); goto nolfb; } fb_fix_screeninfo fix; if (ioctl(lcdfd, FBIOGET_FSCREENINFO, &fix) < 0) { eDebug("[eFbLCD] FBIOGET_FSCREENINFO: %m"); goto nolfb; } m_available = fix.smem_len; m_phys_mem = fix.smem_start; eDebug("[eFbLCD] %s %dk video mem", fb, m_available / 1024); _buffer=(unsigned char*)mmap(0, m_available, PROT_WRITE|PROT_READ, MAP_SHARED, lcdfd, 0); if (!_buffer) { eDebug("[eFbLCD] mmap: %m"); goto nolfb; } lcd_type = 4; calcRamp(); getMode(); setMode(m_xRes, m_yRes, m_bpp); enableManualBlit(); return; nolfb: if (lcdfd >= 0) { ::close(lcdfd); lcdfd = -1; } eDebug("[eFbLCD] framebuffer %s not available", fb); return; }