Linux中LCD驱动结构分析
2011-07-04 19:12
471 查看
针对Linux2.6内核中LCD驱动结构分析,由于公司项目是xx方案,所以也就用其来做分析,置于s3c2410的驱动,对比着看,应该没问题。
在分析驱动之前,首先先了解几个LCD驱动中的几个重要的数据结构,
1、struct fb_info数据结构(FBI)
FBI 中记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及操作函数指针。每一个帧缓冲设备都必须对应一个 FBI。
2.fb_ops结构体
FBI 的成员变量 fb_ops 为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写的。
LCD驱动中比较关键的是framebuff(帧缓冲)
FrameBuffer的原理
FrameBuffer 是出现在 Linux内核当中的一种驱动程序接口。它是Linux内核抽象出来的设备,供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的。但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理. 应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都有CPU完成,因此CPU负担很重。
framebuffer的设备文件一般是 /dev/fb0、/dev/fb1 等等。
可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.
如果显示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空屏幕;
用命令: #dd if=/dev/fb of=fbfile 可以将fb中的内容保存下来;
可以重新写回屏幕: #dd if=fbfile of=/dev/fb;
在使用Framebuffer时,Linux是将显卡置于图形模式下的.
在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):
int fb;
unsigned char* fb_mem;
fb = open ("/dev/fb0", O_RDWR);
fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
memset (fb_mem, 0, 1024*768); //这个命令应该只有在root可以执行
FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
--------------------------------------------------------------------------------------------------------------------------------------------------------
下面开始分析framebuff在Linux内核中的实现机制。
下班了,先简要写点,LCD驱动中有三个文件需要注意,
1、alps\xx\platform\mt\kernel\drivers\video\lcd_drv.c
2、alps\xx\source\kernel\drivers\video\xxfb.c
3、alps\kernel\driver\video\fbmem.c
fbmem.c 文件是原始内核中的文件,framebuff的核心文件,实现了framebuff驱动的注册、卸载等函数,并且在这里注册了设备文件。
xxfb.c是xx平台,LCD具体的framebuff驱动。通过调用fbmem.c中的framebuff的注册与卸载函数来向系统注册xx的fb驱动。
lcd_drv.c中实现了具体的硬件配置操作。ok啦。饿死了~~回去~~
在分析驱动之前,首先先了解几个LCD驱动中的几个重要的数据结构,
1、struct fb_info数据结构(FBI)
1 struct fb_info 2 { 3 int node; 4 int flags; 5 struct fb_var_screeninfo var; /*可变参数 */ 6 struct fb_fix_screeninfo fix; /*固定参数 */ 7 struct fb_monspecs monspecs; /*显示器标准 */ 8 struct work_struct queue; /* 帧缓冲事件队列 */ 9 struct fb_pixmap pixmap; /* 图像硬件mapper */ 10 struct fb_pixmap sprite; /* 光标硬件mapper */ 11 struct fb_cmap cmap; /* 目前的颜色表*/ 12 struct list_head modelist; 13 struct fb_videomode *mode; /* 目前的video模式 */ 14 15 #ifdef CONFIG_FB_BACKLIGHT 16 struct mutex bl_mutex; 17 /* 对应的背光设备 */ 18 struct backlight_device *bl_dev; 19 /* 背光调整 */ 20 u8 bl_curve[FB_BACKLIGHT_LEVELS]; 21 #endif 22 23 struct fb_ops *fbops; /* fb_ops,帧缓冲操作 */ 24 struct device *device; 25 struct class_device *class_device; / 26 int class_flag; /* 私有sysfs标志 */ 27 #ifdef CONFIG_FB_TILEBLITTING 28 struct fb_tile_ops *tileops; /* 图块Blitting */ 29 #endif 30 char _ _iomem *screen_base; /* 虚拟基地址 */ 31 unsigned long screen_size; /* ioremapped的虚拟内存大小 */ 32 void *pseudo_palette; /* 伪16色颜色表 */ 33 #define FBINFO_STATE_RUNNING 0 34 #define FBINFO_STATE_SUSPENDED 1 35 u32 state; /* 硬件状态,如挂起 */ 36 void *fbcon_par; 37 void *par; 38 };
FBI 中记录了帧缓冲设备的全部信息,包括设备的设置参数、状态以及操作函数指针。每一个帧缓冲设备都必须对应一个 FBI。
2.fb_ops结构体
FBI 的成员变量 fb_ops 为指向底层操作的函数的指针,这些函数是需要驱动程序开发人员编写的。
1 struct fb_ops 2 { 3 struct module *owner; 4 /* 打开/释放 */ 5 int(*fb_open)(struct fb_info *info, int user); 6 int(*fb_release)(struct fb_info *info, int user); 7 8 /* 对于非线性布局的/常规内存映射无法工作的帧缓冲设备需要 */ 9 ssize_t(*fb_read)(struct file *file, char _ _user *buf, size_t count, 10 loff_t*ppos); 11 ssize_t(*fb_write)(struct file *file, const char _ _user *buf, size_t count, 12 loff_t *ppos); 13 14 /* 检测可变参数,并调整到支持的值*/ 15 int(*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info); 16 17 /* 根据info->var设置video模式 */
18 int(*fb_set_par)(struct fb_info *info); 19 20 /* 设置color寄存器 */ 21 int(*fb_setcolreg)(unsigned regno, unsigned red, unsigned green, unsigned 22 blue, unsigned transp, struct fb_info *info); 23 24 /* 批量设置color寄存器,设置颜色表 */ 25 int(*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info); 26 27 /*显示空白 */ 28 int(*fb_blank)(int blank, struct fb_info *info); 29 30 /* pan显示 */ 31 int(*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info); 32 33 /* 矩形填充 */ 34 void(*fb_fillrect)(struct fb_info *info, const struct fb_fillrect *rect); 35 /* 数据复制 */ 36 void(*fb_copyarea)(struct fb_info *info, const struct fb_copyarea *region); 37 /* 图形填充 */ 38 void(*fb_imageblit)(struct fb_info *info, const struct fb_image *image); 39 40 /* 绘制光标 */ 41 int(*fb_cursor)(struct fb_info *info, struct fb_cursor *cursor); 42 43 /* 旋转显示 */ 44 void(*fb_rotate)(struct fb_info *info, int angle); 45 46 /* 等待blit空闲 (可选) */ 47 int(*fb_sync)(struct fb_info *info); 48 49 /* fb特定的ioctl (可选) */ 50 int(*fb_ioctl)(struct fb_info *info, unsigned int cmd, unsigned long arg); 51 52 /* 处理32位的compat ioctl (可选) */ 53 int(*fb_compat_ioctl)(struct fb_info *info, unsigned cmd, unsigned long arg); 54 55 /* fb特定的mmap */ 56 int(*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma); 57 58 /* 保存目前的硬件状态 */ 59 void(*fb_save_state)(struct fb_info *info); 60 61 /* 恢复被保存的硬件状态 */ 62 void(*fb_restore_state)(struct fb_info *info); 63 };
LCD驱动中比较关键的是framebuff(帧缓冲)
FrameBuffer的原理
FrameBuffer 是出现在 Linux内核当中的一种驱动程序接口。它是Linux内核抽象出来的设备,供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的。但Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理. 应用程序也可以直接读写这个水池的内容.在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都有CPU完成,因此CPU负担很重。
framebuffer的设备文件一般是 /dev/fb0、/dev/fb1 等等。
可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.
如果显示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空屏幕;
用命令: #dd if=/dev/fb of=fbfile 可以将fb中的内容保存下来;
可以重新写回屏幕: #dd if=fbfile of=/dev/fb;
在使用Framebuffer时,Linux是将显卡置于图形模式下的.
在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开 /dev/fb0 设备,并通过 mmap 系统调用进行地址映射,随后用 memset 将屏幕清空(这里假设显示模式是 1024x768-8 位色模式,线性内存模式):
int fb;
unsigned char* fb_mem;
fb = open ("/dev/fb0", O_RDWR);
fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
memset (fb_mem, 0, 1024*768); //这个命令应该只有在root可以执行
FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
--------------------------------------------------------------------------------------------------------------------------------------------------------
下面开始分析framebuff在Linux内核中的实现机制。
下班了,先简要写点,LCD驱动中有三个文件需要注意,
1、alps\xx\platform\mt\kernel\drivers\video\lcd_drv.c
2、alps\xx\source\kernel\drivers\video\xxfb.c
3、alps\kernel\driver\video\fbmem.c
fbmem.c 文件是原始内核中的文件,framebuff的核心文件,实现了framebuff驱动的注册、卸载等函数,并且在这里注册了设备文件。
xxfb.c是xx平台,LCD具体的framebuff驱动。通过调用fbmem.c中的framebuff的注册与卸载函数来向系统注册xx的fb驱动。
lcd_drv.c中实现了具体的硬件配置操作。ok啦。饿死了~~回去~~
相关文章推荐
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Writing Linux LCD drivers—深入分析framebuffer设备驱动的结构
- Linux-2.6.38的LCD驱动分析(一)
- linux lcd驱动分析三
- Linux-2.6.20的LCD驱动分析(一)[转]
- Linux系统LCD驱动架构分析
- linux lcd驱动分析五
- 学习笔记 --- LINUX LCD显示原理与驱动分析
- Linux-2.6.38的LCD驱动分析(二)
- linux下LCD(framebuffer)驱动分析
- Linux-2.6.38的LCD驱动分析(二)
- Linux-2.6.20的LCD驱动分析(二)[转]
- linux视频驱动开发二之数据结构分析及操作流程(V4L2)
- Linux-2.6.20的LCD驱动分析(一)[转]
- Linux-2.6.20的LCD驱动分析(二)
- Linux-2.6.20的LCD驱动分析