Framebuffer 机制【转】
本文转载自:http://blog.csdn.net/paul_liao/article/details/7706477
Framebuffer
Framebuffer是Linux系统为显示设备提供的一个接口,它将显示缓存区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。Framebuffer设备是标准的字符设备,主设备号为29,对应于/dev/fbn设备文件。
双缓冲机制
Android系统中使用的此机制,带来的好处是让画面的切换更流畅。比如可视分辨率为240x320,虚拟分辨率为240x640,当第一帧0~319在显示时,第二帧320~639则在后台计算;当第一帧显示完时,直接切换到第二帧显示。接着系统又可以计算下一帧,这样大大的提高了效率。
驱动文件
Fbmem.c文件实现了帧缓冲驱动公共的调用(核心)
modedb.c所有的VESA标准显示模式信息
Fbmon.c解析显示器的EDID并计算时需参数
Fbcmap.c实现了和调色板相关的调用
Xxxfb.c具体控制器驱动的实现
skeletonfb.c framebuffer的骨架程序
Framebuffer设备驱动框架
帧缓冲设备提供给用户控件的file_operations结构由fbmem.c中的file_operations提供,而特定帧缓冲设备fb_info结构体的注册、注销以及其中的成员的维护,尤其是fb_ops中成员函数的则由对应的xxxfb.c文件实现,fb_ops中的成员函数最终会操作LCD控制器硬件寄存器。
相关数据结构
Fb_info
Fb_info结构是帧缓冲设备属性和操作的完整描述,包含了帧缓冲设备的全部信息,如设备参数设置、以及操作函数指针。每一个帧缓冲设备都必须对应一个fb_info。
struct fb_info {
structfb_var_screeninfo var; /* 描述fb可变参数 */
structfb_fix_screeninfo fix; /* 描述fb固定参数 */
structbacklight_device *bl_dev; /* 背光设备 */
structdevice *dev; /* This is this fbdevice, guess what? */
structfb_ops *fbops; /* fb操作函数集 */
……
}
Fb_ops
Fb_ops是操作底层fb的函数集合,对于不同的LCD控制器实现不同fb_ops,应用层通过file_operations函数集合调用到fb_ops函数集合。
struct fb_ops {
/*打开和关闭fb设备 */
int(*fb_open)(struct fb_info *info, int user);
int(*fb_release)(struct fb_info *info, int user);
/*用于非线性布局和在常规内存无法映射访问的fb */
ssize_t(*fb_read)(struct fb_info *info, char __user *buf,
size_t count, loff_t *ppos);
ssize_t(*fb_write)(struct fb_info *info, const char __user *buf,
size_t count, loff_t *ppos);
/*检测可变参数,并调整到支持的值*/
int(*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);
/*根据info->var设置video模式 */
int(*fb_set_par)(struct fb_info *info);
/*set color register */
int(*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
unsigned blue, unsigned transp, structfb_info *info);
/*set color registers in batch */
int(*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);
/*空白显示 */
int(*fb_blank)(int blank, struct fb_info *info);
/*pan display */
int(*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);
/*矩形填充 */
void(*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);
/*Copy data from area to another */
void(*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);
/*Draws a image to the display */
void(*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
/*绘制光标 */
int(*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);
/*旋转显示 */
void(*fb_rotate)(struct fb_info *info, int angle);
/*wait for blit idle, optional */
int(*fb_sync)(struct fb_info *info);
/*perform fb specific ioctl (optional) */
int(*fb_ioctl)(struct fb_info *info, unsigned int cmd,
unsignedlong arg);
/*Handle 32bit compat ioctl (optional) */
int(*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,
unsignedlong arg);
/*fb特定的mmap */
int(*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
/*get capability given var */
void(*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
struct fb_var_screeninfo *var);
/*teardown any resources to do with this framebuffer */
void(*fb_destroy)(struct fb_info *info);
};
fb_var_screeninfo
记录用户可修改的显示控制器参数,包括屏幕分辨率、每个像素点包含的位数和timing等。
struct fb_var_screeninfo {
__u32xres; /* 可视分别率 */
__u32yres;
__u32xres_virtual; /* 虚拟分别率 */
__u32yres_virtual;
__u32xoffset; /* 虚拟到可视的偏移 */
__u32yoffset;
__u32bits_per_pixel; /* guesswhat */
__u32grayscale; /* 0 = color, 1 =grayscale, */
/* >1 = FOURCC */
/*fb缓存的RGB位域*/
structfb_bitfield red; /*bitfield in fb mem if true color, */
structfb_bitfield green; /* else only length issignificant */
structfb_bitfield blue;
structfb_bitfield transp; /* transparency */
__u32nonstd; /* != 0 Nonstandard pixel format */
__u32activate; /* seeFB_ACTIVATE_* */
__u32height; /* height ofpicture in mm */
__u32width; /* width ofpicture in mm */
__u32accel_flags; /* (OBSOLETE) seefb_info.flags */
/*时序:出了pixclock其他单位都是ps*/
__u32pixclock; /*pixel clock in ps (pico seconds) */
__u32left_margin; /* time from syncto picture */
__u32right_margin; /* time frompicture to sync */
__u32upper_margin; /* time fromsync to picture */
__u32lower_margin;
__u32hsync_len; /* length ofhorizontal sync */
__u32vsync_len; /* length ofvertical sync */
__u32sync; /* seeFB_SYNC_* */
__u32vmode; /* seeFB_VMODE_* */
__u32rotate; /* angle werotate counter clockwise */
__u32colorspace; /* colorspace forFOURCC-based modes */
__u32reserved[4]; /* Reserved forfuture compatibility */
};
Fb_fix_screeninfo
记录用户不能修改的显示控制器的参数,如帧缓存区的物理地址和长度等。
struct fb_fix_screeninfo {
charid[16]; /*identification string eg "TT Builtin" */
unsignedlong smem_start; /*帧缓存区的开始物理地址*/
__u32smem_len; /* 长度 */
__u32type; /* seeFB_TYPE_* */
__u32type_aux; /*Interleave for interleaved Planes */
__u32visual; /* seeFB_VISUAL_* */
__u16xpanstep; /* zeroif no hardware panning */
__u16ypanstep; /* zeroif no hardware panning */
__u16ywrapstep; /* zero if nohardware ywrap */
__u32line_length; /* length of aline in bytes */
unsignedlong mmio_start; /*内存映射IO的开始地址 */
/*(physical address) */
__u32mmio_len; /* Lengthof Memory Mapped I/O */
__u32accel; /* Indicateto driver which */
/* specific chip/card we have */
__u16capabilities; /* see FB_CAP_* */
__u16reserved[2]; /* Reserved forfuture compatibility */
};
Fb_bitfield
Fb_bitfield结构体描述每个像素点的组织方式。
struct fb_bitfield {
__u32offset; /* 位域偏移 */
__u32length; /*位域长度 */
__u32msb_right; /* != 0 : Mostsignificant bit is right */
};
注册/注销函数
Int register_framebuffer(struct fb_info*fb_info);
Int unregister_framebuffer(struct fb_info*fb_info);
fb注册函数主要完成创建fb设备文件、把新的fb设备加入到registered_fb数组和convertfb_var_screeninfo to fb_videomode。Fb注销函数作用则相反。
如何编写一个帧缓冲设备驱动?
内核中提供了一个帧缓冲设备驱动的骨架程序(skeletonfb.c),很有参考价值。现在大多数的LCD控制器都是SOC的,所以驱动里用platform设备来进行注册。
帧缓存设备初始化,需要完成以下几个工作:
1、映射LCD寄存器和申请LCD中断;
2、申请fb_info并初始化fb_fix_screeninfo和fb_var_screeninfo结构体;
3、根据具体LCD屏幕的特点,完成LCD控制器的初始化;
4、申请帧缓冲设备的显示缓存区空间;
5、调用register_framebuffer函数注册帧缓冲设备。
实现fb_ops结构体,其中fb_fillrect、fb_copyarea和fb_imageblit是必须的。
static struct fb_ops xxxfb_ops = {
.owner = THIS_MODULE,
.fb_open = xxxfb_open, /* 打开fb设备 */
.fb_read = xxxfb_read,
.fb_write = xxxfb_write,
.fb_release = xxxfb_release, /* 关闭fb设备 */
.fb_check_var = xxxfb_check_var, /* 检测可变参数,并调整到支持的值 */
.fb_set_par = xxxfb_set_par, /* 初始化LCD控制器 */
.fb_setcolreg = xxxfb_setcolreg, /* 设置color寄存器 */
.fb_blank = xxxfb_blank, /* 显示空白 */
.fb_pan_display= xxxfb_pan_display,
.fb_fillrect = xxxfb_fillrect, /* Needed !!! 矩形填充 */
.fb_copyarea = xxxfb_copyarea, /* Needed !!! 数据拷贝 */
.fb_imageblit = xxxfb_imageblit, /* Needed !!! 图像填充 */
.fb_cursor = xxxfb_cursor, /* 显示光标 */
.fb_rotate = xxxfb_rotate, /* 旋转显示 */
.fb_sync = xxxfb_sync,
.fb_ioctl = xxxfb_ioctl, /* fb特定的IOCTL */
.fb_mmap = xxxfb_mmap, /* fb特定的MMAP */
};
Framebuffer 机制【转】的更多相关文章
- FrameBuffer
http://blog.csdn.net/luxiaoxun/article/details/7622988 http://blog.csdn.net/godspirits/article/detai ...
- 【转】Linux Framebuffer
全面的framebuffer详解 一.FrameBuffer的原理 FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口. Linux是工作在保护模式下,所以用户态进程是无法象D ...
- Framebuffer原理、使用、测试系列文章,非常好的资料,大家一起学习
转载:http://blog.csdn.net/tju355/article/details/6881372 *一.FrameBuffer的原理* FrameBuffer 是出现在 2.2.xx 内核 ...
- FrameBuffer系列 之 介绍
1. 来由 FrameBuffer是出现在2.2.xx内核当中的一种驱动程序接口.Linux工作在保护模式下,所以用户态进程是无法象 DOS 那样使用显卡 BIOS里提供的中断调用来实现直接写 ...
- Linux中LCD设备驱动-framebuffer(帧缓冲)【】
转自:https://blog.csdn.net/linux_devices_driver/article/details/7079442 1.framebuffer 帧缓冲 帧缓冲(fram ...
- Android Framebuffer介绍及使用【转】
转自:https://www.jianshu.com/p/df1213e5a0ed 来自: Android技术特工队 作者: Aaron 主页: http://www.wxtlife.com/ 原文连 ...
- 全面的framebuffer详解一
转:http://blog.chinaunix.net/uid-20628575-id-72534.html 一.FrameBuffer的原理 FrameBuffer 是出现在 2.2.xx 内核当中 ...
- 关于FrameBuffer【转】
本文转载自:http://blog.csdn.net/ganxingming/article/details/764482 一.FrameBuffer的原理 FrameBuffer 是出现在 2.2. ...
- Linux Framebuffer 驱动框架之一概念介绍及LCD硬件原理【转】
本文转载自:http://blog.csdn.net/liuxd3000/article/details/17464779 一.基本概念 帧缓冲(Framebuffer)是Linux系统为显示设备提供 ...
随机推荐
- vue项目杂记
vue项目杂记 文件目录结构 src main.js app.vue package.json webpack_config_dev.js 需要安装的包 1. vue cnpm i vue --sav ...
- Quartz中时间参数说明 即Cron表达式
Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示: 表1 Cron表达式时间字段 位置 时间域名 允许值 允 ...
- nagios插件nagiosql安装配置
nagios插件nagiosql安装配置 # Nagiosql install [root@Cagios ~]# yum install -y libssh2 libssh-devel [root@C ...
- Cesium学习笔记(四)Camera
http://blog.csdn.net/HobHunter/article/details/74909641 Cesium 相机控制场景中的视野.操作相机的方法有很多,如旋转,缩放,平移和飞到目的地 ...
- C#文件路径问题
一丶声明的文件路径 @"/Upload\\" + timeStr + @"\\" + fileName; \\ 中第一个\是转义符 \\表示的是一个字符 即'\ ...
- 【python】详解numpy库与pandas库axis=0,axis= 1轴的用法
对数据进行操作时,经常需要在横轴方向或者数轴方向对数据进行操作,这时需要设定参数axis的值: axis = 0 代表对横轴操作,也就是第0轴: axis = 1 代表对纵轴操作,也就是第1轴: nu ...
- python数字取反~
>>> a = [1,2,3,4,5,7,6,4,2,10] >>> h = len(a)//2 >>> h 5 >>> ~h ...
- 第十三节:pandas之groupby()分组
1.Series()对象分组 1.1.单级索引 1.2.多级索引 2.DataFrame()对象分组 3.获取一个分组,遍历分组,filter过滤.
- DSP28035的编程初步--GPIO操作
明白DSP编程的基本流程,熟悉DSP28035的GPIO的使用.代码执行流程:首先是系统时钟的选择.其次是PIE中断向量表的初始化.一些外设的初始化操作While(){}根据EXPERIMENTER’ ...
- 4 pandas模块,Series类
对gtx图像进行操作,使用numpy知识 如果让gtx这张图片在竖直方向上进行颠倒. 如果让gtx这张图片左右颠倒呢? 如果水平和竖直方向都要颠倒呢? 如果需要将gtx的颜色改变一下呢 ...