Freamebuffer是什么?怎样去来操作它?基于用户层的调用实现

framebuffer使用是基于底层的技术,可以锻炼自己的代码编写能力。

        基于用户层的调用、、、、、、

        framebuffer是一个帧缓冲区,来驱动Linux底层下的视频输出设备。概而言之,framebuffer是显示内存的一个映像,将其映像映射到用户空间之后,用户就可以对其进行读写操作,从而将数据显示在你的屏幕上,而个人PC上,是在纯终端下才是可以看到的。

实现过程:

1、open("dev/fb0",O_RDWR);    //第一步打开fb设备文件

2、ioctl
       int ioctl(int d, int request, ...);    //获得屏幕分辨率及其各个参数的信息
        向底层驱动去写发送命令
        参数1:
               d:打开的文件描述符(open的返回值)
               request:VSCREENINFO<linux/fb.h>  //文件中定义屏幕相关的宏
               第三参数:你定义的结构体的地址struct fb_var_screeninfo
                

3、mmap
               void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);
        //映射共享内存    返回显存空间首地址
        参数1:addr :内核分配地址,NULL随机分配
            2.length:申请字节长度
            3.port:port_read | port_write端口权限
            4.flags:MAP_SHARED共享
            4.文件描述符
            5.偏移量
/* 存放显存空间地址信息 */
RGB_ADDRESS_T gRgbInfo;

/* 存放屏幕信息 */
struct fb_var_screeninfo CurScreenInfo;

/********************************************
 *函数名:FrameBuffInit
 *功  能:初始化Framebuff显存
 *参  数:
 *     pDevName:FrameBuff设备名称
 *返回值:
 *     成功返回   显存空间首地址
 *     失败返回   NULL
 *注意事项:
 *	   注意当前平台具体为RGB565标准还是RGB888标准
 *******************************************/
RGB_ADDRESS_T *FrameBuffInit(const char *pDevName)
{
	int Fd = 0;
	int Ret = 0;
	void *pTmp = NULL;

	/* 打开设备 */
	Fd = open(pDevName, O_RDWR);
	if (-1 == Fd)
	{
		perror("fail to open");
		return NULL;
	}
	
	/* 获得屏幕分辨率及像素点所占字节等参数信息 */
	Ret = ioctl(Fd, FBIOGET_VSCREENINFO, &CurScreenInfo);//FBIOGET_VSCREENINFO获得屏幕分辨率信息
	if (-1 == Ret)
	{
		perror("fail to ioctl");
		return NULL;
	}

	/* 打印提示 */
	printf("=================== Current Screen Resolution =====================\n");
	printf("X: %d\n", CurScreenInfo.xres_virtual);
	printf("Y: %d\n", CurScreenInfo.yres_virtual);
	printf("OnePixelBits: %d bits, %d bytes\n", CurScreenInfo.bits_per_pixel, CurScreenInfo.bits_per_pixel / 8);
	printf("----------------------------------------------------\n");
	if (2 == CurScreenInfo.bits_per_pixel / 8)
	{
		gRgbInfo.Format = RGB565FORMAT;
		printf("NOTICE: This Board FrameBuff Standard RGB565!!!\n");
	}
	else if (4 == CurScreenInfo.bits_per_pixel / 8)
	{
		gRgbInfo.Format = RGB888FORMAT;
		printf("NOTICE: This Board FrameBuff Standard RGB888!!!\n");
	}
	
	/* 映射内核显存空间 */
    pTmp = mmap(NULL, CurScreenInfo.xres_virtual * CurScreenInfo.yres_virtual * CurScreenInfo.bits_per_pixel / 8, PROT_READ | PROT_WRITE, MAP_SHARED, Fd, 0);
	if ((void *)-1 == pTmp)
	{
		perror("fail to mmap");
		return NULL;
	}
	
	if (gRgbInfo.Format == RGB565FORMAT)
	{
		gRgbInfo.pRGB565Address = pTmp;
	}
	else if (gRgbInfo.Format == RGB888FORMAT)
	{
		gRgbInfo.pRGB888Address = pTmp;
	}

	return &gRgbInfo;
}

        

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值