基于Linux的帧缓存编程实现点线面和RGB显示

本文介绍了Linux帧缓冲(framebuffer)在显示技术中的应用,作为上层应用和底层设备之间的中间层。内容包括fb_fix_screeninfo和fb_var_screeninfo数据结构,以及framebuffer设备驱动的关键函数如fb_mmap、fb_set_var和fb_ioctl。通过mmap将显存映射到应用程序空间,实现屏幕内容的显示和控制。
摘要由CSDN通过智能技术生成

帧缓冲(framebuffer)设备应用于linux显示技术方面。

因为linux的显示平台已经全部基于framebuffer,所以目前在linux环境下开发图形化界面、游戏、影视软件等可视化应用时都必须用到帧缓冲技术.

帧缓冲在linux体系中居于上层应用和底层显示设备之间,它的设计意图是对上层应用屏蔽掉低层不同硬件的操作细节,需要在上层开发和底层设备之间加入一个中间层以节省开发人员的时间和精力。

帧缓冲类似一个蓄水池,存放来自用户进程的数据,然后把这些数据再输入显示设备中。

对于用户而言,帧缓冲就是内存中的一块区域,可以读、写、映射。只要在初始化阶段把显示设备映射到用户进程空间,可以理解为将屏幕中的每一点和帧缓冲的每一点一一对应起来。这样接下来就可以对这块内存区域填充任何已经定义的像素以及颜色,而屏幕也就可以根据刚才写入的像素及颜色呈现出五彩缤纷的画面。

=============================================================

在用户空间内使用的数据结构主要有fb_fix_screeninfofb_var_screeninfo

在内核空间使用的主要数据结构为fb_info

fb_fix_screeninfo结构体:

该数据结构定义了一些系统运行期间不能改变的信息,例如设备名,屏幕的像素数量,缓冲区的首址和长度等。这类信息一般通过ioctl函数获得。

下面列出了fb_fix_screeninfo 的主要内容:

struct fb_fix_screeninfo {
    char id[16];		/* 设备名*/
   unsigned long smem_start;   	/* frame buffer 缓冲区起始地址(物理地址)*/
                    
   __u32 smem_len;		/* 缓冲区长度*/
     __u32 type;		/* 设备类型,例如TFT或STN*/
    ……
     __u32 visual;		/* 色彩类型,真彩色、假彩色或单色*/ 
     ……
  __u32 line_length;		/* 屏幕上每行的字节数   */
  unsigned long mmio_start;   	/* IO映射区起始地址(物理地址)   */
    __u32 mmio_len;        	/* IO 映射区长度  */
    __u32 accel;            	/* 指出使用的加速卡是哪些特定的芯片 */
     __u16 reserved[3];      	/* 系统保留*/
 };

fb_var_screeninfo结构体:

相对应的,fb_var_screeninfo定义了一些在系统运行期间可以改变的信息。例如像素深度、灰度级、颜色格式、时序,屏幕边缘空白区等。

下表中列出了fb_var_screeninfo的主要内容:

struct fb_var_screeninfo {
   __u32 xres;         	/* visible resolution   可见分辨率 */
   __u32 yres;
   __u32 xres_virtual;     	/* virtual resolution   虚拟分辨率 */
   __u32 yres_virtual;
   __u32 xoffset;          	/* 从虚拟分辨率到可见分辨率的偏移量*/
   __u32 yoffset;          
   __u32 bits_per_pixel;     /* 像素深度         */
   __u32 grayscale;        	/* 灰度级 */
   struct fb_bitfield red;     
   struct fb_bitfield green;   
   struct fb_bitfield blue;
   struct fb_bitfield transp;  	/* 透明度          */  
   __u32 nonstd;           	/* 非标准像素格式 */
 
     ……
   __u32 pixclock;         	/* 像素时钟,单位是皮秒*/
   __u32 left_margin;         /* 左侧边缘区*/
   __u32 right_margin;        /*右侧边缘区 */
   __u32 upper_margin;     	/*顶部边缘区 */
   __u32 lower_margin;
   __u32 hsync_len;        	/*水平扫描边缘区   */
   __u32 vsync_len;        	/*垂直扫描边缘区   */
     …….
 };


内核空间fb_info结构体

struct fb_info {
   int node;                 		/* 设备节点 */
   int flags;               		/*标志*/
   struct fb_var_screeninfo var;   	/* 当前可变参数 */
   struct fb_fix_screeninfo fix;   	/* 当前固定参数 */
   struct fb_monspecs monspecs;    	/* 当前监视器特征 */
   struct work_struct queue;   		/* 帧缓冲事件队列 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值