linux的lcd驱动详细讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 */

垂直可视区域

第一个入口

入口的数字

相关文档
最新文档