Linux FrameBuf介绍

1. 概述

fbdev用于为显示图形硬件提供一层软件抽象.它代理了显示图形硬件的帧内存,并且提供了一些良好定义的接口让应用软件去访问图形硬件,而不用去关心底层图形硬件的具体控制细节。

访问fbdev通常通过一些特定的设备节点,例如位于/dev目录下的 /dev/fb*.

一个简单的framebuffer 使用场景:

3个application 通过fb0这个fb device 节点对framebuffer进行修改,然后由图形硬件将修改之后的内容输出到显示端

在这里插入图片描述

2. User’s View of /dev/fb*

fbdev 目前是一个字符设备,首设备号29,尾设备号标志frame buffer的编号

方便起见, 设备节点会如下生成(数字表示问设备号):

0 = /dev/fb0 First frame buffer

1 = /dev/fb1 Second frame buffer

31 = /dev/fb31 32nd frame buffer
fbdev同时也是一个普通的内存设备。这就意味着,你可以读写它的内容。比如:

1.你可以通过如下操作截屏:
cp /dev/fb0 myfile
2.往屏幕的左上角画一个白色的像素点:
echo -en '\xFF\xFF\xFF\x00' > /dev/fb0
3.mmap /dev/fb0 用于更精细的绘图(这部分会在其它章节详述):
int fb = open("/dev/fb0", O_RDWR);
assert(fb > 0);
struct fb_var_screeninfo info;
assert(0 == ioctl(fb, FBIOGET_VSCREENINFO, &info));
size_t len = 4 * info.xres * info.yres;
uint32_t *buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
assert(buf != MAP_FAILED);

通过给buf[y * info.xres + x] 赋值就可以轻松的修改 (x,y)这个点的像素。

3. Closer look to /dev/fb*

简介提到fbdev代理了图形硬件的显示帧内存,并且提供了一些接口控制这部分内存,对比上文的framebuffer简单应用场景。

下图是framebuffer的memory layout:

在这里插入图片描述

  • 不同的fbdev的实现,让fbdev代理的图形硬件的显示帧内存(framebuffer)会具备不同的初始属性.有些是可配置的属性(通过ioctl(fb,FBIOGET_VSCREENINFO, &info)获取struct fb_var_screeninfo defined in “linux/fb.h”),有些则是固定属性(通过ioctl(fb, FBIOGET_FSCREENINFO,&info)获取struct fb_fix_screeninfo defined in “linux/fb.h”).
以上图为例我们需要关注几个主要属性:
  • 颜色格式(colorformat)

framebuffer的颜色格式可以通过ioctl(fb, FBIOPUT_VSCREENINFO, &info) 设定,通常我们都是在初始化fbdev的时候就决定好. 对fbdev的用户来说,确定了颜色格式用户就知道如何修改对应pixel的内容。

  • bitsperpixel

一个pixel的宽度,与颜色格式协调的变量,颜色格式确定了pixel的宽度也确定了。

  • xres_virtual/yres_virtual

可通过ioctl FBIOGET_VSCREENINFO/FBIOPUT_VSCREENINFO获取。通常fbdev 代理的framebuffer总大小为:xres_virtualyres_virtualbitsperpixel。

  • xres/yres,xoffset/yoffset

(xoffset,yoffset) (xoffset+xres,yoffset+yres) 在framebuffer中标记了一个矩形框,即当前显示的buffer区域.也就是说display buffer 用于显示的有效区域可以是从framebuffer开始地址开始。

为何 display buffer 在 framebuffer内
  • 支持不同分辨率的内容.

有时候framebuffer的内存大小在FBDEV初始化的时候已经申请好了. 我们可能需要申请一个能够容纳最大分辨的framebuffer,比如1080p,此时我们使用的display buffer 可能是720p.

  • double buffer.

使用单buffer无法避免画面撕裂的问题,因为你可能总是修改未显示的内容,造成已经被graphic hardware显示的部分和被修改将要显示的部分时空错位。使用双buffer,显示一张display buffer#0,修改另一张显示一张display buffer#1,修改完成之后交换.显示一张display buffer#1,修改另一张显示一张display buffer#0.

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCI Express(简称 PCIe)是一种计算机总线标准,用于连接计算机的主板和外部设备,特别是用于高带宽和低延迟的数据传输。Linux 是一个自由、开放源代码的操作系统,具有广泛的应用领域和强大的可定制性。在 Linux 系统中,PCIe 被广泛用于连接各种外设,如网卡、显卡、声卡等。 Linux 提供了专门的驱动程序和内核模块,来支持 PCIe 总线。这些驱动程序可将 PCIe 外设识别并与其进行通信。Linux 内核会通过检测 PCIe总线的拓扑结构来自动加载适当的驱动程序。同时,Linux 提供了一种称为“设备树”的机制,用于描述 PCIe 设备的硬件属性,从而更好地管理和配置硬件资源。 对于开发者来说,Linux 提供了一套完善的工具和接口,用于开发和调试 PCIe 设备驱动程序。这些工具包括 lspci 命令(用于列出和管理 PCIe 设备)、PCIe 总线处理函数(用于访问和控制 PCIe 设备的寄存器)以及 PCIe 驱动开发框架(用于编写自定义驱动程序)等。此外,开发者还可以使用 PCIe 性能分析工具,来监测和优化 PCIe 数据传输性能。 总而言之,Linux 提供了强大的 PCIe 支持,可以方便地连接和管理各种外设。同时,开发者也可以利用 Linux 提供的工具和接口,进行 PCIe 驱动程序的开发和调试。这使得 Linux 成为一个理想的操作系统选择,以满足高性能计算和数据传输的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值