Framebuffer 应用编程基础

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>

static int fd_fb;
static struct fb_var_screeninfo var;	/* Current var */
static int screen_size;
static unsigned char *fb_base;
static unsigned int line_width;
static unsigned int pixel_width;
static void lcd_put_pixel(int x, int y, unsigned int color);


int main(int argc, char **argv)
{
	int i;
	
	fd_fb = open("/dev/fb0", O_RDWR);
	if (fd_fb < 0)
	{
		printf("can't open /dev/fb0\n");
		return -1;
	}
	if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))    //使用ioctl获取设备fb0的FBIOGET_VSCREENINFO类型的信息 存到var
	{
		printf("can't get var\n");
		return -1;
	}

    /*从设备的信息结构体中 var  获取信息 */ 
	line_width  = var.xres * var.bits_per_pixel / 8;   //每行像素所占的字节数
	pixel_width = var.bits_per_pixel / 8;    // 每个像素所占字节数
	screen_size = var.xres * var.yres * var.bits_per_pixel / 8;  // 屏幕总像素所占的字节数
	fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);  //LCD buffer的基地址,往地址里面写东西 就可以改变颜色


	if (fb_base == (unsigned char *)-1)
	{
		printf("can't mmap\n");
		return -1;
	}

	/* 清屏: 全部设为白色 */
	memset(fb_base, 0xff, screen_size);  //  为地址fb_base开始的screen_size个字节赋值0xff,注意:是逐个字节赋值   所以可以一键白屏

	/* 随便设置出100个为红色 */
	for (i = 0; i < 100; i++)
		lcd_put_pixel(var.xres/2+i, var.yres/2, 0xFF0000);     //逐个像素点设置颜色
	
	munmap(fb_base , screen_size);
	close(fd_fb);
	
	return 0;	
}
/**********************************************************************
 * 函数名称: lcd_put_pixel
 * 功能描述: 在LCD指定位置上输出指定颜色(描点)
 * 输入参数: x坐标,y坐标,颜色
 * 输出参数: 无
 * 返 回 值: 会
 * 修改日期        版本号     修改人	      修改内容
 * -----------------------------------------------
 * 2020/05/12	     V1.0	  zh(angenao)	      创建
 ***********************************************************************/ 
void lcd_put_pixel(int x, int y, unsigned int color)
{

	/*(x,y)像素起始地址=fb_base+(xres*bpp/8)*y + x*bpp/8*/
	/*
	line_width  = var.xres * var.bits_per_pixel / 8;
	pixel_width = var.bits_per_pixel / 8;
	*/
	unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;   // pen_8 就是像素起始地址,往地址里面写东西 就可以改变颜色
	unsigned short *pen_16;	
	unsigned int *pen_32;	

	unsigned int red, green, blue;	

	pen_16 = (unsigned short *)pen_8;
	pen_32 = (unsigned int *)pen_8;

	switch (var.bits_per_pixel)   //针对不同的bpp  要对color做不同的处理
	{
		case 8:
		{
			*pen_8 = color;       // 直接写入就可以在LCD上显示
			break;
		}
		case 16:
		{
			/* 565 */
			red   = (color >> 16) & 0xff;
			green = (color >> 8) & 0xff;
			blue  = (color >> 0) & 0xff;
			color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
			*pen_16 = color;
			break;
		}
		case 32:
		{
			*pen_32 = color;
			break;
		}
		default:
		{
			printf("can't surport %dbpp\n", var.bits_per_pixel);
			break;
		}
	}
}



Linux 内存映射函数 mmap()函数详解_mmap函数map_private-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值