linux的lcd驱动详细讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式驱动程序Day12
Top
1. LCD驱动设计开发
1 LCD驱动设计开发
1.1问题
通过led驱动开发掌握linux内核framebuffer 驱动开发通用方法。
1.2方案
一、帧缓冲(Framebuffer )。
帧缓冲(Framebuffer )是Linux为显示设备提供的一个接口,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功
能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户
可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer 设备驱动
来完成的。
Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池。CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处
理。应用程序也可以直接读写这个水池的内容。在应用程序中,一般通过将FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开/dev/fbO 设备,并通过mmap系统调用进行地址映射。
FrameBuffer设备还提供了若干ioctl 命令,通过这些命令,可以获得显示设备的
一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。
二、FrameBuffer 在Linux中的实现和机制。
Framebuffer对应的源文件在linux/drivers/video/ 目录下。总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。
1. 分析Framebuffer设备驱动。
FrameBuffer设备驱动基于如下两个文件:
(1) linux/include/linux/fb.h
(2) linux/drivers/video/fbmem.c
2. 分析这两个文件。
( 1) fb.h 。
几乎主要的结构都是在这个中文件定义的。这些结构包括:
1) fb_var_screeninfo 结构体。
这个结构描述了显示卡的特性:
__u32 是表示unsigned 不带符号的32 bits 的数据类型,其余类推。这是Linux 内核中所用到的数据类型,如果是开发用户空间( user-space )的程序,可以根据具体计算机平台的情况,用unsigned long 等等来代替。
struct fb_var_screeninfo
{
__u32 xres; // 可视区域
__u32 yres;
__u32 xres_virtual; // 可视区域
__u32 yres_virtual;
__u32 xoffset; // 可视区域的偏移
__u32 yoffset;
__u32 bits_per_pixel; // 每一象素的bit 数
__u32 grayscale; // 等于零就成黑白
struct fb_bitfield red;
struct fb_bitfield green; /* else only length is significant */
struct fb_bitfield blue;
struct fb_bitfield transp; // 透明
__u32 nonstd; // 不是标准格式
__u32 activate; /* see FB_ACTIVATE_* */
__u32 height; // 内存中的图像高度
__u32 width; // 内存中的图像宽度
__u32 accel_flags; // 加速标志
// 时序-_- 这些部分就是显示器的显示方法
__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 reserved[6]; // 备用-以后开发
};
2) fb_fix_screeninfon
结构体。 这个结构在显卡被设定模式后创建,它描述显示卡的属性,并且系统运行时不能被修 改;比如 FrameBuffer 内存的起始地址。它依赖于被设定的模式,当一个模式被设定后, 内存信息由显示卡硬件给出,内存的位置等信息就不可以修改。
struct fb_fix_screeninfo {
char id[16]; /* identification string eg "TT Builtin" */ID 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; //
没有硬件设备就为零
__u16 ypanstep; /* zero if no hardware panning */ __u16 ywrapstep; /* zero if no hardware ywrap */ __u32 line_length; //
一行的字节表示
unsigned long mmio_start; // 内存映射的 I/O 起始 /* (physical address) */ __u32 mmio_len; // I/O
的大小
__u32 accel; /* Type of acceleration available */ 可用的加速类型
__u16 reserved[3]; /* Reserved for future compatibility */ };
3) fb_cmap 结构体。
描述设备无关的颜色映射信息。可以通过 FBIOGETCMA 和FBIOPUTCMAP 对应的
ioctl 操作设定或获取颜色映射信息。
struct fb_cmap {
__u32 start; /* First entry */ __u32 len; /* Number of entries */ __u16 *red; /* Red values */
红
垂直可视区域
第一个入口
入口的数字