版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 可修改 欢送下载 精品 Word 可修改 欢送下载 精品 Word 可修改 欢送下载 精品 WordS3C2440A下彩色(cis)液晶显示器的设计嵌入式系统已成为当今(dngjn)最热门的概念之一,对大多数嵌入式系统(xtng)开发者而言,显示系统的硬件和软件开发是不可回避(hub)的关键性技术。三星公司开发的S3C2440A是一款以ARM920T为内核(ni h)的嵌入式微处理器,它的最高工作频率达533MHz,内含3通道的异步串行口,USB主、从单元设备接口,摄像头接口,触摸屏接口,LCD控制器等众多片上外设接口,且具低功耗、高性能,广泛适用于PDA、便携式媒体播放器、手持式导航仪等领
2、域。目前国内对该款高性价比嵌入式微处理器的开发应用才起步不久。 夏普公司生产的LCD屏LQ035Q7DH01为3.5in透反射式TFT-LCD显示器,屏幕分辨率为320240,能提供262144种色彩,显示亮度到达100nit,使设计人员能够在各种照明条件下利用它来生动地展示图像和文字信息。本文以S3C2440A和LQ035Q7DH01为硬件根底,设计了显示硬件电路。 软件平台采用Linux 2.4.20, 交叉编译器为arm-linux-gcc 2.95.3,完成了对LQ035Q7DH01显示屏的驱动程序开发。 以三星公司的嵌入式微处理器S3C2440A和夏普公司3.5inLCD屏LQ035
3、Q7DH01为根底,设计了显示硬件电路,介绍了帧缓冲设备的处理机制及底层驱动的接口函数,针对本显示系统给出了如何开发其Linux帧缓冲设备驱动程序。不管是显示硬件电路还是软件驱动程序,都有很强的可移植性,可以方便地移植到不同的平台。1显示系统硬件电路1.1 LCD控制器电路 LCD控制器用来传输图像数据并产生相应的控制信号,S3C2440A LCD控制器能支持高达4K色STN屏和256K色TFT屏,支持1024768分辨率下的各种液晶屏, 具有LCD专用DMA。LCD控制器产生的控制信号和数据信号主要有:VFRAME:LCD 控制器和LCD驱动器之间的帧同步(tngb)信号, LCD控制器在一
4、个完整帧显示完成(wn chng)后插入一个VFRAME信号(xnho),开始(kish)新一帧的显示。 VLINE:LCD控制器和LCD驱动器之间的行同步(tngb)信号,LCD控制器在整行数据移入LCD驱动器后插入一个VLINE信号。 VCLK:LCD控制器和LCD驱动器之间的像素时钟信号, 由LCD控制器送出的数据在VCLK的上升沿处送出,在VCLK的下降沿处被LCD驱动器采样。 VM:数据输出使能信号,在VM 信号跃变成高电平后行数据信号开始由LCD控制器输出至LCD驱动器,当VM信号跃变为低电平后数据输出停止。 数据线:也就是RGB信号线,S3C2440A LCD控制器有VD0:23
5、共24根数据线,数据格式不同,接线方式就不同。本文用的是RGB565方式,只需要16根数据线(红色5根,绿色6根,蓝色5根)。其数据线接线方式如表1所示:LCD控制器电路(dinl)如图1所示:1.2 时序(sh x)和数据匹配电路 由于(yuy)S3C2440A 的LCD控制器与LCD屏LQ035Q7DH01在数据格式及显示(xinsh)时序上无法匹配,需要(xyo)选用一种时序控制IC或者用CPLD(也就是通常所说的LCD伴侣芯片)来对不同数据格式的数据接口进行映射。但CPLD面积较大、本钱较高,因而通常只在需要对电路进行灵活配置的情况下才使用。本文时序控制IC选用夏普公司的LZ9FC22
6、。该芯片专用于对TFT型QVGA屏幕(屏幕分辨率320240)的LCD进行时序控制。这是一个18bit(R6G6B6)的控制器,由于本文采用的是RGB565 16位工作模式,所以将其输入引脚R0和B0接地。时序和数据匹配电路如图2所示:1.3 多路电压(diny)产生电路 LCD屏内集成(j chn)有数字电路和模拟电路,需要外部提供(tgng)数字电压和模拟电压。另外,为了(wi le)完成数据扫描,需要(xyo)TFT轮流开启/关闭。当TFT开启时,数据通过源极驱动器加载到显示电极,显示电极和公共电极问的电压差再作用于液晶实现显示,因此需要控制LCD的开启电压、关闭电压,以及加到公共电极上
7、的电压, 本系统采用松下公司生产的芯片LM1117DT-3.3来产生LCD所需要的数字电压,采用美国MAXIM 公司推出的有源矩阵液晶显示器电源芯片MAX1664来产生其他电压,MAX1664内部集成有两个DC-DC变换器,可以为小型TFT LCD提供高效的调节电压。LCD所需各电压如表2所示:多路电压产生电路如图3所示1.4 显示驱动和LQ035Q7DH01的接口电路显示驱动和LQ035Q7DH01的接口电路如图4所示:1.5 显示系统整体结构框图显示系统整体结构框图如图5所示。图5 显示系统结构框图2 Linux下的帧缓冲(hunchng)(frame buffer)设备(shbi) Li
8、nux下编写显示设备的驱动程序有两种方法:一种是把显示设备抽象(chuxing)成一般的字符设备,驱动程序的写法和一般的字符设备(shbi)驱动类似;第二种就是帧缓冲设备(shbi)驱动程序的编写。由于第一种方法不标准,而且实现功能有限,故一般不提倡;而帧缓冲驱动程序比拟简单,也容易实现,因而在嵌入式系统里得到了广泛应用。 帧缓冲设备是一个提供显示内存和显示芯片存放器从物理内存映射到进程地址空间中的设备,是Linux为图形设备提供的一个抽象接口,它将显示设备抽象为帧缓冲区。帧缓冲允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。这种操作是抽象的、统一的。应用程序不必关心物理显存的位置、
9、换页机制等等具体细节。 帧缓冲设备属于字符设备,采用“文件层-驱动层的接口方式。 Linux内核include/fnux/fb.h中定义了帧缓冲设备的驱动层接口fb_info结构体,fb_info定义了当前工作的显示卡的状态和帧缓冲设备的操作函数, 它仅对内核可见。文件fb.h中还定义了fb_var_screeninfo(显示卡可变特性,这些特性在程序运行期间可以由应用程序动态改变)、fb_fix_screeninfo(显示卡不可变特性,这些特性在硬件初始化时就被定义了, 以后不得修改)、fb_cmap(RGB颜色映射表)等结构体,帧缓冲设备驱动程序主要依靠这几个结构体工作。除了结构体fb_i
10、nfo只能在内核空间访问外,其他三个结构体都可以在用户空间访问。 Linux内核driversvideofbmem.c中定义了帧缓冲设备的文件层接口file_operations结构体,它对应用程序可见,结构体中功能函数open()和release()不需要底层的支持.而read()、write()、mmap()那么需要调用fb_get_fix()、fb_get_var()、fb_set_var()、fb_get_cmap、fb_set_cmap()(这些函数位于结构体fb_info中指针fbops指向的结构体变量中)等与底层LCD硬件相关的函数的支持。另一个功能函数是ioctl(),ioct
11、l()是设备驱动程序中对设备的I/O通道进行管理的函数,应用程序通过ioctl()系统调用来调用fb_get_fix()、fb_get_var()、fb_set_var()、fb_set_cmap()、fb_get_cmap()等来获得和设置结构体fb_info中fb_var_screeninfo结构变量var、fb_fix_screeninfo 结构变量fix 和fb_cmap结构变量cmap等变量的信息。在fbmem.c中给出了ioctl()命令和fb_info中结构体fb_ops的成员函数的对应关系如下:FBIOGET_VSCREENINFO fb_get_varFBIOPUT_VSCR
12、EENINFO fb_set_varFBIOGET_FSCREENINFO fb_get_fixFBIOPUTCMAP fb_set_cmapFBIOGETCMAP fb_get_cmap用户应用程序只需要调用FBIOXXXX来操作LCD硬件。 文件fbmem.c中还定义了帧缓冲设备底层驱动的管理函数:register_framebuffer(struct fb_info 3 fb_info)unregister_framebuffer(struct fb_info 3 fb_info) 帧缓冲设备在驱动层所要做的工作仅仅是对Linux为帧缓冲的驱动层接口fb_info进行初始化.然后调用这两
13、个函数对其注册或注销。帧缓冲设备驱动层接口直接对LCD设备硬件进行操作,而fbmem.c可以记录和管理多个底层设备驱动。3 显示系统帧缓冲(hunchng)驱动的编写3.1 定义(dngy)LCD控制器结构(jigu)体 前面(qin mian)已经说过,LCD控制器的功能是传输图像数据并产生相应的控制信号(xnho)来驱动LCD显示器,驱动程序需要根据当前具体显示硬件的特性,通过读写一系列的LCD控制存放器来完成设定显示器分辨率和显示数据的格式,设置控制信号时序,指定显示缓 中区地址等,从而提供应显示设备适宜的数据信号和控制信号。文中根据需要为S3C2440A的LCD 控制器定义了一个专用结
14、构体s3c2440fb_mach_info:struct s3c2440fb_mach_infou_long pixclock; /* 像素时钟频率 */u_char bpp; /* 每像素需要的bit数 */u_short xres; /* 显示器行分辨率 */u_short yres; /* 显示器列分辨率 */u_char hsync_len; /* 行同步信号的长度 */u_char vsync_len; /* 帧同步信号的长度 */u_char left_margin;/* 从本行图象数据输出结束到下一行的行同步信号开始之间的像素时钟数 */u_char right_margin;
15、/* 从行同步信号结束到该行的图象数据开始输出之间的像素时钟数*/u_char upper_margin;/*从本帧图象数据输出结束到下一帧的帧同步信号开始之间的无效行数 */u_char lower_margin; /*从帧同步信号结束到该帧图象数据开始输出之间的无效行数*/u_char sync;struct s3c2440fb_lcd_reg reg; /*S3C2440ALCD控制存放器结构体 */; 驱动程序通过定义一个s3c2440fb_mach_info结构变量并给该变量赋值来完成LCD控制器的初始化。3.2 编写结构体fb_info中fb_ops对应的成员函数 对于本嵌入式系统
16、的实现,需要以下5个函数static struct fb_ops s3c2440fb_ops=owner:THIS_MODULE,/*THIS_MODULE宏用来防止驱动模块在使用状态下被卸载 /fb_get_fix:s3c2440fb_get_fix,fb_get_var:s3c2440fb_get_var,fb_set_var:s3c2440fb_set_var,fb_get_cmap:s3c2440fb_get_cmap,fb_set_cmap:s3c2440fb_set_cmap,;结构体fb_ops在Linux内核include/linux/fb.h中定义。 这些函数都是用来设置和获
17、取驱动层接口fb_info结构体中的成员变量的,前文已提过当应用程序对设备文件进行ioctl操作时会调用它们。对于fb_get_fix()和fb_get_var()应用程序传入的是fb_info中的结构变量fix和var,fb_set_var()函数那么是对var变量进行设置。同样fb_get_cmap()和fb_set_cmap()那么是对结构变量cmap内容进行读取和设置。在这5个函数中,fb_set_var()设置了显示设备的显示模式,是最重要的一个函数。文中根据需要为当前显示硬件定义一个专有结构体s3c2440fb_info,该结构体包括一个fb_info结构变量,及其它与所选LCD硬
18、件有关的所有参数.因此结构体fb_ops中成员函数对结构体fb_info的操作实际上就是对结构体s3c2440fb_info的操作。该结构体定义如下:struct s3c2440fb_infostruct fb_info fb; /* fb_info结构变量 */signed int currcon; /* 当前终端控制台的序号*/u_int max_xres;/*屏幕能显示的最大行分辨率 */u_int max_yres;/* 屏幕能显示的最大列分辨率 */struct s3c2440fb_lcd_reg reg;/*S3C2440A LCD控制存放器 */* 其他与LCD硬件有关的参数 *
19、/;结构体fb_ops中的成员函数流程相似,本文在此仅给出函数s3c2440fb_set_var()的流程图和程序代码。函数s3c2440fb_set_var()流程图如图6所示:static struct fb_ops s3c2440fb_ops=owner:THIS_MODULE,/*THIS_MODULE宏用来防止驱动模块在使用状态下被卸载 /fb_get_fix:s3c2440fb_get_fix,fb_get_var:s3c2440fb_get_var,fb_set_var:s3c2440fb_set_var,fb_get_cmap:s3c2440fb_get_cmap,fb_set
20、_cmap:s3c2440fb_set_cmap,;结构体fb_ops在Linux内核include/linux/fb.h中定义。 这些函数都是用来设置和获取驱动层接口fb_info结构体中的成员变量的,前文已提过当应用程序对设备文件进行ioctl操作时会调用它们。对于fb_get_fix()和fb_get_var()应用程序传入的是fb_info中的结构变量fix和var,fb_set_var()函数那么是对var变量进行设置。同样fb_get_cmap()和fb_set_cmap()那么是对结构变量cmap内容进行读取和设置。在这5个函数中,fb_set_var()设置了显示设备的显示模式
21、,是最重要的一个函数。文中根据需要为当前显示硬件定义一个专有结构体s3c2440fb_info,该结构体包括一个fb_info结构变量,及其它与所选LCD硬件有关的所有参数.因此结构体fb_ops中成员函数对结构体fb_info的操作实际上就是对结构体s3c2440fb_info的操作。该结构体定义如下:struct s3c2440fb_infostruct fb_info fb; /* fb_info结构变量 */signed int currcon; /* 当前终端控制台的序号*/u_int max_xres;/*屏幕能显示的最大行分辨率 */u_int max_yres;/* 屏幕能显示
22、的最大列分辨率 */struct s3c2440fb_lcd_reg reg;/*S3C2440A LCD控制存放器 */* 其他与LCD硬件有关的参数 */;结构体fb_ops中的成员函数流程相似,本文在此仅给出函数s3c2440fb_set_var()的流程图和程序代码。函数s3c2440fb_set_var()流程图如图6所示:图6 函数s3c2440fb_set_var()流程图函数s3c2440fb_set_var()程序如下:static int s3c2440fb_set_var(struct fb_var_screeninfo *var,int con,struct fb_in
23、fo *info)struct s3c2440fb_info *fbi= (struct s3c2440fb_info *)info; /* 将显示模式读入结构体s3c2440fb_info*/struct fb_var_screeninfo *dvar= get_con_var(&fbi-fb,con);int err;err= s3c2440fb_validate_var(var,fbi); /* 显示模式是否有效 */if(err) /* 无效返回 */return err;dvar-red=fbi-rgbrgbidx-red; /* 将显示参数写入结构体fb_var_screeninf
24、o */dvar-green=fbi-rgbrgbidx-green;dvar-blue=fbi-rgbrgbidx-bIue;dvar-transp=fbi-rgbrgbidx-transp;display-var= *dvar;s3c2440fb_hw_set_var (dvar,fbi); /* 设置RGB颜色信息,设置S3C2440A的LCD控制存放器 */return 0;3.3 编写初始化函数 初始化函数首先初始化LCD控制器和结构体s3c2440fb_info,填充s3c2440fb_info中结构变量fb_info的成员变量,这些成员变量的参数值由LCD显示器厂商的手册获得。然
25、后通过consistent_alloc函数分配一片连续的空间。显示系统采用的LCD显示方式为320240,16位彩色。需要分配的显示缓冲区为32024016/8=150k字节,缓冲区通常分配在片外SDRAM 中,起始地址和末地址保存在LCD控制器存放器LCDSADDR1和LCDSADDR2里,最后调用register_framebuffer(&fbi-fb)将fb_info结构变量fb登记入内核。初始化函数如下:int _init s3c2440fb_init(void)(struct s3c2440fb_info *fbi;int ret;fbi=s3c2440fb_init_fbinfo(
26、); /* 初始化LCD控制器和s3c2440fb_info */ret=s3c2440fb_map_video_memory (fbi); /*分配150K字节大小的LCD显示缓冲区 */if(ret) /* 出错返回 */if(fbi)kfree(fbi);return ret;s3c2440fb_set_var (&fbi-fb.var,-1,&fbi-fb);ret=register_framebuffer(&fbi-fb);/* 将fb注册到内核 */if(ret) /* 出错返回 */if(fbi)kfree(fbi);return ret;printk (Installed S3
27、C2440 frame bufferkn);/*在控制台显示安装显示驱动程序成功 */MOD_INC_USE_COUNT;/* 该宏用来管理自己被使用的计数,模块在被使用时,是不允许被卸载的 */return 0;4 驱动(q dn)程序嵌入(qin r)到内核 驱动程序嵌入到内核有两种方式(fngsh):一种是直接编译入内核,随Linux启动(qdng)的时候加载;另一种(y zhn)是编译成模块,动态加载。如果要将其直接编译入Linux内核,那么需要将源代码文件拷贝到Linux内核源代码的相应路径里,并修改Makefile文件和config.in文件,这种方法会增加内核的大小,而且不能动态
28、卸载,不利于调试,所以目前一般推荐采用第二种方式,如果这样,在本驱动程序的最后还需要加上宏module_init(s3c2440fb_init);这是告诉编译器该驱动程序的入口地址为初始化函数s3c2440fb_init()。需要注意的是初始化函数必须在宏module_init(s3c2440fb_init)使用前定义,否那么会出现编译错误。而且在编译时至少要加上-D_KERNEL_ -DMODULE -DLINUX这几个参数,编译完成后通过insmod命令将驱动模块加载进内核, 通过rmmod命令卸载驱动模块。5 应用程序对帧缓冲设备的使用 Linux将所有的设备都当作文件进行处理,各种设备通常以文件的形式放在/dev目录下。帧缓冲设备和其它位于/dev目录下面的设备类似,其驱动程序的设备文件一般是/dev/fb0、/dev/fb1等等。在应用程序中,操作/dev/fb的一般流程如图7所示:图7 应用程序对帧缓冲设备的操作流程其典型应用程序如下:Main()int fbfd=O;struct fb_var_screeninfo vinf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电气生产课程设计
- 戴头盔系安全带宣传横幅标语
- 幼儿园小电筒课程设计
- 2024年导游服务合同范本旅游企业导游人员考核标准3篇
- 2024年新型城镇化建设项目政府采购合同模板范本2篇
- 捐赠仪式学生代表发言稿8篇
- 2024年城乡绿化一体化造林合作合同3篇
- 招生方案集合6篇
- 中秋节周记范文汇编七篇
- 2025年山东淄博市周村区卫生健康系统事业单位长期招聘23人历年管理单位笔试遴选500模拟题附带答案详解
- 2024-2025学年寒假致学生家长的一封信(安全版)
- 人才引进政策购房合同模板
- 《两用物项证》课件
- 《电梯维保规则》课件
- DB54T 0425.1-2024 公共数据 数据元规范 第一部分:总则
- 江苏省泰州市2023-2024学年高一上学期期末语文试题及答案
- 2024年高考政治选必二《法律与生活》重要知识问题梳理总结
- 孕早期nt检查课件
- 【MOOC】工程制图解读-西安交通大学 中国大学慕课MOOC答案
- 期末复习(试题)-2024-2025学年三年级上册数学苏教版
- 检验科新进人员岗前培训
评论
0/150
提交评论