基于嵌入式技术的LED广告牌功能开发.doc_第1页
基于嵌入式技术的LED广告牌功能开发.doc_第2页
基于嵌入式技术的LED广告牌功能开发.doc_第3页
基于嵌入式技术的LED广告牌功能开发.doc_第4页
基于嵌入式技术的LED广告牌功能开发.doc_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

JIU JIANG UNIVERSITY毕 业 论 文题 目 基于嵌入式技术的LED广告牌功能开发 英文题目 LED Billboard Feature Development Based on Embedded Technology 院 系 信息科学与技术学院 专 业 计算机科学与技术 姓 名 江海蔡 班级学号 A081204 指导教师 刘涛 二一二年五月摘 要现在LED电子屏用来显示企业介绍、公告、标语、新闻、广告等,是综合信息发布的最佳媒体。其采用了低电压扫描驱动,具有耗电省、使用寿命长、成本低、亮度高、视角大、可视距离远、防水、规格品种多等优点,可以满足各种不同应用场景的需求。本设计以ARM9作为主控制器,设计LED字符设备驱动和外围电路来驱动1664的点阵LED显示屏。并实现功能相对丰富的基于Linux系统的控制程序,来控制LED广告牌动态显示。实现一个宣传小广告,LED广告牌的动态效果包括开始、暂停、停止、闪烁、更新、显示时间和日期。因为ARM运算能力非常强大,内部资源也十分丰富,极大的简化了硬件设计的难度,缩短了开发周期。所以基于嵌入式的LED广告牌开发具有很好的市场前景。关键词:嵌入式,字符设备驱动,LED广告牌AbstractNow, LED electronic display screens generally be used to display company profile, bulletins, posters, news, advertising and so on. And it is the best media integrated information publishing. It has used the low-voltage scanning driver, with low power consumption, long life, low cost, high angle, brightness Visual distance, waterproof, specifications variety advantages, can meet the needs of a variety of different scenarios.ARM9 is a master controller of this design, designed LED character device drivers and the external circuit to driver a 1664 dot-matrix LED display. And achieve relatively feature-rich control program based on Linux systems, to control the dynamic display of LED billboards. The design and realization of a promotional ad, Dynamic effect of LED billboards including pause, stop, start, the flash, updates, display time and date.Because the ARM operation ability is very powerful, internal resources is also very rich, which greatly simplifies the difficulty of hardware design, shortening the development cycle. So based on embedded LED development has good prospects.key words : Embedded, Character Device Driver, LED Billboard 目 录摘 要IAbstractII1 绪论1.1 LED显示屏的发展及应用(1)1.2 嵌入式技术概述(2)1.3 题目来源(2)1.4 设计任务(3)2 LED屏显示工作原理分析2.1 LED屏点阵模块结构(4)2.2 LED屏动态显示分析(4)2.3 LED屏控制方式(6)2.4 本章小结(8)3 基于ARM9的LED广告牌硬件设计3.1 总体设备连接(9)3.2 1664点阵屏电路设计(9)3.3 ARM与LED屏连接(14)3.4 本章小结(18)4 开发环境搭建4.1 开发工具及语言(19)4.2 Linux交叉编译环境(19)4.3 U-Boot移植(20)4.4 内核移植(21)4.5 本章小结(23)5 驱动程序设计与实现5.1 字符设备驱动结构(24)5.2 字符设备驱动动态加载(26)5.3 LED驱动程序实现(27)5.4 加载LED驱动程序(30)5.5 本章小结(31)6 控制程序设计与实现6.1 控制程序流程(32)6.2 控制程序中点阵数据的存取(33)6.3 LED屏动态效果实现(37)6.4 本章小结(39)7 系统测试7.1 功能测试(40)7.2 刷新率测试(41)致 谢(43)参考文献(44)1 绪论1.1 LED显示屏的发展及应用1.1.1 LED显示屏的发展LED显示屏的发展可分为以下几个阶段:第一阶段为1990年到1995年,主要是单色和16级双色图文屏。用于显示文字和简单图片。第二阶段是1995年到1999年,出现了64级、256级灰度的双基色视频屏。视频控制技术、图像处理技术、光纤通信技术等的应用将LED显示屏提升到了一个新的台阶,可用于显示一些简单的动画和稍微复杂的图片。第三阶段从1999年开始,红、纯绿、纯蓝LED管大量涌入中国,同时国内企业进行了深入的研发工作,使用红、绿、蓝三原色LED生产的全彩色显示屏被广泛应用1。LED显示屏的系统构成形式有两种:一种把所需展示的广告信息烧写到EPROM芯片内,进行固定内容的多幅汉字显示,称为单显示型;另一种在机内设置了字库、程序库,具有程序编制能力,能对内容进行更改的多幅汉字显示,称可编程序型2。1.1.2 LED显示屏的应用(1)汽车信号指示:超高亮度LED用于汽车指示灯与传统的白炽灯相比具有许多优点,在汽车工业中有着广泛的市场。(2)交通信号指示:用超高亮度LED取代白炽灯,用于交通信号灯、警示灯、标志灯现已遍及世界各地,市场广阔,需求量增长很快。(3)大屏幕显示:大屏幕显示是超高亮度LED应用的另一巨大市场,包括图形、文字、数字的单色、双色和全色显示3。具体实例应用如图1-1所示。图1-1 门头屏1.2 嵌入式技术概述随着信息技术与网络技术的迅速发展,计算机技术已经进入了后PC机时代,随着各种嵌入式产品的开发和推广,嵌入式系统在人们的生活中也无处不在。嵌入式是当前发展最快、应用最广、最有发展前景的信息技术应用领域之一4。它具有以下特点: (1)它是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、体积、功耗等要求的专用计算机系统。 (2)嵌入式系统与计算机系统有着明显的区别。 (3)它由嵌入式处理器,嵌入式软件,嵌入式应用软件组成。 (4)随着微电子技术与计算机技术的发展微控制芯片的功能越来越强大,而嵌入式设备也逐渐出现在人们的日常生活中。1.3 题目来源中国嵌入式软件产业的发展面临着良好的发展环境与机遇,这包括政府的重视与扶植、信息产业与传统产业的融合机遇、垄断局面尚未形成、中国制造的良好基础、自由软件运动的兴起等等。同时,不可否认的是长期以来,由于人才、宣传、资金等诸多问题以及嵌入式本身所特有的软硬结合特性,使嵌入式软件人才一直处于供不应求的状态。LED显示屏已经进入了多种应用领域,包括宇航、飞机、汽车、工业应用、通信、消费类产品等,遍及国民经济各部门和千家万户。现在LED电子屏一般用它来显示企业介绍,公告,标语,新闻,广告等,是综合信息发布的最佳媒体。通过此次设计可以使我更加熟悉嵌入式技术和LED显示屏的主要功能和适用范围,对一些电子电路知识更为了解,对自己以后的工作有很大的帮助。1.4 设计任务本设计的任务是对字符设备的驱动程序开发,并实现功能相对丰富基于Linux系统的控制程序,来控制LED显示屏上多模式显示功能。任务要求:(1)人机界面设计主要实现的是向用户显示LED功能菜单,读取用户输入的命令并且做出响应。(2)LED屏动态显示包括开始显示文字广告信息、暂停显示、停止显示、横向和纵向移动、 加快移动速度、减小移动速度、广告信息呈现出闪烁、更新广告信息内容、显示当时日期与时间。(3)设备驱动主要是实现字符设备驱动控制LED屏的动态显示。(4)将完成的模块移植到开发板,实现开机自动加载演示。(5)实现一个宣传小广告,广告的内容为:“千年文脉百年办学十年升本 亲爱的老师们,您辛苦了!衷心地感谢您(_)”。2 LED屏显示工作原理分析2.1 LED屏点阵模块结构八十年代以来出现了组合型LED点阵显示器模块,以发光二极管为像素,它用高亮度发光二极管芯阵列组合后,环氧树脂和塑模封装而成。这种一体化封装的点阵LED模块,具有高亮度、引脚少、视角大、寿命长、耐湿、耐冷热、耐腐蚀等特点。LED点阵规模常见的有44、48、57、58、88、1616等等。根据像素颜色的数目可分为单色、双基色、三基色等。像素颜色不同,所显示的文字、图像等内容的颜色也不同。单色点阵只能显示固定色彩如红、绿、黄等单色,双基色和三基色点阵显示内容的颜色由像素内不同颜色发光二极管点亮组合方式决定,如红绿都亮时可显示黄色,如果按照脉冲方式控制二极管的点亮时间,则可实现256或更高级灰度显示,即可实现真彩色显示。最常见的88单色LED点阵显示器的内部电路结构和外型规格如图2-1所示。 图2-1 单色LED模块内部电路2.2 LED屏动态显示分析 LED点阵显示系统中各模块的显示方式有静态和动态显示两种。静态显示原理简单、控制方便,但硬件接线复杂,在实际应用中一般采用动态显示方式。动态显示采用扫描的方式工作,由峰值较大的窄脉冲电压驱动,从上到下逐次不断地对显示屏的各行进行选通;同时又向各列送出表示图形或文字信息的列数据信号,反复循环以上操作,就可显示各种图形或文字信息。点阵式LED汉字广告屏绝大部分是采用动态扫描显示方式,这种显示方式巧妙地利用了人眼的视觉暂留特性。将连续的几帧画面高速的循环显示,只要帧速率高于24帧/秒,人眼看起来就是一个完整的、相对静止的画面。最典型的例子就是电影放映机。在电子领域中,因为这种动态扫描显示方式极大的缩减了发光单元的信号线数量,因此在LED显示技术中被广泛使用。以88点阵模块为例,说明一下其使用方法及控制过程。图2-1中,红色水平线R0、R1R7叫做行线,行线接发光二极管的阳极,每一行8个LED的阳极都接在本行的行线上。相邻两行线间绝缘。同样,蓝色竖直线C0、C1C7叫做列线,列线接发光二极管的阴极,相邻两列线间绝缘。在这种形式的LED点阵模块中,若在某行线上施加高电平(用1表示),在某列线上加低电平(用0表示)。则行线和列线的交叉点处的LED就会有电流流过而发光。比如,C7为1,R0为0,则右上角的LED点亮。再如C0为1,R0到R7均为0,则最左边一列8个LED全点亮。现描述一下用动态扫描显示的方式,显示字符B的过程5。其过程如图2-2所示。图2-2 动态扫描显示字符B的过程下面用伪代码描述动态显示的过程。(1)第一帧:R=0x01,C=0xff;(2)第二帧:R=0x02,C=0x87;(3)第三帧:R=0x04,C=0xBB;(4)第四帧:R=0x08,C=0xBB;(5)第五帧:R=0x10,C=0x87;(6)第六帧:R=0x20,C=0xBB;(7)第七帧:R=0x40,C=0xBB;(8)第八帧:R=0x80,C=0x87;(9)跳到第(1)步循环。如果高速地进行(1)到(9)的循环,且两个步骤间的间隔时间小于1/24秒,由于视觉暂留,LED显示屏上将呈现出一个完整的B字符。这就是动态扫描的原理。只不过实际运用的时候,列线和行线通常不止8位,还要根据列线和行线的数量来决定是用行线或列线来做扫描线,这次设计用的LED屏行线有16根,列线有64根。如果用列线来做扫描线,则每列LED在每64次循环扫描中只可能亮一次,则其发光视觉平均亮度为直流亮度的1/64。如果用行线来做扫描线,则每16次循环,每行LED就能亮一次,其发光视觉平均亮度为直流情况下的1/16。可见,用行线做扫描线,因为其发光周期的占空比较大,其视觉亮度是用列线做扫描线的4倍。因而发光效率比前者高6。在实际运用的时候,还要在每两帧之间加上合适的延时,以使人眼能清晰的看见发光。在帧切换的时候还要加入余辉消除处理。比如先将扫描线全部设置为无效电平,送下一行的列数据后再选通扫描线,避免出现尾影。2.3 LED屏控制方式目前常见的是并行传输方式,通过8位锁存器将8位总线上的列数据进行锁存显示,各8位锁存器的片选信号由译码器提供。此种方式的优点是传输速度快,对微控制器(MCU)的通信速度要求较低。但是这种方案最大的缺点是不便于随意扩展显示单元的数目。每增加一个1616点阵的全角汉字显示单元,就需要在之前的电路上多增加两根地址线,这就要求在PCB布线的时候要留有充足的地址线冗余量。再一个缺点是,每个单元的PCB随着安放位置的不同,布线结构也不相同,不利于厂家批量生产。并行传输需要的芯片较多,因此市场上已经出现用FPGA,CPLD等高密度可编程逻辑器件(PLD)来取代传统锁存器IC的方案7。成本有所下降,但可扩展性仍旧较差。因此,并行传输方式适用于显示单元数目确定的条屏。随着广告屏显示内容的多媒体化,对控制器传输速度,运算能力的要求越来越高。因此控制器的种类也在不断发展以适应要求,从最初的8051单片机,到PIC单片机,又到FPGA,直到现在的ARM处理器。不同功能档次的广告屏对应着不同的处理器。(1)以传统8051单片机为控制器的LED显示屏。因受到单片机运算速度及通信速率的限制,LED动态显示的刷新率不可能做得太高。对显示效果和移动算法的处理也比较吃力,在实际显示效果上有比较明显的闪烁感。除此之外,传统8051单片机的内部资源贫乏,仅128字节的数据存储器,几K字节的程序存储器,无E2PROM、SPI。这就需要对单片机扩展外设,无疑增加了硬件成本。因此,8051控制的条屏只能用于显示内容及其简单,不需要经常更改显示内容的场合。(2)以PIC单片机为控制器的LED显示屏。因PIC单片机是RISC架构的工业专用单片机,处理指令的速度有所增加,抗干扰能力优秀,型号种类繁多。作为条屏的控制器,可以明显的改善显示效果,同时PIC单片机内部的资源较丰富,可节省外部电路设计难度,同时降低了硬件成本。因此,以PIC单片机为控制器的条屏目前仍是单色条屏市场的主流。(3)以FPGA(复杂可编程逻辑门阵列)为控制器的LED显示屏。FPGA以高速、并行著称。是近年来新兴的可编程逻辑器件。用他作为LED显示屏的控制器,能够高速的处理色阶PWM信号、高速的完成动态扫描逻辑、高速的完成字符移动算法。因此被运用于双基色、三基色的显示系统。但是其成本较高,开发难度较大。(4)以ARM(32位RISC架构高性能微处理器)为控制器的LED显示屏。ARM有着极高的指令效率,极高的时钟频率。因此其运算能力非常强大,内部资源也十分丰富,极大的简化了硬件设计的难度,缩短了开发周期。在条屏的运用中,能用ARM来实现花样繁多的显示方式,以及高色阶,多像素的全彩屏驱动。ARM与FPGA的组合更是功能强大,除了海量存储技术,无线更新技术外,还能实时地显示视频信号。因此,以ARM为控制器的显示屏常为视频全彩屏8。2.4 本章小结本章对LED点阵模块的结构、LED动态显示以及LED控制方式,进行了详细的分析。列举了常见LED点阵规模,以88点阵单元为例子实现动态扫描显示字符 B。简单的解析了使用8051单片机、PIC单片机、FPGA和ARM这四种常见的LED屏控制器的优势和劣势,本次设计将采用ARM为LED屏的控制器。3 基于ARM9的LED广告牌硬件设计3.1 总体设备连接本系统中采用以ARM9为开发平台的FL2440开发板作为LED屏的控制器。计算机通过UART连接到开发板上。UART在嵌入式领域中应用广泛,主要用于设备与设备、设备与主机之间传送数据,几乎所有的MMU都带有UART。然而笔记本电脑并没有串口,必须使用USB转串口实现计算机USB接口到通用串口之间的转换。在FL2440上IO扩展口上有可以作为普通输入/输出的引脚去驱动LED屏9。具体的连接图如图3-1所示。图3-1 外围设备连接图3.2 1664点阵屏电路设计3.2.1 1664点阵屏总体控制电路此次设计中使用的LED屏是由16个88点阵屏组成的1664点阵屏,屏幕能够显示四个汉字。每个汉字行是由2个3-8译码器控制,每个3-8译码器有8个输出引脚。每个汉字的列是由2个74HC595控制,每个74HC595芯片有8根控制引脚。LED屏使用了8个74HC595芯片。LED总体控制电路图如3-2所示10。图3-2 LED总体控制电路图3.2.2 LED屏主要芯片74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC138译码器可接受3位二进制加权地址输入(A,B和C),并当使能时,提供8个互斥的低电平有效输出(Y0至Y7)。74HC138特有3个使能输入端,两个低有效(E1和E2)和一个高有效(E3)11。除非E1和E2置为低电平并且E3置高电平,否则74HC138将保持所有输出为高。任选一个低电平有效使能输入端作为数据输入,而把其余的使能输入端作为选通端,则74HC138亦可充当一个8输出多路分配器,未使用的使能输入端必须保持绑定在各自合适的高有效或低有效状态。74HC138芯片在LED屏中的连接如图3-3所示。图3-3 74HC138芯片4953的作用是行驱动管,功率管。其内部是两个CMOS管,1、3脚VCC,2、4脚控制脚,2脚控制7、8脚的输出,4脚控制5、6脚的输出,只有当2、4脚为0时,7、8、5、6才会输出,否则输出为阻塞状态12。4953芯片在LED屏上的级联方式如图3-4所示。图3-4 4953芯片74HC595是LED驱动芯片,8位移位锁存器。第8脚GND,电源地。第16脚VCC,电源正极第14脚DATA,串行数据输入口,显示数据由此进入,必须有时钟信号的配合才能移入。第13脚EN,使能口,当该引脚上为1时QAQH口全部为1,为0时QAQH的输出由输入的数据控制。第12脚STB,锁存口,当输入的数据在传入寄存器后,只有供给一个锁存信号才能将移入的数据送QAQH口输出。第11脚CLK,时钟口,每一个时钟信号将移入一位数据到寄存器。第10脚SCLR,复位口,只要有复位信号,寄存器内移入的数据将清空,显示屏不用该脚,一般接VCC。第9脚DOUT,串行数据输出端,将数据传到下一个。第15、17脚,并行输出口也就是驱动输出口,驱动LED。74HC595芯片在LED屏中的连接如图3-5所示。图3-5 芯片74HC595连接图74HC04的作用是6位反相器。第7脚GND,电源地。第14脚VCC,电源正极。信号由A端输入Y端反相输出,A1与Y1为一组,其它类推。A1=1则Y1=0、A1=0则Y1=1,其它组功能一样13。74HC04芯片在LED屏上的级联方式如图3-6所示。图3-6 74HC04和其在LED屏上连接图74HC244芯片内部共有两个四位三态缓冲器,使用时可分别以1G和2G作为它们的选通工作信号。当1G和2G都为低电平时,输出端Y和输入端A状态相同;当1G和2G都为高电平时,输出呈高阻态14。74HC24芯片如图3-7所示。图3-7 74HC244芯片引脚图3.3 ARM与LED屏连接3.3.1 接口电路连接LED屏输入和输出分别有16个引脚。此次设计中买的是单色屏,只需连接9根引脚。接入引脚用于和控制器相连,接出引脚用于屏的扩展。LED屏的接入和接出引脚分布如下图3-8所示。图 3-8 LED接入和接出引脚分布图S3C2440包含了130多个功能输入/输出引脚:(1)端口A(GPA):25 位输出端口;(2)端口B(GPB):11 位输入/输出端口;(3)端口C(GPC):16 位输入/输出端口;(4)端口D(GPD):16 位输入/输出端口;(5)端口E(GPE):16 位输入/输出端口;(6)端口F(GPF):8 位输入/输出端口;(7)端口G(GPG):16 位输入/输出端口;(8)端口H(GPH):9 位输入/输出端口。每个端口都可以简单的由软件配置为各种系统配置和设计要求。必须在开始主程序前定义好使用的每个引脚的功能。如果没有使用某个引脚的复用功能,这个引脚可以配置为I/O 口。FL2440的IO扩展口如下图3-9所示15。图3-9 IO扩展接口图此次设计选择了IO扩展口中的GPB5、GPB6、GPB7、GPB8、GPB9、GPB10、GPE11、GPG3、GND引脚和LED屏接入口A、B、C、D、EN、G1、STR、CLK、 GND引脚连接,具体连接如下图3-10所示。图3-10 LED屏与ARM连接图S3C2440中,大多数端口为复用引脚。因此要决定每个引脚选择哪项功能。PnCON(引脚控制寄存器)决定了每个引脚使用哪项功能。如果端口配置为输出端口,可以写入数据到PnDAT的相应位。如果端口配置为输入端口,可以从PnDAT 的相应位读取数据。IO扩展口相关引脚功能如表3-1所示。表3-1 IO引脚功能表引脚标号功能1功能2功能3GPB5普通输入/输出nXBACK-GPB6普通输入/输出nXBREQ-GPB7普通输入/输出nXDACK1-GPB8普通输入/输出nXDREQ1-GPB9普通输入/输出nXDACK0-GPE11普通输入/输出SPIMISO0-GPB10普通输入/输出nXDREQ0-GPG3普通输入/输出ENIT11nSS1GPnCON寄存器格式如表3-2所示。表3-2 GPnCON寄存器格式符号位描述初始状态GPB1021:2000=输入 01=输出10=nXDREQ0 11=保留00GPB919:1800=输入 01=输出10=nXDACK0 11=保留00GPB817:1600=输入 01=输出10=nXDREQ1 11=保留00GPB715:1400=输入 01=输出10=nXDACK1 11=保留00GPB613:1200=输入 01=输出10=nXBREQ 11=保留00GPB511:1000=输入 01=输出10=nXBACK 11=保留00GPE1123:2200=输入 01=输出10=SPIMISO0 11=保留003.3.2 IO扩展口与ARM核心板连接和引脚定义(1)IO扩展口与ARM核心板连接图如图3-11,图3-12所示。图3-11 GPB引脚与核心板的连接图图3-12 GPE和GPG引脚与核心板的连接图(2)IO扩展连接引脚定义:#define LEDDM_PORT_A S3C2410_GPB5#define LEDDM_PORT_B S3C2410_GPB6#define LEDDM_PORT_C S3C2410_GPB7#define LEDDM_PORT_D S3C2410_GPB8#define LEDDM_PORT_E S3C2410_GPB9#define LEDDM_PORT_G1 S3C2410_GPG3 /DATA#define LEDDM_PORT_LAT S3C2410_GPB10 /更新数据RCK12#define LEDDM_PORT_CLK S3C2410_GPE11 /数据移位SCK11#define LEDDM_PORT_A_OUTP S3C2410_GPB5_OUTP#define LEDDM_PORT_B_OUTP S3C2410_GPB6_OUTP#define LEDDM_PORT_C_OUTP S3C2410_GPB7_OUTP#define LEDDM_PORT_D_OUTP S3C2410_GPB8_OUTP#define LEDDM_PORT_E_OUTP S3C2410_GPB9_OUTP#define LEDDM_PORT_G1_OUTP S3C2410_GPG3_OUTP /DATA#define LEDDM_PORT_LAT_OUTP S3C2410_GPB10_OUTP #define LEDDM_PORT_CLK_OUTP S3C2410_GPE11_OUTP 3.4 本章小结根据组成LED屏各个芯片的功能特性、各个引脚的连接方式和ARM板上IO引脚功能,设计了LED屏与ARM板IO接口连接电路、器件的总体连接;并实现了IO引脚在LINUX下的定义。4 开发环境搭建4.1 开发工具及语言Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux发行版,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux 的发行版中包含了很多软件开发工具, 它们中的很多是用于 C 和 C+应用程序开发的。4.2 Linux交叉编译环境4.2.1 交叉编译环境的简介随着嵌人式电子产品的大量开发应用以及Linux操作系统的不断完善强大,嵌人式Linux系统越来越多地进入人们的生活中。基于Linux操作系统的开发环境一般有目标系统硬件(开发板)和宿主PC机构成。开发板所使用的操作系统内核编译,应用程序开发调试都是通过宿主PC机来完成的。引入交叉编译的原因是由于一般目标板的资源都比较有限,需要有强大的宿主PC机为它完成大部分的调试编译任务。4.2.2 挂载网络文件系统网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS。NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。将PC机的某个部分挂载到开发板上,开发板就可以访问PC机上被挂载的所有文件。4.2.3 交叉编译环境的安装与测试将压缩文件夹cross-3.4.1.tar.bz2在根目录下解压,系统会自动解压到/usr/local/arm目录下。在/etc/profile文件下添加环境变量export PATH = /usr/local/arm/3.4.1/bin:.:$PATH。通过命令echo $PATH来查看添加的路径。简单的测试程序helloworld.c来测试交叉编译环境是否成功安装。#includeint main()printf(“helloworldn”);return 0;在Linux下执行命令gcc helloworld.c o hello和命令arm-linux-gcc helloworld o world。生成的文件hello和world分别在PC和开发板上执行显示相同的结果helloworld。4.3 U-Boot移植4.3.1 BootLoader的重要性BootLoade就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。NandFlash总共有8个分区分别为boot、bootParam、pic、MyApp、kerner、fs_yaffs、eboot、wince,其中BootLoader在其第一个分区。NandFlash具体分区如下图4-1所示。图4-1 NandFlash分区4.3.2 烧写BootLoader先在PC机上安装USB转串口驱动,USB驱动(用于DNW下载程序)。在DNW里面设置波特率,端口号和USB下载的起始地址(0x3080000)。当DNW窗口出现了USB:ok时,就实现了PC机与开发板的连接。在烧写BootLoader 之前需要将BootLoader分区擦除。执行命令nand erase 0 0x00020000(不同的开发板,各个分区占用的空间是不一样的)。也可以直接选择菜单的第六项( Erase Flash Partion )。重新启动开发板,当再次进入选择菜单时,选择第一项(Download to flash),通过USB Port下的Transmit加载uboot.bin文件,即可直接烧入BootLoader的分区。4.4 内核移植内核自带的字符设备驱动很有限,我们经常需要将自己实现的字符设备驱动添加到内核。添加测设字符设备驱动HELLOWORLD模块具体过程如图4-2所示。图4-2添加字符设备模块流程图内核模块 :(1)包含内核头文件#include#include(2)函数体static int _init helloworld_init(void)/双下划线表示函数的存放地点printk(KERN_ALERT My first Hello world kernel module!n);return 0;static void _exit helloworld_exit(void)printk(KERN_ALERT Bye, cruel world!n);(3)初始化/退出函数module_init(helloworld_init);module_exit(helloworld_exit);(4)添加模块描述config HELLOWORLDtristate “test module helloworld-help- Testing successfully loaded character - driven module (5)添加模块的依赖文件obj-$(CONFIG_HELLOWORLD) +=helloworld.o)配置Makefile的CROSS_COMPILE ?=usr/local/arm/3.4.1/bin/arm-linux-,以及处理器类型ARCH ?=arm。生成的内核镜像zImage里面已经包含了字符设备驱动helloworld模块。将zImage烧入开发板,在开发板上执行命令dmesg |grep first时会输出“My first Hello world kernel module!”。4.5 本章小结本章讲述了ARM板上的基本环境搭建。ARM上交叉编译环境arm-linux-gcc实现在宿主PC机调试编译的目标文件放入开发板内执行。U-Boot承担着整个系统的加载启动任务,一旦板子正常启动了就不会用到U-Boot了。现在有很多内核版本,不同型号的板子支持不同的内核。此次设计采用了的内核。5 驱动程序设计与实现5.1 字符设备驱动结构5.1.1 字符设备驱动总体结构Linux设备驱动的分类:字符设备,块设备,网络设备。字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不经过系统的快速缓冲,而块设备经过系统的快速缓冲。但是,字符设备和块设备并没有明显的界限,如对于Flash设备,符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访问。字符设备结构如图5-1所示。图中虚线所框起来的部分全部都得在驱动模块实现,其中File_operations里面的成员全部多需要自己重新写过。图5-1 字符驱动结构图5.1.2 LED字符设备结构体Linux系统将LED当作为字符设备来驱动,所以此次设计中LED也是一种字符设备。在此次设计中要用到互斥体、定时器和缓存数据的指针、数组,故将这些属性一起封装到leddm_cdev结构体中。struct leddm_cdevstruct class *leddm_cls;struct device *leddm_dev;struct cdev cdev; /字符设备struct mutex mut; /互斥体struct timer_list timer_update_display; /定时器struct timer_list timer_update_data;int current_jiffies_update_data;int is_update_display_on;int is_update_data_on;u8 display_buf0 LED_DM_HEIGHT * LED_DM_WIDTH ; /缓冲u8 display_buf1 LED_DM_HEIGHT * LED_DM_WIDTH ;u8 display_buf_toggle; /显示开关u8 *pdata_display; u8 *pdata_data; /指向数据u8 *pdata_buf; /指向用户空间传来的数据u32 data_buf_width; /保存数据的宽度u32 data_buf_height; /保存数据的高度=16u32 data_buf_pos; /当前数据的位置;5.2 字符设备驱动动态加载Linux内核是一个整体结构,因此向内核添加或者删除某些功能十分困难,而且添加一个有问题的设备驱动将导致整个系统崩溃,所以通常情况可以将设备驱动程序动态加载或者动态删除。内核版本2.6的Linux其字符驱动在加载时,首先需要调用入口函数cdev_init(),该函数完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等。其中重要的工作就是向内核注册设备,对于字符设备使用cdev_add()完成注册,注册成功后,该设备获得了系统分配的主设备号、次设备号、设备节点,并建立起来与文件系统的关联。设备驱动在卸载时调用cedv_del(),删除所有设备与系统之间的关联,之后就不能访问这个驱动模块了。系统调用部分则是对设备的操作过程。设备驱动模块动态加载、卸载和系统调用过程如图5-2所示。5-2 设备驱动模块操作过程图5.3 LED驱动程序实现5.3.1 初始化模块初始化模块主要包括确定主、次设备号和注册设备以及初始化LED驱动。Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。(1)手工分配主设备号:dev = MKDEV( leddm_major, leddm_minor );ret = register_chrdev_region( dev, LEDDM_COUNT, LEDDM_NAME );(2)动态分配主设备号:ret=alloc_chrdev_region(&dev,leddm_minor,LEDDM_COUNT,LEDDM_NAME );leddm_major = MAJOR( dev );(3)在模块或驱动初始化时注册设备:cdev_init( &( pcdevp-cdev ), &leddm_fops );ret = cdev_add( &( pcdevp-cdev ), dev, 1 );LED驱动初始化函数主要对自定义LED字符设备结构体相关成员进行初始化,并注册更新数据和更新屏幕显示两个定时器。数据更新定时器和显示更新定时器连接的功能函数分别为static void leddm_timer_handler_update_display(unsigned long data)和static void leddm_timer_handler_update_data (unsigned long data)。5.3.2 接口函数(1)设计所需要的文件操作,定义file_operations结构体。static struct file_operations leddm_fops = .owner = THIS_MODULE, .open = leddm_open, .llseek = no_llseek, .ioctl = leddm_ioctl, .release= leddm_release,;(2)open方法:重新注册为static int leddm_open(struct inode *inode, struct file *filp) leddm_info( Entry leddm_open !n ); filp-private_data = leddm_cdevp; return nonseekable_open( inode, filp );(3)relese方法:重新注册为static int leddm_release(struct inode *inode, struct file*filp);(4)ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。在此次设计中重新注册为static int leddm_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)。cmd由4个部分组,它们分别是设备类型、序列号、方向、数据尺寸,分别占8bit、8bit、2bit、14bit。5.3.3 字符驱动程序实现驱动模块主要任务是读取用户的命令去控制硬件。此次广告牌功能设计体现的是LED显示功能,故获取从控制模传来的点阵块数到显示是一块比较复杂的过程。驱动模块处理从控制模传来的点阵块数据流程如图5-3所示。图5-3 信息显示流程图驱动模块主要功能函数介绍:(1)更新显示数据函数:屏幕的显示方式有两种。一种是横向移动,每一次刷屏将第下一个显示的数字放到第当前位置带到向左移动。另一种是纵向移动,每一次刷屏的时候将下一行当前位置的数据放到当前显示位置,即可实现向上移动。实现此功能的函数为leddm_update_data(void)。(2)更新每一行函数:此设计中LED屏是1/16扫,按行进行刷屏的,实现此功能的函数为leddm_update_display_send_line(int line,intflag )。根据当前数组的数据信息将4953芯片的data引脚输入高低电平。(3)更新显示屏函数:leddm_update_display_screen(int flag)。(4)更新显示缓冲区开关函数:将数据缓冲区内的数据送入到显示缓冲区,实现函数为 leddm_display_buffer_toggle(void)。5.3.4 退出模块退出模块函数主要是释放申请的内核空间,设备,设备号,定时器。主要实现代码:device_destroy(leddm_cdevp-leddm_

温馨提示

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

评论

0/150

提交评论