⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framebuffer.c

📁 可以在linux下显示显示图片的小程序。
💻 C
字号:
/*#include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <stdio.h>#include <stdlib.h>#include "framebuffer.h"*/#define FB_DEVICE "/dev/fb0"int closeFrameBufferDevice(int fbFd){	int ret;	if(fbFd < 0)		return -1;	ret = close(fbFd);	return ret;} // end of closeFrameBufferDeviceint openFrameBufferDevice(void){	int fbFd;		fbFd = open(FB_DEVICE, O_RDWR);	if(fbFd < 0)	{		fprintf(stderr, "Line %d :open framebuffer device error !\n", __LINE__);		return -1;	}	return fbFd;}int getFrameBufferInfo(int fbFd, struct fb_var_screeninfo * vsinfo){	int ret;	ret = ioctl(fbFd, FBIOGET_VSCREENINFO, vsinfo);	if(ret < 0)	{		fprintf(stderr, "Line %d :read FBIOGET_VSCREENINFO Error !\n", __LINE__);		return -1;	}#ifdef DEBUG	fprintf(stdout, "bits = %u\n", 			vsinfo->bits_per_pixel);	fprintf(stdout, "xres = %u\n", 			vsinfo->xres);	fprintf(stdout, "yres = %u\n", 			vsinfo->yres);#endif //DEBUG	return 0;}int frameBufferOffset(struct fb_var_screeninfo *vsinfo, int x, int y){	// (x, y)offset  (x * screen_width + y) * color_bits / 8	return (y * vsinfo->xres + x) * vsinfo->bits_per_pixel / 8;} // end of frameBufferOffset#ifndef MMAPint readPixelToFrameBuffer(int fbFd, int offset, rgb *color){	int ret;	ret = lseek(fbFd, offset, SEEK_SET);	if(ret == -1)	{		fprintf(stderr, "Line %d :seek to offset : %d error !\n", __LINE__, offset);		return -1;	}	ret = read(fbFd, color, sizeof(rgb));	if(ret != sizeof(rgb))	{		fprintf(stderr, "Line %d :write one pixel to framebuffer error !\n", __LINE__);		return -1;	}	return 0;}int writePixelToFrameBuffer(int fbFd, int offset, rgb *color){	int ret;	ret = lseek(fbFd, offset, SEEK_SET);	if(ret == -1)	{		fprintf(stderr, "Line %d :seek to offset : %d error !\n", __LINE__, offset);		perror("");		return -1;	}	ret = write(fbFd, color, sizeof(rgb));	if(ret != sizeof(rgb))	{		fprintf(stderr, "Line %d :write one pixel to framebuffer error !\n", __LINE__);		return -1;	}	return 0;}#elseunsigned short *frameBufferMap(int fbFd, struct fb_var_screeninfo *vsinfo){	unsigned short * p;	p = (unsigned short *)mmap(NULL, 					vsinfo->xres * vsinfo->yres * vsinfo->bits_per_pixel / 8,					PROT_READ | PROT_WRITE,					MAP_SHARED,					fbFd,					0);	if(! p)		fprintf(stderr, "LINE: %d, mmap failed !\n", __LINE__);		return p;}int frameBufferUnmap(unsigned short * p, struct fb_var_screeninfo *vsinfo){	int ret;		if(! p)	{		fprintf(stderr, "LINE: %d, NULL, cannot munmap !\n", __LINE__);		return -1;	}	ret = munmap(p, vsinfo->xres * vsinfo->yres * vsinfo->bits_per_pixel / 8);	if(ret < 0)		fprintf(stderr, "LINE: %d, munmap failed !\n", __LINE__);	return ret;}#endif //MMAP#ifdef DEBUGint main(){	int fbFd, ret, i, j;	struct fb_var_screeninfo vsinfo;#ifdef MMAP	unsigned short *p;#endif //MMAP	rgb color;//设置RGB565颜色为红色	color._c565.r = 255 >> 3;	color._c565.g = 0;	color._c565.b = 0;		fbFd = openFrameBufferDevice();	if(fbFd < 0) exit(fbFd);		ret = getFrameBufferInfo(fbFd, &vsinfo);	if(ret < 0)	{		closeFrameBufferDevice(fbFd);		exit(ret);	}#ifdef MMAP	p = frameBufferMap(fbFd, &vsinfo);	if(! p) exit(-1);#endif //MMAP//	for(i = 0; i < vsinfo.xres; i++)	for(i = 100; i < 611; i++)	{		color._c565.r++;		color._c565.g++;		color._c565.b++;		for(j = 100; j < 400; j++)		{#ifdef MMAP			*(p + (vsinfo.xres * j) + i) = color._c16;#else			ret = writePixelToFrameBuffer(fbFd, 				frameBufferOffset(&vsinfo, i, j), &color);			if(ret < 0)			{				closeFrameBufferDevice(fbFd);				exit(ret);			}#endif //MMAP		}	}#ifdef MMAP	frameBufferUnmap(p, &vsinfo);#endif // MMAP	closeFrameBufferDevice(fbFd);		return EXIT_SUCCESS;}#endif //DEBUG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -