Пример #1
0
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();
}
Пример #2
0
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;
}
Пример #3
0
void fbClass::unlock()
{
	if (!locked)
		return;
	if (locked == 2)  // re-enable manualBlit
		enableManualBlit();
	locked=0;
	SetMode(xRes, yRes, bpp);
	PutCMAP();
}
Пример #4
0
void eFbLCD::unlock()
{
	if (!locked)
		return;
	if (locked == 2)  // re-enable manualBlit
		enableManualBlit();
	locked = 0;
	setMode(m_xRes, m_yRes, m_bpp);
	putCMAP();
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}