随着嵌入式Linux的迅速发展,因为其没有高昂的版权费,完全开放源代码,可裁减性与可移植性,因而是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部份,运行在Linux内核底层,在内核源代码中占较大比列,驱动程序开发逐步成为嵌入式软件开发中一项重要工作。应项目设计的须要完成了嵌入式Linux下的LCD驱动程序设计。Linux下设备驱动程序驱动程序从字面上可以理解为一类程序,这类程序的目的通常是驱动硬件正常工作,所以一般所说的驱动程序都是针对特定的硬件来编撰的。Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化插口,它隐藏了设备工作的细节。Linux系统下驱动程序是运行在内核态的,是和内核联接在一起的程序。假如运行在用户态的应用程序想控制硬件设备,必须通过驱动程序来控Linux系统的设备分为3种类型,分别是字符设备、块设备和网路设备。文中所涉及的LCD驱动属于字符型设备驱动程序。在对字符设备发出读、写恳求时,实际的硬件I/O通常就紧接着发生了。Linux系统访问设备如同访问文件一样,比如打开关掉设备系统调用open()和close()函数。在Linux内核中,字符设备使用structfile_operations结构来定义设备的各类操作集合。
编撰字符设备驱动程序,主要是实现str-uctfile_operations结构中的各个函基于FFamebuffer的LCD驱动程序设计2.1LCD简介设计中采用的嵌入式微处理器是Samsung公司的S3C2410,LCD控制器主要用于传输显示数据和形成控制讯号,用户只需通过读写一系列寄存器即可完成配置和显示控制,图1是S3C2410平台LCD控制器的结布光。其各个讯号描述及功能如表1所示。2.2Framebutfvr概述Framebuffer即帧缓冲,是图形设备的一个提取或具象,他把一些视频设备描摹成一个缓冲区,容许应用程序通过Framebuffer所定义的良好插口访问图形设备。Framebuffer是出现在Linux2.2.xx内核当中的一种驱动程序插口。Linux工作在保护模式下,所以用户态进程未能像DOS那样使用主板BIOS供的中断调用来实现直接写屏,Linux具象出Framebuffer这个设备供用户态进程实现直接写屏。Framebuffer机制模仿主板的功能,将主板硬件结构具象化linux lcd驱动模块,可以通过Framebuffer的读写直接对内存进行操作。用户可以将Framebuffer看成是显示显存的一个映像,将其映射到进程地址空间以后,就可以直接进行读写操作,而写操作可以立刻反应在屏幕上。
这些操作是具象、统一的,用户毋须关心化学内存的位置、换页机制等具体细节,这种由Framebuffer设备驱动完成。2.3驱动程序设计与实现2.3.1LCD驱动的模块加载与卸载LCD作为一个相对独立的硬件单元,被认定为平台设备,在驱动模块加载和卸载函数中,就分别注册和注销对应的platform_driver。2.3.2LCD驱动的侦测与移除函数侦测函数probe主要完成LCD控制器初始化的工作,包括对fb_info结构成员的初始化、内存分配、寄存器的配置、Framebuffer的注册等。模块卸载函数中对平台驱动的注销会造成其中移除函数的执行,这个函数释放显示缓冲区并注销帧缓冲设备。2.3.3LCD驱动的fb_ops成员函数在程序设计里,定义LCD驱动的fb_ops结构体和相关函数功能如下所示可以看出,fb_ops()结构体类似于file_operations()结构体,提供了一个帧缓冲设备的统一插口。s3c2410_ops()函数给出了标准插口到针对具体硬件操作函数的跳转表针。2.3.4Framebuffer设备驱动程序的设计驱动程序主要完成的工作有以下5部份:(1)编撰初始化函数Framebuffer驱动首先要初始化LCD控制器,通过相关寄存器来设置LCD相对应的显示模式和颜色数,之后分配显示缓冲区。
一般用vmall-oc()函数分配一段连续空间,缓冲区的大小可以用“点阵行数点阵列数一个象素的位数/8”计算得到。假如使用模块化加载形式,加载LCD驱动模块时,系统调用fb_init()函数。卸载LCD驱动模块时,系统首先调用unregister_framebuffer()取消注册,之后释放显示缓冲区的显存。(2)编撰成员函数主要负责编撰fb_ops()对应的底层操作函数。(3)读/写(read/write)完成对帧缓冲区的读写操作。(4)映射(map)Linux有内核空间和用户空间,平常工作在保护模式,每位应用程序进程都有自己的虚拟地址空间linux lcd驱动模块linux cp,应用程序不能直接访问数学缓冲地址。并且,Linux文件操作插口(file_operations)中提供了地址映射(mmap)操作,它可以将文件的内容映射到用户空间,这样用户就可以通过读写这段地址来访问缓冲区,并在屏幕上绘图。(5)输入/输出控制设备文件的ioctl()调用可以读取和设置显示设备的参数,如码率、支持颜色数、屏幕大小等。结束语在编写完驱动程序后,将该驱动程序以加载模块的形式进行编译,并将编译好的LCD设备驱动下载到目标板上linux 内核,通过编撰一个简单的测试Framebuffer设备驱动的应用程序,实现了设备的打开、关闭、内存映射和iotcl等具体操作,完成了在LCD液晶屏不同行上勾画不同颜色,通过编译此程序,在目标板上运行,即可在LCD上显示彩色碎花,这就完成了驱动程序的设计要求。相关文章推荐阅读:网路机顶盒哪些牌子好网路机顶盒哪些牌子好