概述
(本文主要内容来自《深度实践嵌入式linux系统移植》)
一、帧缓存
一般的显示设备,都会有一个叫做“显存”的东西,一些高端设备(PC中的显卡)会有自己独立的显存,而在一些嵌入式设备中则是从内存中分出一块用来作为显存;因此简单的说,所谓显存就是实在的一些存储空间;而帧缓存(Frame Buffer)从本质上讲是图形设备的硬件抽象,换句话说就是这些显存的抽象。
1、帧缓存的设备文件
2、直接操作帧缓存
可以使用下面的具体操作来印证上面的基础理论
dd if=/dev/zero of=/dev/fb0 bs=240 count=320
上面的命令为内存文件拷贝命令,if后面跟的为被拷贝的文件(i表示输入),of后面跟的为拷贝至哪个文件(o表示输出),bs表示的内存块大小,在此为(240字节,图像大小为240*320),count为拷贝的内存块个数;因此上面的命令执行后,则帧缓存应该全部被置0;相应的屏幕应该全部为黑色,就是黑屏!也可以将实际的图片显示到屏幕上,操作命令如下:
cat 7.bmp >/dev/fb0
二、linux帧缓冲子系统
1、linux帧缓冲子系统总体框架图
2、主要的数据结构及操作
(1)fb_info结构(该结构位于include/linux/fb.h)
struct fb_info {
int node;
int flags;
struct mutex lock;
/* Lock for open/release/ioctl funcs */
struct fb_var_screeninfo var; /* Current var */
struct fb_fix_screeninfo fix; /* Current fix */
struct fb_monspecs monspecs; /* Current Monitor specs */
struct work_struct queue; /* Framebuffer event queue */
struct fb_pixmap pixmap; /* Image hardware mapper */
struct fb_pixmap sprite; /* Cursor hardware mapper */
struct fb_cmap cmap;
/* Current cmap */
struct list_head modelist;
/* mode list */
struct fb_videomode *mode; /* current mode */
#ifdef CONFIG_FB_BACKLIGHT
/* assigned backlight device */
/* set before framebuffer registration,
remove after unregister */
struct backlight_device *bl_dev;
/* Backlight level curve */
struct mutex bl_curve_mutex;
u8 bl_curve[FB_BACKLIGHT_LEVELS];
#endif
#ifdef CONFIG_FB_DEFERRED_IO
struct delayed_work deferred_work;
struct fb_deferred_io *fbdefio;
#endif
struct fb_ops *fbops;
struct device *device;
/* This is the parent */
struct device *dev;
/* This is this fb device */
int class_flag;
/* private sysfs flags */
#ifdef CONFIG_FB_TILEBLITTING
struct fb_tile_ops *tileops;
/* Tile Blitting */
#endif
char __iomem *screen_base; /* Virtual address */
unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */
void *pseudo_palette;
/* Fake palette of 16 colors */
#define FBINFO_STATE_RUNNING 0
#define FBINFO_STATE_SUSPENDED 1
u32 state;
/* Hardware state i.e suspend */
void *fbcon_par;
/* fbcon use-only private area */
/* From here on everything is device dependent */
void *par;
};
struct fb_info *framebuffer_alloc(size_t size,struct device *dev);
int register_framebuffer(struct fb_info *fb_info);
(2)fb_var_screeninfo结构和fb_fix_screeninfo结构
在上面的fb_info结构中有这样两个重要的结构体成员,他们分别表示帧缓冲设备的可变参数和固定参数;他们的声明都在include/linux/fb.h文件中
a、fb_var_screeninfo
struct fb_var_screeninfo {
__u32 xres;
/* visible resolution可视屏幕分辨率
*/
__u32 yres;
__u32 xres_virtual;
/* virtual resolution虚拟屏幕分辨率
*/
__u32 yres_virtual;
__u32 xoffset;
/* offset from virtual to visible 虚拟屏幕到可视屏幕之间的偏移*/
__u32 yoffset;
/* resolution
*/
__u32 bits_per_pixel;
/* guess what每像素所占的位数,简称bpp
*/
__u32 grayscale;
/* != 0 Graylevels instead of colors 非0时灰度显示*/
struct fb_bitfield red;
/* bitfield in fb mem if true color, 红色位域*/
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp; /* transparency 透明
*/
__u32 nonstd;
/* != 0 Non standard pixel format */
__u32 activate;
/* see FB_ACTIVATE_*
*/
__u32 height;
/* height of picture in mm 屏幕以毫米为单位度量的几何高度
*/
__u32 width;
/* width of picture in mm
*/
__u32 accel_flags;
/* (OBSOLETE) see fb_info.flags */
/* Timing: All values in pixclocks, except pixclock (of course) */
__u32 pixclock;
/* pixel clock in ps (pico seconds) */
__u32 left_margin;
/* time from sync to picture */
__u32 right_margin;
/* time from picture to sync */
__u32 upper_margin;
/* time from sync to picture */
__u32 lower_margin;
__u32 hsync_len;
/* length of horizontal sync */
__u32 vsync_len;
/* length of vertical sync */
__u32 sync;
/* see FB_SYNC_*
*/
__u32 vmode;
/* see FB_VMODE_*
*/
__u32 rotate;
/* angle we rotate counter clockwise */
__u32 reserved[5];
/* Reserved for future compatibility */
};
为了介绍上面的结构体中的几个时序成员,我们先来看一张通用LCD的时序图
struct fb_fix_screeninfo {
char id[16];
/* identification string eg "TT Builtin" */
unsigned long smem_start; /* Start of frame buffer mem */
/* (physical address) */
__u32 smem_len;
/* Length of frame buffer mem */
__u32 type;
/* see FB_TYPE_*
*/
__u32 type_aux;
/* Interleave for interleaved Planes */
__u32 visual;
/* see FB_VISUAL_*
*/
__u16 xpanstep;
/* zero if no hardware panning
*/
__u16 ypanstep;
/* zero if no hardware panning
*/
__u16 ywrapstep;
/* zero if no hardware ywrap
*/
__u32 line_length;
/* length of a line in bytes
*/
unsigned long mmio_start; /* Start of Memory Mapped I/O
*/
/* (physical address) */
__u32 mmio_len;
/* Length of Memory Mapped I/O
*/
__u32 accel;
/* Indicate to driver which */
/*
specific chip/card we have */
__u16 reserved[3];
/* Reserved for future compatibility */
};
上面的结构体中有两个成员需要提及,帧缓存存储类型type和屏幕可视模式visual,像素在内存中存储格式是硬件相关的,驱动程序根据硬件需求,将正确格式的图像数据放入帧缓存,才能正常驱动硬件显示,像素格式正是由帧缓存存储类型和可视模式两个因素决定的,可视模式决定使用哪种方式描述一个像素,而存储类型决定像素在帧缓存中的存放方法。
三、platform驱动模型
最后再介绍下关于platform驱动模型的概念,platform驱动主要是通过总线来匹配设备和驱动,一般都是在当前的机器资源文件中注册platform设备,然后再在驱动文件中注册驱动,这两项的名称相同,而总线则是根据注册的名称来将他们联系起来。
最后
以上就是优秀草丛为你收集整理的linux下LCD驱动(一)-------LCD基础知识一、帧缓存二、linux帧缓冲子系统 三、platform驱动模型的全部内容,希望文章能够帮你解决linux下LCD驱动(一)-------LCD基础知识一、帧缓存二、linux帧缓冲子系统 三、platform驱动模型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复