Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型
- 格式:doc
- 大小:48.00 KB
- 文档页数:12
大连理工大学本科毕业设计(论文)自动电梯模拟控制系统The Simulative Control System of The Automatic Elevator学院(系):软件学院专业:软件工程学生姓名:施元超学号:200492218指导教师:赖晓晨评阅教师:完成日期:大连理工大学Dalian University of Technology摘要随着城市化进程的加快,一座座现代化的高楼拔地而起,而电梯也成为现代建筑必备的基础设施。
电梯作为一种交通工具,不仅要关注它的安全性,而且希望与它的信息交互能更为人性化。
而随着嵌入式系统和设备被广泛的应用于各种智能控制领域,开发一套更为智能的电梯控制系统变得方便可行。
本文旨在使用英倍特EDUKIT-Ⅲ实验开发板和Linux操作系统完成自动电梯模拟控制系统的设计与实现。
首先,根据系统开发需求,搭建了Linux开发环境。
其次,本文通过对自动电梯进行需求分析,详细制定了电梯的运行规则,并根据运行规则设计实现了电梯的控制运行算法。
最后,系统使用开发板上的液晶显示屏作为显示设备,完成了模拟系统的演示过程。
本文详细设计了乘客与电梯的信息交互过程,基于Linux帧缓冲(Framebuffer)设备驱动程序开发了在LCD上显示电梯的状态、乘客的请求以及电梯动态运行效果等信息的应用程序。
系统还使用开发板上的5*4小键盘上的部分按键模拟电梯按钮,把键盘作为乘客信息输入端。
本文使用功能性测试方法对程序进行了测试。
最终,仿真程序能够根据不同乘客向自动电梯模拟系统输入的内、外部不同的请求信息,指挥电梯按照运行规则运行,并在LCD上显示相应信息。
关键词:电梯;LCD;交互;Linux;信息The Simulative Control System of The Automatic ElevatorAbstractAlong with the acceleration of urbanization, lots of modern tall buildings rising straight from the ground, the elevator has become a necessary infrastructure of the modern architecture. The elevator, as one kind of transportation vehicle, is not only concerned on its security, but also is expected that the interaction with it can be user-friendly. And along with the embedded system and equipment widely used in the intelligent control domain, building a set of more intelligent elevator control system becomes convenient and feasible.This article is for the purpose of using Embest EDUKIT-Ⅲexperiment board and the Linux operating system to complete the design and realization of the simulation control system of the automatic elevator. First, according to the system’s demand, build the Linux development environment. Second, through carrying on analysis to the requirement of the automatic elevator, this article formulated the elevator's movement rule in detail, and realized elevator's control algorithm according to the movement rule. Finally, the system took the LCD on the experiment board as display device, completed the simulation system's demonstration. This article detailed designed the process of the information’s interaction between passengers and elevator, and developed a program which is based on Linux F ramebuffer device driver program that can display the elevator’s status, passenger's request as well as elevator dynamic movement effect on LCD. The system also used the 5*4 small keyboard's partial pressed keys of the experiment board to simulate the elevator’s buttons, and the keyboard was took as the passenger’ information input end.According to the functionality test method, this article carried on the test to the procedure. Finally, this simulated program can act according to the input information which is from the passenger outside and inside, directed the elevator to move according to the movement rule, and demonstrated the corresponding information on LCD.Key Words:elevator;LCD;interaction;Linux;information目录摘要 (I)Abstract (II)1 绪论 (1)1.1 课题的背景及研究意义 (1)1.2 嵌入式系统 (1)1.2.1 嵌入式系统简介 (1)1.2.2 嵌入式系统的发展 (2)1.2.3 嵌入式系统的应用领域 (2)1.2.4 嵌入式系统的组成和特点 (2)1.3 本文主要工作 (3)2 系统软硬件平台及开发环境构建 (4)2.1 Linux操作系统简介 (4)2.2 系统硬件平台介绍 (5)2.2.1 ARM微处理器简介 (5)2.2.2 EDUKIT-Ⅲ实验平台介绍 (6)2.3 系统开发环境的构建 (8)2.3.1 利用Cygwin安装建立模拟开发环境 (8)2.3.2 交叉编译环境的建立 (8)3 电梯系统总体架构及各模块的实现 (10)3.1 电梯系统总体架构及功能模块划分 (10)3.1.1 电梯系统简介及框架 (10)3.1.2 系统功能模块划分及描述 (10)3.1.3 系统使用说明 (11)3.2电梯控制模块的设计与实现 (12)3.2.1 系统设计要求 (12)3.2.2 电梯运行规则 (12)3.2.3 电梯系统流程图 (13)3.2.4 电梯控制状态划分及迁移规则 (15)3.2.5 电梯各控制状态的具体实现 (16)3.3 系统输入模块的设计与实现 (20)3.3.1 系统输入模块功能分析 (20)3.3.2 ZLG7290器件工作原理 (20)3.3.3 加载I2C模块 (21)3.3.4 输入模块应用程序实现 (21)3.4 系统显示模块的设计与实现 (22)3.4.1 显示系统界面设计 (22)3.4.2 LCD设备显示原理 (25)3.4.3 基础图形显示实现 (26)3.4.4 字符的显示实现 (27)3.4.5 图片的显示实现 (28)4 电梯系统的测试 (29)结论 (30)参考文献 (31)致谢 (32)1 绪论1.1 课题的背景及研究意义1854年,在纽约水晶宫举行的世界博览会上,美国人奥的斯第一次向世人展示了他的发明——历史上第一部安全升降梯。
草稿V2.4.01framebuffer设备即帧缓冲设备(简写fb)提供了显示接口的抽象描述。
他同时代表着显示接口的存储区,应用程序通过定义好的函数访问,不需要知道底层的任何操作。
Framebuffer驱动使用的设备节点,通常位于/dev目录,如/dev/fb*.从用户角度看,fb设备和其他/dev下面的设备类似:普通的字符设备,主设备号29,次设备号定义fb的索引。
通常,使用如下方式(前面的数字表示次设备号)0=/dev/fb0第一个fb设备1=/dev/fb1第二个fb设备考虑到向下兼容,可以创建符号链接:/dev/fb0current->fb0/dev/fb1current->fb1fb也是一种普通的内存设备,可以读写其内容。
例如,屏幕抓屏:cp/dev/fb0myfilefb虽然可以像内存设备(/dev/mem)一样,对其read,write,seek以及mmap。
但区别在于fb使用的不是整个内存区,而是显存部分。
通过ioctl可以读取或设定fb设备参数,很重要的一点,颜色表(cmap)也要通过Ioctl设定。
查看<linux/fb.h>就知道有多少ioctl应用以及相关数据结构。
这里给出摘要:-你可以获取设备一些不变的信息,如设备名,屏幕的组织(平面,象素,...)对应内存区的长度和起始地址。
-也可以获取能够改变的信息,例如位深,颜色格式,时序等。
如果你改变这些值,驱动程序将对值进行优化,以满足设备特性(如果你的设定,设备不支持,返回EINVAL)。
-你也可以获取或设定部分颜色表。
所有这些特性让应用程序十分容易的使用framebuffer设备。
Xserver可以使用/dev/fb*而不需知道硬件的寄存器是如何组织的。
XF68_FBDev是一个用于位映射(单色)Xserver,唯一要做的就是在应用程序在相应的位置设定是否显示。
在新内核中,帧缓冲设备可以工作于模块中,允许动态加载。
framebuffer帧缓冲framebuffer简介帧缓冲〔framebuffer〕是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进展读写操作。
framebuffer是LCD对应的一中HAL〔硬件抽象层〕,提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的。
这些都是由Framebuffer 设备驱动来完成的。
帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/dev/fb0到/dev/fb31,而/dev/fb那么为当前缺省的帧缓冲设备,通常指向/dev/fb0,在嵌入式系统中支持一个显示设备就够了。
帧缓冲设备为标准字符设备,主设备号为29,次设备号那么从0到31。
分别对应/dev/fb0-/dev/fb31。
通过/dev/fb,应用程序的操作主要有这几种:1.读/写〔read/write〕/dev/fb:相当于读/写屏幕缓冲区。
2.映射〔map〕操作:由于Linux工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接物理缓冲区地址的。
而帧缓冲设备可以通过mmap()映射操作将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址上,然后用户就可以通过读写这段虚拟地址屏幕缓冲区,在屏幕上绘图了。
3.I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,屏幕大小等相关参数。
ioctl的操作是由底层的驱动程序来完成的。
在应用程序中,操作/dev/fb的一般步骤如下:1.翻开/dev/fb设备文件。
2.用ioctl操作取得当前显示屏幕的参数,根据屏幕参数可计算屏幕缓冲区的大小。
3.将屏幕缓冲区映射到用户空间。
4.映射后即可直接读写屏幕缓冲区,进展绘图和图片显示。
图二用户空间帧缓冲设备流程framebuffer相关数据构造介绍1. fb_info构造体:帧缓冲设备中最重要的数据构造体,包括了帧缓冲设备属性和操作的完整性属性。
Linux2.6内核中的Framebuffer驱动程序设计虽然Framebuffer驱动技术在PC上已经逐渐被淘汰,但是在嵌入式等考虑成本的平台下,由于其使用简单,成本低廉的优势,使用相当的广泛。
在Linux2.4和Linux2.6内核之间,Framebuffer的框架结构发生了很大的变化,网络上很多介绍Framebuffer的文档都是基于2.4内核下的,这就使得在2.6内核开发Framebuffer驱动增加了难度,本文介绍2.6内核下如何编写Framebuffer驱动,以适应最新版本的Linux。
Framebuffer是出现在Linux 2.2.xx及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备。
帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。
这样软件无须了解任何涉及硬件底层驱动的东西(如硬件寄存器)。
它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和I/O控制等操作。
通过专门的设备节点可对该设备进行访问,如/dev/fb*。
用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以进行读写操作,而读写操作可以反映到LCD。
二、 Framebuffer驱动的主要数据结构fb_fix_screeninfo记录了帧缓冲设备和指定显示模式的固件信息。
它包含了屏幕缓冲区的物理地址和长度等信息。
fb_var_screeninfo记录了帧缓冲设备和指定显示模式的可修改信息。
它包括显示屏幕的分辨率、每个像素的比特数和一些时序变量。
其中变量 xres定义了屏幕一行所占的像素数,yres定义了屏幕一列所占的像素数。
fb_info info是Linux为帧缓冲设备定义的驱动层接口。
它不仅包含了底层函数,而且还有记录设备状态的数据。
每个帧缓冲设备都与一个fb_info结构相对应。
其中成员变量包含fb_fix_screeninfo、fb_var_screeninfo这两个数据结构,另外还有Framebuffer的回调函数。
qt linuxfb原理摘要:1.引言2.Linux FB介绍3.QT与Linux FB的关系4.QT for Linux FB的工作原理5.结论正文:Linux FB(Framebuffer)是一个用于显示图形图像的设备驱动程序,它为上层应用程序提供了一个统一的图形接口。
QT(Qt)是一款跨平台的C++应用程序框架,广泛应用于图形界面开发。
在Linux系统中,QT通过Linux FB实现图形输出。
本文将详细介绍QT for Linux FB的工作原理。
1.引言Linux系统中的图形设备驱动程序负责管理图形硬件设备,向上层提供统一的图形接口。
Linux FB是Linux内核中提供的一个图形设备驱动程序,它支持多种硬件设备,为应用程序提供了一个标准的图形接口。
QT是一款跨平台的C++应用程序框架,提供了丰富的图形界面组件。
在Linux系统中,QT通过Linux FB实现图形输出。
2.Linux FB介绍Linux FB,即Framebuffer,是Linux内核中提供的一个图形设备驱动程序。
它的主要功能是将图形命令转换为硬件设备可以识别的信号,从而实现图形输出。
Linux FB支持多种硬件设备,包括CRT显示器、液晶显示器、投影仪等。
它为上层应用程序提供了一个统一的图形接口,简化了图形编程。
3.QT与Linux FB的关系QT是一款跨平台的C++应用程序框架,提供了丰富的图形界面组件。
在Linux系统中,QT通过Linux FB实现图形输出。
具体来说,QT使用Linux FB的图形设备驱动程序,将应用程序的图形命令转换为硬件设备可以识别的信号,从而实现图形输出。
此外,QT还提供了一套与Linux FB紧密集成的输入设备驱动程序,支持鼠标、键盘等输入设备的操作。
4.QT for Linux FB的工作原理QT for Linux FB的工作原理可以分为以下几个步骤:(1)初始化:在应用程序启动时,QT会调用Linux FB的初始化函数,创建一个与Linux FB相关的QT对象。
LCD驱动程序之代码编写实现LCD驱动程序编写前⾯通过对linux内核中LCD的驱动框架进⾏了分析,弄清楚了内核中LCD的驱动框架,通过分析知道内核中已经在fbmem.c⽂件中注册了LCD这⼀类设备的字符设备驱动,向上实现了上层通⽤的访问接⼝,向下给驱动设计者预留了fb_info注册接⼝。
现在基于我们的开发板平台(JZ2240),编写适配于⾃⼰硬件的驱动程序从前⾯分析可以知道,编写LCD驱动需要驱动的编写者去完成以下内容(可参考内核中s3c2410fb.c):1)分配⼀个fb_info结构体2)根据使⽤LCD硬件特征,设置fb_info结构体的⼀些参数3)配置硬件相关操作4)注册fb_info结构体下⾯我们就开始按照这些步骤,完成LCD驱动程序的编写1、fb_info结构体介绍fb_info结构体是LCD驱动程序中最核⼼的数据结构,应⽤程序通过fbmem.c⽂件中注册的设备访问⼊⼝,找到打开设备⽂件的fb_info结构体,最终访问到硬件,fb_info结构体声明如下:struct fb_info {int node;int flags;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_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;#endifstruct 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_TILEBLITTINGstruct fb_tile_ops *tileops; /* Tile Blitting */#endifchar __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 1u32 state; /* Hardware state i.e suspend */void *fbcon_par; /* fbcon use-only private area *//* From here on everything is device dependent */void *par;};可以看到fb_info的结构体⽐较复杂,它的肯定是为了抽象出所有LCD硬件⽽设计的,但我们不需要去了解每⼀个成员变量的功能和使⽤⽅法。
Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型
一、Linux的帧缓冲设备
帧缓冲(framebuffer)是Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。
这种操作是抽象的,统一的。
用户不必关心物理显存的位置、换页机制等等具体细节。
这些都是由Framebuffer 设备驱动来完成的。
帧缓冲驱动的应用广泛,在linux 的桌面系统中,Xwindow 服务器就是利用帧缓冲进行窗口的绘制。
尤其是通过帧缓冲可显示汉字点阵,成为Linux汉化的唯一可行方案。
帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux 下还可支持多个帧缓冲设备,最多可达32 个,分别为/dev/fb0 到/dev/fb31,而/dev/fb 则为当前缺省的帧缓冲设备,通常指向/dev/fb0。
当然在嵌入式系统中支持一个显示设备就够了。
帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。
分别对应/dev/fb0-/dev/fb31。
通过/dev/fb,应用程序的操作主要有这几种:
1.读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。
例如用cp /dev/fb0 tmp 命令可将当前屏幕的内容拷贝到一个文件中,而命令cp tmp > /dev/fb0 则将图形文件tmp直接显示在屏幕上。
2.映射(map)操作:由于Linux 工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。
为此,Linux 在文件操作file_operations 结构中提供了 mmap 函数,可将文件的内容映射到用户空间。
对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。
3.I/O控制:对于帧缓冲设备,对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数,如分辨率,显示颜色数,屏幕大小等等。
ioctl 的操作是由底层的驱动程序来完成的。
在应用程序中,操作/dev/fb的一般步骤如下:
1.打开/dev/fb设备文件。