view Renderer/Engine/fb.h @ 507:735f76483bb2

Reorganization..
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 12 Oct 2009 09:39:35 +0900
parents Renderer/test_render/fb.h@58fd16298954
children bed529c55eda
line wrap: on
line source

#ifndef FB_H
#define FB_H

#if defined(__linux__)

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <linux/fs.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

#define DEVICE_NAME "/dev/fb0"
#define DIV_BYTE 8

/* function prototype */
void send_current_error_msg(const char *ptr);
void send_current_information(const char *ptr);

/*
    Don't put real function in a header...
 */

int get_fbdev_addr(void)
{
	int fd_framebuffer ;
	struct fb_var_screeninfo vinfo;
	struct fb_fix_screeninfo finfo;
	long int screensize ;
	//long int location;
	char *fbptr ;
	char tmp[DIV_BYTE*10];

	//int x , y ;
	int xres,yres,vbpp,line_len;
	//unsigned short tcolor ;

	/* 読み書き用にファイルを開く */
	fd_framebuffer = open( DEVICE_NAME , O_RDWR);
	if ( !fd_framebuffer ) {
	    send_current_error_msg("Framebuffer device open error !");
	    exit(1);
	}
	send_current_information("The framebuffer device was opened !");
	
	/* 固定スクリーン情報取得 */
	if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) {
	    send_current_error_msg("Fixed information not gotton !");
	    exit(2);
	}

	/* 変動スクリーン情報取得 */
	if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) {
		send_current_error_msg("Variable information not gotton !");
		exit(3);
	}
	xres = vinfo.xres ;
	yres = vinfo.yres ;
	vbpp = vinfo.bits_per_pixel ;
	line_len = finfo.line_length ;
	sprintf( tmp , "%d(pixel)x%d(line), %dbpp(bits per pixel)",xres,yres,vbpp);
	send_current_information( tmp );

	/* バイト単位でのスクリーンのサイズを計算 */
	screensize = xres * yres * vbpp / DIV_BYTE ;

	/* デバイスをメモリにマップする */
	fbptr = (char *)mmap(0,screensize,PROT_READ | PROT_WRITE,MAP_SHARED,fd_framebuffer,0);
	if ( (int)fbptr == -1 ) {
		send_current_error_msg("Don't get framebuffer device to memory !");
		exit(4);
	}
	send_current_information("The framebuffer device was mapped !");

	printf("fb: 0x%x \n", (unsigned int)fbptr);
	return (int)fbptr;
	//munmap(fbptr,screensize);
	//close(fd_framebuffer);
	//return 0;
}

void send_current_error_msg(const char *ptr)
{
    fprintf( stderr , "%s\n" , ptr );
}

void send_current_information(const char *ptr)
{
    fprintf( stdout , "%s\n" , ptr );
}
#else /* !defined(__linux__) */
int get_fbdev_addr(void) {return 0;}
#endif /* defined(__linux__) */

extern int get_fbdev_addr(void);

#endif