linux中LCD设备驱动(1)——framebuffer(帧缓冲)1、framebuffer帧缓冲帧缓冲(framebuffer)是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据结构,可以通过framebuffer的读写直接对显存进行操作。用户可以将framebuffer看成是显存的一个映像,将其映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕上。framebuffer是个字符设备,主设备号为29,对应于/dev/fb%d设备文件。通常,使用如下方式(前面的数字表示次设备号)0=/dev/fb0第一个fb设备1=/dev/fb1第二个fb设备fb也是一种普通的内存设备,可以读写其内容。例如,屏幕抓屏:cp/dev/fb0myfilefb虽然可以像内存设备(/dev/mem)一样,对其read,write,seek以及mmap。但区别在于fb使用的不是整个内存区,而是显存部分。2、fb与应用程序的交互对于用户程序而言,它和其他的设备并没有什么区别,用户可以把fb看成是一块内存,既可以向内存中写数据,也可以读数据。fb的显示缓冲区位于内核空间,应用程序可以把此空间映射到自己的用户空间,在进行操作。在应用程序中,操作/dev/fbn的一般步骤如下:(1)打开/dev/fbn设备文件。(2)用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。(3)用mmap()函数,将屏幕缓冲区映射到用户空间。(4)映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。3、fb的结构及其相关结构体在linux中,fb设备驱动的源码主要在Fb.h(linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备驱动的中间层,为上层提供系统调用,为底层驱动提供接口。在fb.h文件中有fb驱动需要使用的很多结构,我们先对这些结构体进行说明:本章共介绍5个结构体:(1)、structfb_info结构体(2)、structfb_ops结构体(3)、structfb_fix_screeninfo结构体(4)、structfb_var_screeninfo结构体(5)、structfb_cmap结构体(1)、structfb_info结构体介绍一个帧缓冲区对应一个structfb_info结构,它包括了帧缓冲设备的属性和操作的完整集合,每个帧设备都有一个fb_info结构体。源码如下:structfb_info{intnode;intflags;structmutexlock;/*Lockforopen/release/ioctlfuncs*/互斥锁structfb_var_screeninfovar;/*Currentvar*/当前缓冲区的可变参数structfb_fix_screeninfofix;/*Currentfix*/固定参数structfb_monspecsmonspecs;/*CurrentMonitorspecs*/当前显示器标志structwork_structqueue;/*Framebuffereventqueue*/帧缓冲事件队列structfb_pixmappixmap;/*Imagehardwaremapper*/图像硬件mapperstructfb_pixmapsprite;/*Cursorhardwaremapper*/光标硬件mapperstructfb_cmapcmap;/*Currentcmap*/当前的调色板structlist_headmodelist;/*modelist*/structfb_videomode*mode;/*currentmode*/当前的视频模式#ifdefCONFIG_FB_BACKLIGHT如果配置了LCD支持背光灯/*assignedbacklightdevice*//*setbeforeframebufferregistration,removeafterunregister*/背光调整structbacklight_device*bl_dev;/*Backlightlevelcurve*/structmutexbl_curve_mutex;u8bl_curve[FB_BACKLIGHT_LEVELS];#endif#ifdefCONFIG_FB_DEFERRED_IOstructdelayed_workdeferred_work;structfb_deferred_io*fbdefio;#endifstructfb_ops*fbops;帧缓冲操作函数集structdevice*device;/*Thisistheparent*/父设备structdevice*dev;/*Thisisthisfbdevice*/fb设备intclass_flag;/*privatesysfsflags*/私有的sysfs标志#ifdefCONFIG_FB_TILEBLITTINGstructfb_tile_ops*tileops;/*TileBlitting*/图块blitting#endifchar__iomem*screen_base;/*Virtualaddress*/虚拟基地址unsignedlongscreen_size;/*AmountofioremappedVRAMor0*/ioremap的虚拟内存大小void*pseudo_palette;/*Fakepaletteof16colors*/伪16位调色板#defineFBINFO_STATE_RUNNING0#defineFBINFO_STATE_SUSPENDED1u32state;/*Hardwarestatei.esuspend*/硬件的状态void*fbcon_par;/*fbconuse-onlyprivatearea*//*Fromhereoneverythingisdevicedependent*/void*par;};(2)、structfb_ops结构体介绍/**Framebufferoperations**LOCKINGNOTE:thosefunctionsmust_ALL_becalledwiththeconsole*semaphoreheld,thisistheonlysuitablelockingmechanismwehave*in2.6.Somemaybecalledatinterrupttimeatthispointthough.*/fb_ops结构体用来实现对帧缓冲设备的操作,这些函数需要驱动开发人员编写,structfb_ops{/*open/releaseandusagemarking*/structmodule*owner;打开和释放int(*fb_open)(structfb_info*info,intuser);int(*fb_release)(structfb_info*info,intuser);这两个函数对于非线性布局的/常规内存映射无法工作的帧缓冲设备需要/*Forframebufferswithstrangenonlinearlayoutsorthatdonot*workwithnormalmemorymappedaccess*/ssize_t(*fb_read)(structfb_info*info,char__user*buf,size_tcount,loff_t*ppos);ssize_t(*fb_write)(structfb_info*info,constchar__user*buf,size_tcount,loff_t*ppos);检测可变参数,并调整到支持的值/*checksvarandeventuallytweaksittosomethingsupported,*DONOTMODIFYPAR*/int(*fb_check_var)(structfb_var_screeninfo*var,structfb_info*info);设置视频模式/*setthevideomodeaccordingtoinfo-var*/int(*fb_set_par)(structfb_info*info);设置color寄存器的值/*setcolorregister*/int(*fb_setcolreg)(unsignedregno,unsignedred,unsignedgreen,unsignedblue,unsignedtransp,structfb_info*info);批量设置color寄存器,设置颜色表/*setcolorregistersinbatch*/int(*fb_setcmap)(structfb_cmap*cmap,structfb_info*info);显示空白/*blankdisplay*/int(*fb_blank)(intblank,structfb_info*info);pan显示/*pandisplay*/int(*fb_pan_display)(structfb_var_screeninfo*var,structfb_info*info);填充矩形/*Drawsarectangle*/void(*fb_fillrect)(structfb_info*info,conststructfb_fillrect*rect);数据复制/*Copydatafromareatoanother*/void(*fb_copyarea)(structfb_info*info,conststructfb_copyarea*region);图形填充/*Drawsaimagetothedisplay*/void(*fb_imageblit)(structfb_info*info,conststructfb_image*image);绘制光标/*Drawscursor*/int(*fb_cursor)(structfb_info*info,structfb_cursor*cursor);旋转显示/*Rotatesthedisplay*/void(*fb_rotate)(structfb_info*info,intangle);等待blit空闲/*waitforblitidle,optional*/int(*fb_sync)(structfb_info*info);fb特定的ioctl操作/*performfbspecificioctl(optional)*/int(*fb_ioctl)(structfb_info*info,unsignedintcmd,unsignedlongarg);处理32兼容的ioctl操作/*Handle32bitcompatioctl(optional)*/int(*fb_compat_ioctl)(structfb_info*info,unsignedcmd,unsignedlongarg);fb特定的mmap操作/*performfbspecificmmap*/int(*fb_mmap)(structfb_info*info,structvm_area_struct*vma);保存目前的硬件状态/*savecurrenthardwarestate*/void(*fb_save_state)(structfb_info*info);恢复被保存的硬件状态/*restoresavedstate*/void(*fb_restore_state)(structfb_info*info);通过fb_info获得framebuffer的能