受的体积。与国外相比,国内从事嵌入式技术起步比较晚,没有自己生产嵌入式芯片的能
基于ARM9的嵌入式Linux系统研究及设备驱动程序的开发力,在嵌入式操作系统方面有自主知识产权的产品也很少,在这方面,源代码开放的Linux已经逐渐成为国内公司与国外厂商争一日之长的有力武器。国内许多公司也在做嵌入式Linux的开发,有以下几种产品:PocketIX OS:PocketIX OS是由广州博利思公司推出的嵌入式Linux产品。这个系统在2.2.13内核的基础上进行了改善,保留了x窗口、浏览器以及文件管理和文字处理功能,并且具有体积小巧、运行速度快的特点。该系统在网络终端、Pocket PC、个人数字助理、电视机机顶盒、车载导航、智能家电等方面有不错的表现。CC-Linux:CC-Linux是由中科院软件所、国防科技大学、西北工业大学等和几家具有雄厚研发能力的公司共同完成。包括嵌入式Linux内核、嵌入式图形环境CSGUI、嵌入式配置工具和开发环境SDK/ETK、系统应用软件等子系统。CC-Linux为高效可用的面向Internet应用设备的嵌入式Linux操作系统,目标产品为机顶盒和PDA[14-18]。CC-Linux对通用的Linux进行了合理的裁剪,实现了支持多种文件系统、软实时、电源管理、多平台和多线程支持等特点,这使得该系统实际上已经成为中国嵌入式操作系统的经典之作。此外,在市场上还有红旗嵌入式Linux、蓝点点嵌入式Linux系统、网虎科技推出的COVENTIVE等。“863计划”重点支持项目中也有使用Linux作为嵌入式操作系统开发的方向。它们所具备的共同特点如下:(1)精简的内核,应用的处理器广泛。这其中包括:x86、StrongARM、ARM、MIPS、Power PC等。(2)提供完善的图形用户接口和图形化界面(3)提供嵌入式浏览器、多媒体播放器、邮件管理、文本编辑软件等应用程序。(4)提供完整的开发工具和SDK,用户可以根据自身的需求,对其提供的开发版本进行一定的修改,以满足不同的需求。嵌入式Linux已经在消费电子设备中得到广泛应用,基于嵌入式Linux的手持设备和智能手机已经具有了很大的市场。1.3 ARM9平台正是因为Linux具有良好的硬件平台普适性,使得其可以方便的移植到ARM处理器上。ARM处理器核已经有6个系列产品:ARM7、ARM9、ARM9E、ARM10E、SecureCore及较新的ARM11系列。进一步的产品来自于合作伙伴,例如:IntelXscale微体系结构和StrongARM产品。ARM7、ARM9、ARM9E和ARM10E是个通用处理器系列。每个系列提供一套特定的性能来满足设计者对功耗、性能和体积的需求。ARM9系列微处理器包含ARM920T、ARM922T和ARM940T这3种类型内核,主要应用于无线设备、仪器仪表、车载设备、机顶盒、智能手机和数字摄影机等。目前市场上得到广泛应用的ARM处理器一般都是使用了ARM7和ARM9内核,后者性能比较突出,主要用于高端设备,而前者价格低廉在工业控制中得到较大的推广。ARM9核对ARM7核的功能进行了显著提高和增强。ARM9和ARM7一样不仅支持Thumb指令,并支持片上调试。而ARM9最主要的是将指令流水线由3级增加到5级。其实ARM9使用5级流水线也是受到StrongARM流水线的启发而设计的,并针对StrongARM的某些不足加以该进,从而获得更好的性能[19-20]。据LinuxDevices最新的嵌入式Linux市场分析预测报告,ARM处理器是使用最多的嵌入式开发架构。有30%的项目在使用ARM,而26%左右的项目在使用x86架构。可以预计,ARM处理器在未来几年的使用率将继续保持第一位。
1.4设备驱动设备驱动程序是进入Linux内核世界的大门,对整个系统的运行起着至关重要的作用。对嵌入式Linux设备驱动的研究,有助于深入理解嵌入式Linux内核代码。设备驱动程序在Linux内核中扮演着重要的角色,它们如同一个个独立的“黑盒子”,隐藏了设备具体的工作方式,而用户只需要根据已经定义好的内部编程接口即可以完成对特定的硬件的操作。Linux所支持的每一款硬件,一定要有配套的驱动程序,否则它就无法在Linux系统下发挥功能。也就是说没有设备驱动程序,就不会有功能完整的运行系统。嵌入式系统设备的
多样性导致了不同的系统需要开发者自己制定设备驱动程序,来配套操作相应的硬件设备,这就决定了驱动开发占据了嵌入式系统开发的主要地位。而免费开源的Linux在嵌入式领域的发展为我国发展自己的嵌入式操作系统,扭转软件市场的被动局面,提供了难得的机遇,也为振兴国内软件行业中找到了最佳突破口,使我国有机会迎头赶上国际的先进水平。因此嵌入式Linux设备驱动程序的开发和研究具有重要的社会和商业价值。1.5本文主要工作本课题根据嵌入式系统发展的情况以及实验室条件限制,选用了基于ARM920T核的S3C2440处理器,对嵌入式Linux的内核移植、驱动设计进行了研
第一章主要介绍了嵌入式系统的课题意义以及国内外Linux发展的研究现状。第二章主要介绍了实验平台的各种接口配置和硬件电路结构第三章介绍了嵌入式Linux的构建过程。首先介绍了交叉开发环境的搭建,本文未使用常用的交叉编译工具链,而是针对实验平台的特点选用设当的软、硬件搭建了相应的开发环境;其次介绍了Uboot引导程序的开发,针对目前Uboot的优缺点,改善了Uboot启动时对储存器的配置要求;再次就是在上面的基础上移植了Linux内核和制作了相应的文件系统。第四章介绍了设备驱动的开发,这主要包括LCD驱动、USB驱动以及网络设备驱动的设计。
兰州理工硕士论文7第2章实验平台硬件分析本平台使用的硬件系统是友善之臂的mini2440开发板,这是一款实用ARM9开发板,它采用Samsung S3C2440为微处理器,并采用稳定的CPU内核电源芯片和复位芯片来保证系统运行时的稳定性。其实物图如图所示:图2.1开发板电路结构2.1平台总体结构分析Mini2440提供了丰富的外部资源,足以支持一般的开发任务,图2-3是平台功能框图:
基于ARM9的嵌入式Linux系统研究及设备驱动程序的开发8S3C2440处理器时钟复位电路NandFlashLCD串口系统扩展接口按键及LED电源电路USB口网口JTAG口图2.2结构框图各部分功能分析如下:(1)Samsung S3C2440A处理器:其主频为400MHz,最高533Mhz(2)SDRAM内存:64M SDRAM包括32bit数据总线以及高达100MH频率z时钟,其主要用于系统调试和程序的运行(3)FLASH存储:128M Nand Flash以及2M Nor Flash,前者掉电非易失,后者可以直接运行简易的测试代码。该部分主要用于存储系统引导程序、操作系统、文件系统以及在系统掉电后需要保存的用户数据。(4)时钟和复位电路S3C2440通过外部12MHz的时钟输入,经过内部锁相环可以倍频到400MHz,而复位电路可以完成系统上电复位以及运行时的用户手动复位。(5)LCD显示板上集成4线电阻式触摸屏接口,可以直接连接四线电阻触摸屏,支持多种屏幕。(6)以太网接口采用DM9000网卡芯片,它可以自适应10/100M网络,RJ45连接头内部已经包含了耦合线圈,因此不必另接网络变压器。(7)USB接口开发板具有两种USB接口,一个是USB Host,它和普通PC的USB接口是一样的,另外一种是USB Slave,一般用于下载程序到目标板。(8)JTAG接口用于系统调试,借助于边界扫描技术的方式对芯片进行内部访问,可对系统进行调试和编程。2.2处理器性能分析S3C2440是三星公司推出的16/32位RISC微处理器,针对手持设备和一般应用市场中对低功耗、高性价比的需求,提出的解决方案。其采用了ARM920T的内核,0.13um的CMOS标准宏单元和存储器单元,并集成了以下片上功能:
兰州理工硕士论文9(1)1.2V内核供电,1.8V/2.5V/3.3V存储器供电,3.3V外部I/O供电,具备16KB的I-Cashe和16KBDCashe/MMU微处理器(2)LCD控制器(最大支持4K色STN和256K色TFT)提供1通道LCD专用DMA(3)4通道DMA并有外部请求引脚、3
通道UART、2通道SPI、1通道IIC-BUS接口(4)USB主机/设备、4通道PWM定时器和1通道内部定时器/看门狗定时器、8通道10比特ADC和触摸屏接口[21-23]除了这些以外,在系统管理器上也提供了灵活多变的特性,这些特性包括:(1)支持大/小端方式、高速总线模式和异步总线模式(2)共有8个内存块,每块空间最大为128M,使用时BANK0-6采用固定BANK起始寻址,BANK7具有可编程的BANK起始地址和大小。其内部配置的地址空间分配见图2-3图2.3内存结构图(3)支持MMU,MMU是指内存管理单元,它使用分页式管理机制。虚拟地址空间划分成称为页的单位,而相应的物理地址空间也被进行划分,单位是页桢。页和页桢的大小必须相同,页的大小定义为4KB或者8KB,当应用程序调用内存时,首先通过MMU,找到虚拟地址对应的物理地址,如果物理地址是在外部设备比如磁盘,则首先把物理地址对应的数据或者程序代码读入到内存中,并且更新PMM以反映这个变化。只有通过MMU,才能保护内存,并且使得系统不会因为进程的异常,而导致系统处于不稳定的状态。
基于ARM9的嵌入式Linux系统研究及设备驱动程序的开发102.3存储器电路分析存储器分为两个部分:SDRAM存储系统和Flash存储系统。其中SDRAM是易失性存储器,用于程序运行时提供数据空间,当系统上电或者手动复位的时候,MCU从0X0处执行系统初始化代码,比如建立系统和用户堆栈,存放代码运行时的数据等等。它使用了两片外接的32M bytes总共64M bytes的SDRAM芯片(型号为:HY57V561620FTP),它们并接在一起形成32-bit的总线数据宽度,这样可以增加访问的速度;因为是并接,故它们都使用了nGCS6作为片选,其物理起始地址为0x30000000,如图2-4所示:A023A124A225A326A429A530A631A732A833A934A1022A1135BA121nWE16nSRAS18nSCS19nSCAS17LDQM15UDQM39SCKE37SCLK38VDD227VDD114DQ02DQ14DQ25DQ37DQ48DQ510DQ611DQ713DQ842DQ944DQ1045DQ1147DQ1248DQ1350DQ1451DQ1553VDDQ03VSS254VSS141VSS028VSSQ352VSSQ246VSSQ112VSSQ06BA020VDD01VDDQ349VDDQ243VDDQ19A1236U6HY57V561620(32MB)/或其他兼容型号VDD33VLnWBE0LnWBE1LSCKELSCLK0LnSCS0LnSRASLnSCASLnWELADDR2LADDR3LADDR4LADDR5LADDR6LADDR7LADDR8LADDR9LADDR10LADDR11LADDR12LADDR13LADDR14LADDR24LADDR25LDATA0LDATA1LDATA2LDATA3LDATA4LDATA5LDATA6LDATA7LDATA8LDATA9LDATA10LDATA11LDATA12LDATA13LDATA14LDATA15图2.4 SDRAM结构图本实验平台还使用非易失的Flash存储器,即Nand Flash,型号为K9F1G08,大小为128M,其具有掉电非易失的存储特点,适用于存储编译好的系统内核。由于Nand Flash不具有地址线,它有专门的控制接口与CPU相连,数据总线为8-bit,其硬件电路结构如图2-5所示:VDD33VCLE16ALE17WE18WP19I/O029I/O130I/O231I/O332VSS13VCC12I/O441I/O542I/O643I/O744VCC37R/B7RE8CE9VSS36SE6U2
K9F1208LDATA0LDATA1LDATA2LDATA3LDATA4LDATA5LDATA6LDATA7nFWEnFREALEnFCECLERnBC100.1uFR610KVDD33V图2.5 NandFlash电路图
兰州理工硕士论文112.4电源和复位电路分析本平台的电源系统比较简单,直接使用外接的5V电源,通过降压芯片产生整个系统所需要的三种电压:3.3V、1.8V、1.25V(实测可能有偏差)。电路结构如图2-6所示:图2.6电源电路本开发板采用的复位芯片是MAX811,通过它来实现CPU所需要的低电平复位,其电路图如下所示:nRESETRSTSW-PB11223344U9MAX811R2470VDD33VC34104图2.7复位电路2.5接口电路2.5.1 USB接口USB总线是一种较新的串行总线标准,其在PC机和外部设备互联的速度较
快。USB总线具有性价比高、使用简单、支持热插拔、易扩展等特点,已广泛的应用于嵌入式系统中。在物理结构上,USB系统是一个星形结构,但在逻辑结构上每个USB逻辑设备都是直接与USB HOST相连进行数据传输的[24-25]。本平台有两种USB接口,包括是USB Host和USB Slave,前者可以像普通PC机上的USB接口一样接诸如USB摄像头、USB键盘和鼠标、优盘等常见的串行总线外设,后者一般用于下载程序到实验板中去。电路图如下所示:
基于ARM9的嵌入式Linux系统研究及设备驱动程序的开发121 2USB_ENR29 1.5KPDN0PDP0VBUS1D-2D+3GND4USB-HOSTUSB Port A typeVBUS1D-2D+3GND4USB-DEVICEUSB Port A type21R23 221 2R28 15K21R24 221 2R27 15KVDD5VUSB(HOST)SOCKETDN0DP0USB_5VUSB_D-USB_D+1 2R26 221 2R25 221 2R30 470KUSB使能引脚,使用GPC5图2.8 USB电路图2.5.2 LCD接口本平台的LCD接口有41个间距0.5mm的引脚,这包含了行场扫描、时钟和使能等控制信号,和RGB数据信号(RGB输出为8:8:8,色深为24位即可显示1600万色);除此之外还有PWM输出(GPB1可通过寄存器配置为PWM),和复位信号(nRESET),其中LCD_PWR是背光控制信号。而引脚37、38、39、40为触摸屏接口,它们可以直接连接触摸屏使用。图中的J2可以对LCD驱动板进行供电。LCD_PWRGPB1nRESET1234567891011121314151617181920212223242526272829303132333435363738394041LCDLCD41PVDDLCDVD0VD1VD2VD3VD4VD5VD6VD7VD8VD9VD10GNDVD11VD12VD13VD14VD15GNDVD16VD17VD18VD19VD20VD21VD22VD23GNDVFRAMEVLINEVCLKTSXMTSXPTSYMTSYPVMGNDVDDLCD123J2CON3VDD5VVDD33V图2.9 LCD电路图2.5.3网络接口电路本平台采用了DM9000网卡芯片,这是一个集成度较高的低功耗、高性能的以太网控制芯片,其采用LQFP48管教封装,与MCU连接有8bit/16bit模式,支持3.3V和5V的I/O控制,内置AUTOMDI-X功能10/100M PHY支持多种连接模式,并且配
兰州理工硕士论文13备了标准的10/100M自适应、16K大容量的FIFO、4路多功能GPIO、掉电和全双工等功能[26-28]。其图如下所示:图2.10网络芯片图2.6本章小结本章介绍了实验平台的各种硬件设备的接口情况,包括各种常用的设备。比如USB设备、网络设备、LCD设备等等。
基于ARM9的嵌入式Linux系统研究及设备驱动程序的开发14第3章嵌入式Linux系统构建如第2章的介绍可知本平台虽然硬件资源丰富,各种接口比较灵活,但要把完整的Linux直接移植到该平台上,还是不太可能的。因为Linux内核文件非常巨大,兼容了很多的硬件,能满足不同的开发要求,但这样的内核体积也是很大的,代码有几百万行,文件有几百MB之大,而我们的实验平台的存储器大小只有100多MB,要想把内核原封不动的移植过来是不太可能的,而且内核所有功能我们并不都需要。这就需要我们除了对硬件平台有较深理解之外,还要了解移植的一般过程。嵌入式系统和PC系统启动的方式类似,都需要有一定的引导程序,在PC机启动的时候,首先是加电自检,也就是运行BIOS系统。这个系统可以把系统从硬件启动过渡到软件管理中,为下一步的从硬盘中将操作系统调用至内存运行做好准备,而嵌入式系统的这种类似于BIOS的系统,我们称之为Bootloader[29-31]。这个程序可以作为系统的启动代码,通过运行这个程序,我们可以将开发板调整到适合载入嵌入式系统的状态,而Bootloader又和平台的硬件息息相关,我们就需要自己动手编写或者移植通用的Bootloader来实现这个过程。在本平台中通过裁剪Uboot来实现上述的过程。Uboot就是
一个在嵌入式系统开发中比较通用的Bootloader,但仍需要根据平台的特点进行一定的修改。所有上述的开发过程都需要在一个功能强大的平台中进行修改,因为嵌入式系统是一个资源有限的系统,想要在这个平台中进行软件的编程,开发和调试,基本上是不可能,但在PC机中确可以进行复杂的软件开发。所以现在唯一可行的办法就是通过将PC机和嵌入式系统进行一个的整合,生成一个交叉编译环境。这个交叉编译环境简言之就是按照平台的要求在PC机中生成可以在另一个平台中运行的程度代码。这样我们就可以在PC机(宿主机)中进行软件的交叉编译和调试,最终生成一个可在嵌入式系统中执行的程序。3.1搭建交叉开发环境嵌入式系统的软件开发与通常的软件开发的区别主要在于软件实现部分,其中又可以分为编译和调试两个部分,在搭建开发环境同样也分为两个部分。3.1.1交叉编译环境的搭建所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码,因为不同的CPU需要不同的编译器,而交叉编译功能就是把相同的程序代码翻译成不
兰州理工硕士论文15同的CPU可以执行的语言。通常在Linux环境下的ARM交叉编译器命名为arm-linux-gcc,交叉链接器为arm-linux-ld[32-33],交叉编译过程如图3.1所示:可供调试或者烧写的程序源程序交叉编译器目标模块库文件编辑器交叉链接器图3.1交叉编译图要生成和本平台对应的交叉编译器,主要分为三个部分:一是标准C编译器gcc;二是二进制工具binutils;三是库文件glibc。其中binutils主要用于生成一些辅助工具,如as、ld等;gcc用于生成arm-linux-gcc交叉编译工具(可以编译内核);glibc主要是提供用户程序使用的基本函数库。此外我们还可以使用GNU交叉工具链,但这种软件通用性不太好,编译容易出错。下面简述下软件的安装过程,首先我们从GNU的网站上(ftp://gcc.gnu.org/pub/)下载这些软件:gcc-4.3.0、glibc-4.3.2、binutils-2.15。我们将这些软件包放在同一个目录中,在使用Linux上,我们使用root权限,防止编译因为权限问题不通过。我们在/home/user目录下创建两个目录crosstools、tmp。我们将下载的3个软件压缩包先解压到tmp目录下:tar xvzf binutils-2.15.tar.bz2–C/home/user/tmp,以相同的方式解压其他两个压缩包。然后在crosstools中创建binutils文件夹,之后执行make install,将二进制工具包binutils安装起来。安装arm-linux-gcc比较复杂,一般需要安装两次。由于没有glibc的支持,第一次安装好的arm-linux-gcc工具是不能编译使用了C库的内核文件和其他程序的。所以需要我们对gcc的配置文件作出一定的修改,具体是给变量ATRGET-LIBGCC2_CFLAGS增加一个选项-Dinhibit-libc_D__gthr_posix_h,安装glibc软件包类似于以上的方法。等上述软件安装好之后,再次安装arm-linux-gcc。完成这些工作之后我们编写hello world!测试程序来验证编译工具是否已经成功安装。
基于ARM9的嵌入式Linux系统研究及设备驱动程序的开发163.1.2交叉调试环境我们知道调试对于程序的开发时非常重要的,它可以使开发出来的程序更加稳定。嵌入式系统的调试于一般的PC机程序调试有两个不同的地方:一是软件调试方式、二是硬件方式,但它们都具有如下的典型特点。(1)调试器和被调试器进程并不在同一台机器中运行,一般情况下调试器进程在PC机(宿主机)上执行,而被调试的进程则在各种定制的调试板(目标机)上运行。(2)调试器通过某种通信方式(串口、网络、并口、JTAG等)控制被调试进程(3)有时候我们可以在目标机上安装某种代理调试工具,用来和调试器相配合来完成目标机上的运行程序的调试。这种调试代理一般分为两类:一是有调试功能的硬件设备;二就是一些专门的软件调试工具。(4)通过在宿主机中运行根据目标机特性模拟出的系统仿真器,可以简化调试的复杂度,上述的情况虽然在物理结构上实现了一台机器运行不同的程序,但是在逻辑上还是有目标机和宿主机的区别[34]。下面分别对软件调试和硬件片上调试作详细的介绍和配置(1)软件方式软件方式调试主要是通过在目标机系统和调试器中分别添加相应的通