基于linux的LCD驱动研究与实现.doc_第1页
基于linux的LCD驱动研究与实现.doc_第2页
基于linux的LCD驱动研究与实现.doc_第3页
基于linux的LCD驱动研究与实现.doc_第4页
基于linux的LCD驱动研究与实现.doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学号毕业设计(论文)题目:基于Linux的LCD驱动研究与实现作 者 尹斌斌 届 别 2011 届 学 院 信息与通信工程学院 专 业 电子信息工程 指导教师 邓 己 媛 职 称 讲 师 完成时间 2011年5月14日 湖南理工学院毕业设计(论文)摘要TFT-LCD由于其工作电压、功耗低、无辐射、寿命高、轻巧方便、易于实现大规模生产等一系列优点,率先进入显示器市场并逐步成为LCD显示领域的主流产品。本文就是对基于ARM控制器的LCD驱动原理进行了深入研究,并在Linux操作系统下实现LCD驱动及其图像显示。文章首先说明了LCD显示驱动原理,再剖析了Linux内核设备管理机制,指出驱动的实现是以linux的设备模型为基础,用抽象的平台总线去挂接设备和驱动,使两者关联起来,然后针对具体的LCD设备对驱动做了相应配置,编写了测试程序。测试结果表明,将各种图像文件转换为二进制文件写到framebuffer,便可在LCD上显示图形,至此就完成了LCD驱动设计,而且该驱动程序具有较好的移植性特点。关键词:TFT-LCD;Linux;ARM;设备;驱动 ABSTRACTWith the characteristics of low driving voltage, little consumption, non x ray radiation, long life,light, probable and apt to realize mass production, TFT-LCD has dominated the market of LCD gradually. This article is based on the ARM controller for LCD driving principle in-depth study and LCD driver and image display are achieved in the Linux operating system. The page, at first,describes the principle of LCD driver display and further analysis of the Linux kernel device management system. The realization of drives based on Linux device model utilizes abstract platform bus to the attached device and drive in order to associate each other. Then accord to the LCD device-specific, the appropriate configuration of drivers is done and a test program is prepared. The results show that after the image file is converted to a binary file and then written to framebuffer, the graphics can be displayed on the LCD. At this point, the design of LCD driver is completed and the driver has good portability feature.Key words: TFT-LCD;Linux ;ARM ;device ;driver目 录摘要IABSTRACTII目 录III一 引言1二 S3C2440 LCD控制器22.1 LCD和S3C2440的LCD控制器介绍22.1.1LCD(Liquid Crystal Display)显色原理22.1.2 LCD的种类及优点22.2LCD的显示接口32.3 LCD显示器上的数据组织格式32.4 S3C2440的LCD控制器4三 Linux操作系统概述73.1 操作系统基本概念73.2 linux内核系统与LCD驱动83.2.1 linux内核子系统与LCD驱动的关系83.2.2 LCD驱动与linux系统调用93.3 编写LCD驱动需要的软件与指令103.3.1 常用软件103.3.2 常用指令103.3.3 嵌入式系统中的交叉编译113.3.4 make工具与makefile规则113.4 本章小结12四 Linux的设备管理机制134.1 Linux下的模块机制134.1.1 模块机制134.1.2 为什么要使用模块机制134.1.3 模块的优缺点144.1.4 内核模块的调入144.2 linux下设备驱动144.3 LCD驱动中的file_operation结构144.4 linux 2.6内核的设备模型154.4.1 kobject介绍154.4.2 kset结构体164.4.3 总线、设备、驱动结构体介绍164.5 LCD驱动与平台设备(platform device)18五 LINUX下LCD驱动实现215.1 帧缓冲(framebuffer)介绍215.2 LCD驱动中相关的结构体介绍215.3 LCD驱动实现225.4 用户图形测试函数的编写245.5测试结果24六 设计总结27致谢28参考文献29附录3037一 引言现今电子技术日异月新,促使显示器技术迅猛发展,从传统的CRT直接飞越到LCD。LCD的出现,一方面,不仅给众多企业带来了新的市场导航。另一方面,也开始改变着大众的审美观。对企业来说,想在LCD市场处于领先地位,不仅要生产出美观、 精致、 稳定的LCD,也要生产出高性能、 低功耗、 环保型的LCD。就目前来说,LCD有多种类型,比如STN、TFT、LTPS、OLED等。LCD应用领域已经相当广泛,无论是高精尖的军工领域、航空航天领域、还是我们身边的手机电话、PDA、数码相机、家用电器等等,都用到了LCD。与此同时,嵌入操作系统得到越来越广泛的应用。以前的嵌入式系统相对比较简单,往往只有一个很小的芯片,程序固化在产品的内部,完成相对简单的功能,交互性较低。随着人们对嵌入式系统的需求越来越多,所需的功能也逐渐增多,因此,嵌入式系统也具有了更强的交互性。为了更加便利的对系统进行个性化的设置,需要用户与系统有相应的交互,那么,就需要将交互过程可视化。因此,越来越多的嵌入式系统就配备了LCD。一方面可以提高系统的交互性,另一方面,也为多媒体技术的应用带来了更广阔的空间,无论是MP3、MP4。甚至我们每个人的手机,都有液晶显示屏,LCD显示技术,给我们带来了更加丰富多彩的生活。Linux操作系统有许多优点,最重要的就是它的内部实现细节对所有人都是公开的。以前,操作系统的代码仅仅掌握在少数程序员手里,但是,linux使我们只要具备必要的技术能力,就可以方便的验证、理解、修改、移植操作系统,或者其中一部分。设备驱动程序在linux内核中扮演着重要的角色。它们使某个特定硬件响应一个定义好了的内部编程接口,这些接口完全隐藏了设备的工作细节。用户的操作通过一组标准化的调用来执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,这就是驱动程序的主要任务。这些接口可以使驱动程序独立于内核的其他部分而建立,以模块的形式,在需要的时候动态的加载到内核,在不需要的时候从内核移除。任何智能设备都离不开MPU,在MPU的选择方面,要求有体积小、低功耗、价格低廉、主频高。而ARM体系结构的MPU完全具备以上要求,所以ARM处理器在智能设备有着相当的市场。由于LCD的大量需求,以及linux操作系统众多的优点。因此,本课题的设计选择了以linux作为嵌入式设备的操作系统,研究和实现基于ARM的LCD驱动程序。二 S3C2440 LCD控制器在本章中主要介绍S3C2440LCD寄存器的配置,主要是S3C2440 LCD控制器的控制信号以及了解像素数据在内存中的组织形式,在课题中用16(5:6:5)色深来显示。另外也对LCD的显色原理做了简要介绍。2.1 LCD和S3C2440的LCD控制器介绍在本课题中只要根据S3C2440 的datasheet对LCD控制器的寄存器做相应的配置,就可以用相应的信号去驱动LCD来显示颜色或者图片,现介绍如下。2.1.1LCD(Liquid Crystal Display)显色原理液晶的物理特性:它的分子晶体,以液态存在而非固态,这些晶体分子的液体特性使得它非常有用。1、如果让电流通过液晶层,这些分子将会以电流的流向方向进行排列,如果没有电流,它们将会彼此平行排列。2、如果提供了带有细小沟槽的外层,将液晶倒入后,液晶分子会顺着槽排列,并且内层与外层以同样的方式排列。3、液晶层可以使光线发生扭转。在这方面有点类似于偏光器,这也就意味着能够过滤那些从特定方向之外射入的光线。此外,如果液晶层发生了扭转,光线也会随着扭转,以不同的方向从另外一个方向射出。液晶的这些特性使得它可以用来当作一种开关-既可以阻碍光线通过,也可以允许光线通过。LCD显示器的基本原理就是可以通过给不同的液晶单元供电,控制光线的通过与否,从而达到显示的目的。因此,LCD的驱动控制归于对每个液晶单元的通断电控制,每个液晶单元都对应着一个电极,对其通电,便可使光线通过。从而显示出不同的图像。2.1.2 LCD的种类及优点LCD的种类有多种,比如STN、TFT、LTPS、OLED等,各有优缺点。STN(Super,Twisted Nematic),有CSTN和DSTN之分,是比较低端的一种,仅有的优点是低功耗,色彩鲜艳度和画面亮度不是很好,响应时间长达200ms左右,播放动画或视频托影非常明显。TFT(Thin Film Transistor)可以大大缩短屏幕响应时间,其响应时间已经小于80ms,有较强的动画播放力,是目前比较主流的液晶显示类型,不仅在MP3、MP4产品上大量应用,而且在桌面液晶显示器、笔记本电脑、手机等产品上应用也非常普遍。LTPS(Low Temperature Polycrystalline silicon)由TFT衍生而来,可以获得更高的分辨率和丰富分色彩。响应时间仅12ms。可视度170度。OLED(Organic Light Emitting Diode)各种物理特性都具有优势,色彩明亮,可视度大,非常省电,是未来发展的主流。只是目前受技术和成本的限制,未能广泛普及。总之LCD显示器具有轻薄,低能耗,辐射小等众多优点,市场的占有率越来越大。2.2LCD的显示接口CPU或者显卡发出来的图像数据TTL信号(05v),LCD本身接收的也是TTL信号。由于TTL信号在高速率的长距离传输时性能不佳,抗干扰能力也比较差,后来又提出了多种接口,比如LVDS 、TDMS 、GVIF 等等。它们实际上只是将CPU或者显卡发出的TTL信号编码成各种信号以便使能,在LCD那边将接受到的信号解码成TTL信号。由于数字接口标准尚未统一,所以使用LCD时要根据手册了解具体的接口定义。对于 TFT LCD 的TTL信号如下表2.1,其数据线多达24根,对应像素中的每一位。 表2.1 LCD时序信号信号名称描述VSYNC垂直同步信号HSYNC水平同步信号HCLK像素时钟信号VD23:数据信号LEND行结束信号PWREN电源开关信号2.3 LCD显示器上的数据组织格式对于屏幕上的一整幅图像被称为一帧(frame),每帧由多行组成,每行由多个像素组成,每个像素的颜色由若干数据位表示。对于单色显示器,每位像素使用一位表示,称为1BPP;对于256色显示器,每个像素使用8位来表示,称为8BPP。显示器从屏幕的左上方开始,一行一行地取每个像素的数据并显示出来,当显示到一行的最右边时,跳到下一行的最左边开始显示下一行;当显示完所有的行后,跳到左上方开始的地方开始下一帧。显示器沿着“Z”字的路线进行扫描,使用VSYNC、HSYNC信号来控制扫描路线的跳转。HSYNC表示开始下一行的扫描,VSYNC表示开始下一帧的显示。在工作中的显示器上,可以在四周看见黑色的边框;上方的黑框是因为当发出VSYNC信号后还要经过若干行有效的像素行才出现,下方的黑框是因为当显示完所有的数据时,VSYNC信号还没有发出,而这时显示器还没有扫描到最下边,左边的黑框是因为当HSYNC信号发出时,还要经过若干时间有效像素才出现,右边的黑框是因为显示器还没有扫描到最右边时,数据已经无效。VSYNC信号表示一秒内能够显示多少帧图片,称为帧频率,HYSNC表示水平频率。2.4 S3C2440的LCD控制器S3C24440LCD控制器能够产生显示LCD的必要信号。VSYNC信号有效时表示一帧数据的开始。VSPW表示VSYNC信号的脉冲宽度为VSPW+1个HSYNC信号周期,也即HSYNC行的数据无效。VBPD表示在VSYNC信号有效后还要经过VBPD+1个HSYNC信号周期,有效的行数据才出现。最后连续发出LINEVAL+1行数据。VFPD表示最后的无效数据行。HSYNC表示有效像素行的出现。同理也要经过(HSPW+1)+(HPBD+1)个VCLK信周期有效数据才真正出现。最后连续发出HOZVAL+1个像素。1.LCD控制器中REGBANK的17个寄存器可以分为6种, 如表2.2所示。表2 .2 LCD寄存器组名称说明LCDCON1LCDCON5用于选择LCD类型,设置各类控制信号LCDSADDR1LCDSADDR3用于设置帧内存地址TPAL临时调色板寄存器LCDINTPND、LCDSRCPND、LCDINTMSK用于LCD的中断控制 在LCD驱动中没有用到中断REDLUT、GREENLUT、BLUELUT、DITHMODE专用于STNLCD。在本课题中没有用到TCONSEL专用于SEC TFTLCD,在本课题中没有用到2.对于TFT-LCD一般情况下只要设置前两种寄存器;下面分别介绍:LCDCON1用于设置LCD类型,设置像素时钟,使能LCD信号的输出等。 表2.3 LCDCON1寄存器标识符位功能说明LINECNT27:18只读,每输出一个有效行其值减一,从LINEVAL减到0CLKVAL17:8用于设置VCLK,对于TFT-LCD VCLK=HCLK/(CLKVAL+1)*2)MMODE7 设置VM信号的反转频率,TFT-LCD不用PNRMODE6:5 设置LCD的类型,0b11为TFT-LCDBPPMODE4:1设置像素色深 ;本课题为16bppENVID0LCD信号输出使能位,1使能表2.4 LCDCON2 寄存器标识符位功能说明VBPD31:24VSYNC信号之后还要经过(VBPD+1)个HSYNC周期,有效数据才出现LINEVAL23:14LCD的垂直宽度:(LINEVAL+1)行VFPD13:6一帧有效数据完结后,到下一个VSYNC的无效行数:VFPD+1VSPW5:0表示VSYNC从信号脉冲宽度,期间数据无效表2.5 LCDCON3寄存器标识符位功能说明HBPD25:19HSYNC信号脉冲之后,无效的像素个数HOZVAL18:8LCD的水平宽度HFPD7:0一行有效数据结束后的无效像素个数LCDCON4用来设置HSYNC信号的脉冲宽度,位7:0的数值称为HSPW,表示脉冲宽度为(HSPW+1)个VCLK周期,在此不在详细介绍。LCDCON5用来设置各个控制信号的极性,并可以读到一些状态信息。下面介绍主要的标识符位:表2.6 LCDCON5寄存器标志位位功能说明BPP24BL12 设置TFT-LCD显示模式为24BPP时,一个4个字节中哪个三个字节有效。0表示低地址有效FRM56511 设置TFT-LCD的显示模式为16BPP时,使用的数据格式INVVCLK10设置VCLK信号的有效沿的极性帧内存寄存器地址寄存器LCDSDDR1LCDSADDR3,帧内存可以很大,而真正要显示的区域称为视口(view point),它处于帧内存之内。在本课题中帧内存和视口的大小一样,也就是OFFSIZE=0;主要控制寄存器介绍如表2.7,2.8, 2.9所示。表2.7 LCDSADDR1寄存器标志位位功能说明LCDBANK29:21 用来保存帧内存起始地址A30:22,且地址必须4MB对齐LCDBASEU20:0对于TFT-LCD,用来保存视口所对应的内存起始地址A21:1,这块内存也成为LCD的framebuffer表2.8 LCDSADDR2寄存器标识符位功能说明LCDBASEL20:0对于TFT-LCD用来保存LCD帧缓存去结束地址A21:1, LCDBASEL=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)表2.9 LCDSADDR3寄存器标志位位功能OFFSIZE21:11表示上一行数据与下一行数据的地址差,单位是半字PAGEWIDTH10:0视口的宽度,以半字为单位。三 Linux操作系统概述3.1 操作系统基本概念【1】操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。操作系统是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。Linux是赫尔辛基大学的linus Torvalds于1990年开发的。刚开始只是个人爱好而开发,但后来它逐渐发展成有自己版权的操作系统,linux最吸引人的地方是它不是商业操作系统,它的源代码在GNU公共许可证下是开放的,任何人都可以获得源代码并研究它,只要你有源代码就可以从用户接口层到与硬件相关的操作系统核心层去探索。这就是linux最让人看好的地方。本论文中所使用的linux版本是2.6.30.4,linux内核的目标是遵循IEEE POSIX标准。这意味着在linux操作系统下很容易编译和运行目前大多数的UNIX程序,只需要少许的修改就可以。linux使用了两种特权模式,用户空间和内核空间。linux的一些特点如下:1、单块结构的内核:它是一个庞大的,复杂的程序,由几个逻辑上独立的成分构成。在这点上,和其他类UNIX操作系统相同。2、编译并静态链接:大部分现代操作系统都可以动态的卸载和装载部分内核代码,通常把这部分代码称作模块(module)linux对模块有较好的支持,因为它能自动的装载和卸载模块。而在商业的UNIX操作系统的变体的中,只有部分支持动态加载模块。3、内核线程:linux内核被组织成内核线程(kernel thread)。内核线程是一个能被CPU独立调度的单位,在内核和用户空间都有线程的概念。使用线程的优点在于,当发生上下文切换时比普通进程的切换花费的代价要少很多,因为线程通常在同一个地址空间执行。线程就是内核的一个执行流,这些线程共享进程的大部分数据结构。一个多线程内核程序由很多轻量级的进程组成,他们共享物理地址空间,打开的文件等等。4、抢占内核:从linux2.6内核开始,linux支持抢占式内核机制。 因为linux2.6支持对称多处理器,这样可以充分利用CPU等有限的资源,从而提高了系统的性能。5、文件系统:linux可以支持多种文件系统,如果没有特许的要求就可以使用普通的Eext2文件系统linux的文件系统是通过VFS(虚拟文件系统)来支持各种不同的文件系统的。这样就可以很容易的把自己写的文件系统移植到linux下。Linux的优点如下:Linux是免费的。除了硬件之外,你不用花费就能安装一套完整的linux操作系统。Linux的所有成分都是可以充分定制。通过内核编译选项,你可以通过自身要求来定制你的内核,只要遵循GPL协议你就可以去阅读,修该所有的源代码。Linux可以运行在低档,便宜的硬件平台上。本课题的选用的是ARM平台。Linux内核非常小,而且紧凑,在移植到ARM开发平台时为2M左右。Linux与很多通用文件系统高度兼容。Linux可以直接安装很多种文件系统。Linux开放源代码、易于移植、资源丰富、免费、可根据硬件平台的需要进行裁剪,从而配置成需要的内核。3.2 linux内核系统与LCD驱动Linux 是一个整体式的内核(Monolithic Kernel)结构,也就是说,整个内核是一个单独的、非常大的程序,从实现机制来说,linux内核可划分为 5 个子系统,内核的各个子系统都提供了内部接口(函数和变量),这些函数和变量可供内核所有子系统调用和使用。3.2.1 linux内核子系统与LCD驱动的关系1、进程调度与进程通信控制着进程对CPU的访问、以及进程间的相互通信、控制CPU处理进程。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了基于优先级的进程调度算法选择新的进程。在LCD驱动程序中主要考虑进程之间的互斥访问,所以要用到锁机制来进行互斥访问LCD设备。2 、内存管理 物理内存的分配、释放、回收等。Linux内核采用虚拟内存技术,每个进程的虚拟内存空间为4GB。其中0-3G属于用户空间,称为用户段,3G-4G属于内核空间,称为内核段。允许多个进程安全的共享主内存区域。在LCD驱动程序中需要分配framebuffer,用来存储要显示的图像数据,并把其映射到内核空间和用户空间。这样用户级的程序就可以直接操作LCD设备来显示图像。3、虚拟文件系统实现了一种通用文件模型。屏蔽了各种不同文件系统的内在差别,使得用户可以使用同样的方式访问各种不同格式的文件系统。为用户访问不同的文件系统提供统一的通用的接口。LCD设备在文件系统的目录是dev/fbx。用户可以用对文件的操作来读写LCD设备。4、设备管理操作系统的主要任务之一是控制所有的输入/输出设备。它必须向设备发布命令,捕获中断并进行错误处理,它还要提供一个设备与系统其余部分的简单易用的界面,该界面应该对所有的设备尽可能的一致,从而将系统硬件设备细节从用户视线中隐藏起来,例如虚拟文件系统对各种已安装的文件系统类型提供了统一的视图而屏蔽了具体底层细节,具体细节都是由设备驱动程序来完成的,对于LCD驱动程序,在 Linux 中可以按照模块的机制进行编译和加载。3.2.2 LCD驱动与linux系统调用用户级程序要操作到LCD设备,只能通过系统调用的方式去访问内核服务。因为用户进程是不能存取内核使用的内存段,也不能调用内核函数。当用户进程请求内核服务时,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务. 系统调用是内核提供的一系列函数,提供给用户程序调用的一组“特殊”接口。是应用程序和内核的交互接口。那么为什么需要系统调用了?首先,出于安全的考虑。使得用户进程不能随便的进入内核空间,访问内核变量和内核函数,用户程序通过系统调用才能够获取内核服务,是对内核的保护。用户进程通过系统调用,从用户态切换到内核态,在内核态完成任务后再返回用户态。其次,用户进程只有只能通过系统调用获取系统内核服务,规定了用户进程进入内核的具体位置 ,也就是用户访问内核的路径是事先规定好的,只能从规定位置进入内核,执行规定的内核函数(功能)。其实系统调用是中断0x80。通过系统调用用户程序就可以读写LCD设备,获得LCD的分辨率等信息。系统调用的结构图如图3.1所示。 应用程序基本函数库系统调用接口文件系统进程通信及内存管理用户空间内核空间图3.1 linux系统调用 3.3 编写LCD驱动需要的软件与指令3.3.1 常用软件在LCD驱动中主要用了linux下的vim编辑器、GCC编译器软件以及make工具。Vim 是Linux下第一个全交互式编辑器,在Linux程序开发中受到广大程序员的青睐。支持指令操作,vim有三中命令模式,command模式,用于输入命令,insert命令,用于插入文本,visual模式,用于可视化的高亮并选定文本正文。Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。gcc 编译器能将C、C+语言源程序、汇编程序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。 在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别。虽然gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。命令 gcc首先进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld程序来完成最后的关键性工作,这个阶段就是链接。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中链到合适的地方。3.3.2 常用指令在LCD驱动设计过程中主要用到了以下指令。ls 显示当前文件下的所有内容一般用法是:ls l filename。cd 目录切换指令,常用方法是:cd filename。pwd 显示当前所在目录的路径。cp 复制指令。常用方法是:cp srcfile dest。mv 是移动文件指令,rm是删除指令,mkdir是创建目录。chmod是改变文件或目录的权限。ps显示当前系统中的所有进程。insmod 把编译好的模块插入内核。rmmod 从内核中移除模块。3.3.3 嵌入式系统中的交叉编译本课题的LCD驱动源码是在PC机上编写,却是运行在ARM平台上。所以不能用通常的编译方式LCD驱动源码,这就要用到所谓的交叉编译方式。在一种平台上能编译出在其他平台上运行的程序就是交叉编译。用来交叉编译的软件叫做交叉编译器(arm-linux-gcc)。那么为什么要进行交叉编译了?因为嵌入式系统是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件比较困难,有时候甚至是不可能的,所以嵌入式系统的开发就必须要用到交叉编译。至于交叉编译环境的搭建,一般由以下几个步骤:1、安装准备:# mkdir /usr/local/arm2、拷贝安装源码包# cp eabi-4.1.2.tar.bz2 /usr/local/arm3、解压# tar jxvf eabi-4.1.2.tar.bz2 -C /usr/local/arm# mv eabi 4.1.2 /更改工具链目录名为4.1.24、添加环境变量#vi /etc/bashrc 文件最后添加:export PATH=/usr/local/arm/4.1.2/bin:$PATH,使得配置立刻生效,需要使用source命令重新读取配置文件。#source /etc/bashrc,交叉编译器安装完毕,使用方法跟GCC相似,只是编译出来的可执行文件只能在arm平台运行。3.3.4 make工具与makefile规则当编写完LCD驱动程序以后,要借用linux内核源码中的makefile规则去生成LCD驱动模块。Make是一种控制编译或者重复编译软件的非常重要的工具。Make 可自动决定一个大程序中哪些文件需要重新编译,并执行重新编译它们的命令。 make机制的运行环境需要一个命令行程序make和一个文本文件makefile。makefile文件是定义make如何执行的规则文件,它包含一些规则告诉make工具编译哪些文件、怎么编译以及在什么条件下去编译。makefile写好之后,每次改变了某些源文件,只要执行make命令,所有必要的重新编译将执行。make程序通过比较目标文件的生成时间和其所依赖的源文件的最后修改时间和来决定是否执行makefile中定义的命令来更新该目标文件。makefile包含一些规则来告诉make处理哪些文件以及如何处理这些文件。这些规则主要是描述哪些文件(称为target目标文件,不要和编译时产生的目标文件相混淆)是从哪些别的文件(称为dependency依赖文件)中产生的,以及用什么命(command)来执行这个过程。每条规则包含以下内容:一个“目标体”。即可执行文件和目标文件,目标也可以是要执行的动作。一个或多个依赖文件(dependency)列表。一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。makefile规则的一般形式如下:target:dependency (tab)parent=subsys-kset.kobject。4、每个子系统中的Kset通过kobject挂在子系统的kset链表上。4.4.3 总线、设备、驱动结构体介绍一个总线是处理器和一个或多个设备之间的通道。在设备模型中,所有的设备都挂接在总线上。在Linux设备模型中, 一个总线由 bus_type 结构代表, 定义在struct bus_type /这里只列出了LCD驱动必要的项const char*name;总线名字struct bus_attribute*bus_attrs;总线的属性。struct device_attribute*dev_attrs;所有属于该总线上的设备的默认属性。struct driver_attribute*drv_attrs;所有属于该总线上的驱动的默认属性。int (*match)(struct device *dev, struct device_driver *drv);匹配函数,用来匹配设备与驱动,这个域也是LCD平台驱动的精髓所在,在驱动挂接到总线上时调用此函数。struct bus_type_private *p;指向与kobject相关的项。;在内核底层,Linux 系统中的每个设备由一个 struct device 代表: struct device struct device*parent;/指向设备的parentstruct device_private*p;/通过此项中的域挂接到驱动中去struct kobject kobj;/与设备模型有关的域const char*init_name; /* initial name of the device */struct semaphoresem;struct bus_type*bus;/表示设备所挂接的总线struct device_driver *driver;/指向能够处理该设备的驱动void*driver_data;/在LCD中一般为fb_infovoid*platform_data;/在LCD中一般设置为s3c2410fb_mach_infostruct class*class;/设备所属类s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论