无线传感器网络中汇聚节点设计与实现_第1页
无线传感器网络中汇聚节点设计与实现_第2页
无线传感器网络中汇聚节点设计与实现_第3页
无线传感器网络中汇聚节点设计与实现_第4页
无线传感器网络中汇聚节点设计与实现_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

独创性(或创新性)秉承学校严谨的学风和优良的科学道德,本人所呈交的是我个人在导致谢中所罗列的内容以外,中不包含其他人已经或撰写过的研究成果;也不包含为获得西安电子科技大学或其它教育机构的或而使用过的材料。与我一同工作的对本做的任何贡献均已在中做了明确的说明并表示 关于使用的说校攻读期间工作的知识单位属西安电子科技大学。学校保留送交的复印件,允许查阅和借阅;学校可以公布的全部或部分内容,可以允许采用影印、缩印或其它保存。同时本人保证,毕业后结合论文研究课题再撰写的文章一律署位为西安电子科技大学。(的在后遵守此规定本属于,在 年后适用本书。 导师签名 日无线传感网络是一种新型的和处理技术,可以广泛应用到环境监测,中,汇聚节点是无线传感器网络最要的组成部分之一,它将各个传感器节点到Linux系统所实现的。力的支撑。重点研究了U-Boot软件的原理和嵌入式Linux操作系统,在此基础上,解决了如何在一个新的硬件平台U-Boot和嵌Linux操作系统的问题。最终,在自行开发的硬件平台上成功地加以实现。在嵌入式Linux系统下对汇聚节Thewirelesssensornetworkisanewtypeofdataacquisitionandprocessingtechnologycanbewidelyappliedtoenvironmentalmonitoring,health,agriculturaldevelopmentandotherfields.Atpresent,causedahighdegreeofattentionathomeandabroad.Aggregationnodeisthemostimportantpartofoneofthewirelesssensornetwork,itcollectedeachsensornodetothedataintegration,andservedastheresponsibilitytocommunicatewiththeoutsideworld.TheaggregationnodeinthisarticleforembeddedLinuxsystems.Thisprojectistorelyontheperceptionofagriculture-relatedtechnologySunlightGreenhouseswirelessmonitoringsystem.Wirelesssensornetworktechnology,thedetectionareaofthegreenhousemonitoring.Theuseofwirelesssensornetworkstocollecttemperature,humidity,lightintensity,soilcompositionandotherdata,combinedwiththeroleofthesefactorsonplantgrowth,toreduceconsumptioninagriculturalproductioncosts,andincreasecropyield.Thecontentsofthispaperaremainlythefollowingaccordingtotheneedsofthesinknode,theideaofembeddedsystemsdevelopment,aswellasthecharacteristicsoftheapplicationofwirelesssensornetworks,thesinknodeoveralldesign.Aggregationnodehardwaremoduleselection,aggregationnodedesignthroughtheysisofthevarioushardwaremodules,hardwareplatform,providesastrongsupportforthesubsequentdevelopment.FocusontheprincipleoftheU-BootsoftwareandembeddedLinuxoperatingsystemonthisbasis,tosolvetheU-BootandembeddedLinuxoperatingsystemhowtotransplantanewhardwareplatform.Ultimay,successinself-developedhardwareplatformtoberealized.SimpleconversionfunctionoftheaggregationnodeprotocolstackintheembeddedLinuxsystem.Keyword:WirelessSensorNetworksSinkNodeEmbeddedSystemProtocol第一章绪 研究背 国内外现 本文内容以及相关工 结构安 第二章汇聚节点的整体设 嵌入式系统的概念和特 汇聚节点的需求分 汇聚节点的系统设 汇聚节点的概要设 处理器的选 操作系统的选 汇聚节点硬件平台设 模 电源模 WLAN模 DB51接 本章小 第三章汇聚节点的系统软件设 引导加载程序 U-Boot启动的第一阶 U-Boot启动的第二阶 U-Boot在硬件平台上的移 PXA270寄存器的功能和配 移植过程中遇到的问题以及解决方 Linux操作系统移 无线传感器网络节点通信协议设 传感器网络链路层消息格 传感器网络层消息格 汇聚节点的协议栈转化设 汇聚节点的功 协议的转化设 本章小 第四章设备驱动程序的实 驱动程序的组织结 驱动程序的设 设备驱动程 NORFlash驱动程 MTD程序的配 MTD程序的接口与测 CF接口驱动程 CF卡的硬件特 CF卡和PXA270的接口设 CF卡驱动程序结 CF卡驱动程序的移植实 添加CF无线网卡驱 网络设备驱动程 Linux下网络设备驱动程序架 初始化与网络设 数据包的发送与接 CSA8900A移植实 本章小 第五章系统测 测试环境搭 软件测 提取全网传感器数据功 设定指定节点信道功 本章小 第六章总结与展 致 参考文 第一研究背无线系统和农业信息专家系统相结合,实现了对日光温室群信息的精确和收集监测数据。典型的传感器网络体系结构如图1.1所示。1.1究热潮。,中国科技大学,浙江大学,华技大学等单位纷纷开展了有线传感网络的研究。在国外,最早开始研究无线传感网络的是,在上世纪90年代,就已经注意到研究无线传感器网络技术的重要性,在二十一世纪初已经大量投资用于研究相关理论。其中无线传感器网络作为课程也已经在的各大高校中开办了,比较有代表性的就是公司与加州大学分校联合成立的“智能尘埃”。随着物联网的兴起,很多著名的公司和组织也在无线传感应用开发的无线通信协议,它定义了PHY和MAC层通口,从这线传感器网路技术得到了极大的发展。2006年能源部已经决定雇佣Honeywell15%。2006年韩国济州岛的一家渔场与现代公司合作OS和一套软件开发工具,这三部分组OSXscalePXA270处理器的开发平台,在原理图设计时充分等器容量配置等。ARM公司提供的SDT(SoftwareDevelopmentToolKitARM软件开发工具)软件进行JTAG(JointTestActionGroup,联合测试行动小组)硬件调试。重点研究了U-BOOTBootLoader实现中的应用,解决了BootLoaderU-Boot能够正确研究了LINUX嵌入式操作系统的特性及移植方法,解决了如何在一个新的LINUX操作系统。最后,对自己所设计的开发板的串口、网口等模块进行调试,并对其功能加以实现。最后对系统进试。第二章介绍了嵌入式系统概念、特点以及设计方法。根据嵌入式设计方法和U-BOOTLINUX操作系统,在此基础上,给出了在自行设计的硬件平台上移植U-BOOT和LINUX操作系统的方法。然第四章分别对几个重要的驱动程序进行了阐述,特别是网络设备驱动。最后实现了对CF和以太网接口的设备驱动程序到汇聚节点的移植。聚节在线传器络中着要的位它主负接收点的数据,这些数据行分析、合和预处,并将网中多个传器节点数据压一个数,传送给,有少信息次数,网络带宽。它不仅实现对无线传感器网络的管理,同时将无线传感器网络的数据传送到用户手中。汇聚节点是一个典型的嵌入式系统,它具备嵌入式系统所有强大功能。应用系统,对功能、可靠性、成本、体积、功耗严格要求的计算机系统。嵌入构成,其中,处理器是硬件系统的,要求其对实时多任务有很强的支持能力,可扩展等特点;相关支撑硬件包括一个嵌入式系统内存、I/O以它的系统要比我们传统使用的的PC机操作系统内核要小的多。 析、整合。同时,汇聚节点还可以将网络中多个传感器节点的数据压缩为一个数据包,传送给,有效地减少信息传输次数,这样可以有效的节省网络资源。配置大容量的Flash器,用来安装应用程序和保存数据。为了实现汇聚节点与GPIO的DB51接口来实现。汇聚节点还配置有无线接口、USB接口和CAN除CPU需要多种不同的电压外,还需要单独提供CF卡的电源,以避免CF卡插拔处理器的性能需求:汇聚节点不仅要对传感器节点的数据进行数据分设备需求:由于汇聚节点是传感器网络与用户之间的桥梁,它即要和表和设计中每种状态所发生情况总结,如图2.1处理器的处理器是硬件平台设计的部件,因此,处理器的选择在嵌入式系统开发中PowerPC,MIPSARM等。作为一种RISC结构的处理器,ARMARM系列中选择一款合适处理器作为汇聚节点的处理器。ARM处理器选择主要从以下几方ARMARM微处理器包含一系列的内核结构,以适应不同的应用领域,用户如果希望使用WinCE或标准LINUX等操作系统以减少软件开发时间,就需要选择ARM946T、Strong-ARMMMUARM7TDMI则没MMU,不支WindowsCELINUXuCLinuxMMU支持的操作系统可运行于ARM7TDMI硬件平台之上。ARM微处理器的处理能力。ARM7系列微处理器的典型处理速度为0.9MIPS/MHz,常见的ARM7系统主时钟为20MHz~133MHz,ARM91.1MIPS/MHz,常见的ARM9100MHz~233MHz,ARM10700MHz。不同对时钟的处理不同,有的只需要一个主时钟频率,有的内部时钟ARMUSB、UART、DSP、音频等功能部件提供不同频率内器的容大多数的ARM微处理器片内器的容量都不太大,需要用户在设计系统时外扩器,但有些具有相对较大的片内空间,如In的基于XScale片内的电扩展了相关功能模块,并集成在之中,我们称之为片内电路,如USB接口、IIS接口、LCD控制器、RTC、ADC和DAC、DSP协处理器等,设计者应根据系统的需求,尽可能采用片内电路完成所需的功能,这样既可简化系统的设目前,常见的嵌入式操作系统有WindowsCEVxWorksQNX和嵌入式Windows于那些对内存占用空间具有一定限制的设备。优点是基于Windows背景,与Windows系列有较好的兼容性,界面美观,容易为用户接受。但从技术角度上讲,WindowsCE有很多缺陷,该操作系统没有开源代码,使应用开发人员很难实现产VxWorks操作系统是WindRiver公司于1983年设计开发的一种嵌入式实的中断处理、支持POSIX1003.1b实时扩展标准、支持多种物理介质及标准完整的TCP/IP网络协议等。个实时的、可扩充的操作系统,遵循POSIX.1(程序接口)POSIX.2(S及工具,部分遵循POSIX.1b(实时扩展。它提供了一个很小的微内核以及一些可选性,使得用户可以根据实际的需求将系统配置成微小的嵌入式操作系统。QNX应嵌入式嵌入式LINUXGPL协议。由UNIX/LINUXC语言即可。嵌入式LINUX不仅支持数量庞大的硬件、优秀的网络功能,还拥有精悍的内核,运行CPUCPUCPU也完工。因此,要选择可移植性好的操作系统,避免因操作系统移植所产生的问系统及其提供的API,是否提供硬件驱动程序。的是采用开放源代码技术自行开发还是现成的嵌入式操作系统。当然,技术支持和服务也是选择嵌入式操作系统时必须要考虑的因一。LINUX代码采用C语言编写,移植性好,同时还支持多种处理器;LINUX应LINUX操作系统稳定,功能强大,支汇聚节点是一个嵌入式Linux开发平台。它以功耗低、功能强大的PXA270处WLANGPRSDB51接口六大部分组成。汇聚节点硬件结构如图2.2电源管电源管网管地址和数PXA270处理调试串GPRS模无线网USBUSBCF接USBCF接 模采用In公司的快速页面模式的StrataFlash,28F128J3C[16],工作电压3.3V,32位数据宽度(2片位扩展),4片In的28F128J3CFlash组成的64M字作为SDRAM。 电源模心板加板的设计思想,其中板上部署处理器、SDRAM、Flash以及一个DM9000A网卡控制器等部件,其余的接口部件部署在板上,两块板220VAC,50Hz12VDC的适配器来供电,板上的先将12V电压转换成5V,通过连接器向板提供5V电源, WLANPXA270处理器提供PCMCIA接口和CF接口,支16PCCard设备。使用CF接口的无线网卡,就可以实现主控节点的WLAN通信。CF无线网卡设备是NETGEAR公司MA701无线网卡[21],它的接口类型是CompactFlashV1.4、CFI/OII150米~35050米~100 DB51HIROSEDF9-51S-1V/P51针接口中的信号类型有:控制信号、中断信号、电源、LED显示、脉宽调制、同步/异步串口51针的接口可以叠加与传感器节点相同的射频收发模块。DB51DB51接口实现了汇聚节点的串口通第三章汇聚节点的系统软件设Linux内核、文件系统和用户应用程序。其中引导加载程序是系统加电后运行的第引导加载程序Linux系统可以分为四层:引导加载程序、Linux内核、文件系统和用户应用大多数Bootloader包括两种不同的操作模式在此模式下,Bootloader从目标机上的一个固态设备上将操作系统加载到RAM中并运行,整个过程是没有用户介入的。所以在产品完成发布时,Bootloder在此模式下,Bootloader将通过串口或者网络等从宿主机文件。接着再被Bootloader写到目标机上的固态介质中,或者直接进行引导。前者通常用于第一次烧写内核和根文件系统到固态介质时或者在以后的系统更新时使用;后者大部分是开发人员期开发过程中使用。通常在这种模式下工作的Bootloader都会给它的用户提供一个简单令行接口。U-boot是目前比较流Bootloder,本系统的汇聚节点就U-boot作为U-BootU-Boot的第一阶段是系统启动的最初阶段,主要是依赖与CPU体系结构的代1)所有中断。为中断提供服务通常是操作系统设备驱动程序的责任,Bootloader执行过程中可以不必响应任何中断。中断是通过写CPU的中断寄存器(ICMR)或状态寄存器(比如ARM的CPSR寄存器)来完成。设置CPU5)关闭CPU内部指令/数据Cache为加载第二阶段代码准备RAMRAM空间中来执行,BootloaderRAM空间范围。通1)BootLoader可执行映像在固态器设备的存放起始地址和终止地址。通BootLoaderBootLoader代码2)目标地址。本文目标地址为0xa3f80000,用TEXT_BASE表示设置堆栈指针SP跳转到第二阶段代码的C点上述一切就绪后,就可以跳转到BootloaderU-BootU-Boot的第二阶段的代码通常用C语言实现,提高了代码的可读性和可移植命令“ldrpc,_start_armboot”直接跳转的start_armboot函数用C语言写的,位于/lib_arm/board.c中。这个阶段主要完成下面几方面工作:初始化至少一个串口,以便向终端用户进行I/O初始化Flash、SDRAMLED的灯点亮,用来表明U-Boot已经进入main()数执行,在设备初始化完成后将器在Flash上的内核映像到预留的RAM空间之前,先确定这些预留RAM空间哪些真正映射到RAM启动参数有ATAG_CORE(标记列表的开始,AG_MEM(内存映射情况,,AG_INITRD(,AG_NONE(如果用户在环境变量里设置了bootcmd的值,则U-Boot会自动调用bootm启动内核,在bootm的源代码中,最关键的函数是thekernel(,这个函数的功能是用U-Boot调用内核的方法是直接跳转到内核的第一条指令处,也就是直接跳转SVCU- 为了新的平台移植U-Boot,首先要做的工作就是在board 。本文为所设计的pxa270开发板建立了一个名为pxa270的 u-boot.lds以及pxa270.c。其中,config.mk用来记录U-Boot到内存的址,flash.cFlash,memsetup.S用来初始化配置内存,u-boot.lds是内存连接器的文件,pxa270.c则完成开发板的初始化工作。除了建立一个新开发板的并编写该下的相关文件,还需要在/include/configs下增加一个汇聚节点的配置文件pxa270.h,这个配置文件和硬件系统配置紧密相关,主要记录汇聚节点硬最后,为了实现U-Boot在所设计的平台上正常运行,需要参考PXA270参考手册,对pxa270.h配置文件进行修改。下面对汇聚节点的PXA270寄存器和PXA270置主要使用到三个非常重要的寄存器,分别为CCCR和CKEN寄存器。CCCR寄存器主要控制着内存、LCD、DMA控制器所使用的时钟,这些时钟都是有处理器的13MHz时钟倍频产生的,其控制倍频的比例参数见表3.1。M:运行模式1、21.0、1.5、2.0下面将具体解释CCCR寄存器是如何设置内存频率因子、运行模式因子以及根据上面 系统的最小需求,最少应为FFUART提供时钟。CKEN设置为0x 用寄存器进行设置,下面本文将对PXA270的寄存器功能进行详细分析,并对一些通用的GPIO进行配置。XScalePXA270GPIO3632位寄存器,GPIOI/O使用,也可以将它们配置成具有第二功94121GPIO9PXA2709GPIO引脚相对应[13]PXA270处理器GPIO的分类见表3.2。3.2PXA270GPIOPXA270处理器GPIOGPIO对应其相应的功能,具有功能请参考PXA270参考手册。本文主要对所设计的汇聚节点的串口、网卡FlashGPIO寄存器进行配置,只有对它们进行正确的配置,系统启动才能成功。汇聚节点硬件平台通用GPIO的配置在#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#define#defineU-Boot启动成功启动后,一般情况只能满足通过串口数据,U-Boot支持网络功能,能够通过网络快速数据,从而加快开发进度。在硬件平台设计时,nCS4作为网卡的片选信号,参考DM9000A参考手册,将基址定义为:#define 硬件平台的网络控制器,采用16为的数据带宽,于是将在硬件配置文件#define 至此,本文完成了汇聚节点硬件平台相关的配置文件,接下来将进行U-移植过程中遇到的问题以及解决方在Flash中,以实现对系统的引导。当进行烧写引导加载程序U-Boot时,遇到Flash_0_4.32.datFlashID识别,本文将根据Flash_0_4.32.datFlashFlash_1d_4.32.dat文件,以便通过JFlash将系统的引导加载程序成功烧写在Flash中。调试窗口如下图3.1所示。图 JFlash调试窗DM9000A网卡在复位之后,需向0x0a和0x0b两个地址交替写入任意数0x28H0x29H两个地址可以读出I/O0x10000000,而DM9000A网卡的片内寄存器地址的偏移量是0x4000,所以网卡ID所对应的地址当是0x10004028和0x10004029。本文设计的汇聚节点的DM9000A网络控制器采用的是VLIO工作模式,nCS4为片选控制信号。MSCxFlash和网卡,MSCx寄存器共有三6nCS[1:0]、nCS[2:3]nCS[4:5]。只有这个寄存器配置正确,其对应的片选信号才能使能相应的静态器。查看DM9000AnCS4MSC2,因此对硬件平台的异步静态内存控制寄存器MSC2配置如下:#define 而又有效的调试。但是,经常会碰到串口终端显示乱码或根本没有显示。在U-Boot启动时[29]U-Boot对串口的初始化设置不正确或运行在host端的终端仿真程序对串口的设置不正确,包括:波特率、奇偶校验、在U-Boot的运行过程中可以正确的向串口终端输出信息,但U-Boot启动内U-BootU-Boot所用的内核址必须与内核映像在编译时所用的运行址一致,即都为0xc0000000。LinuxU-Boot主要为操作系统内核准备好正确的环境,起到引导Linux内核的作用。移植完成后,接下来要进Linux内核移植工作。Linux移植就是根据目标平台和本文将先分析Linux内核启动过程;然后针对所设计的硬件平台,建立平台文件,嵌入式LinuxCPU和体系结构的检查、CPU本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些vmlinuxvmlinux的过程。启动过程从内核映像开始执行,解压缩vmlinux并转换到虚拟地址空间,在调用统一的内核启动函数start_kernel(),从而启动整个Linux系统。从内核代码的角度来分析,内核启动流程如图3.2所示。3.2start_kernelsetup_arch作为执行的第一步,在其中完成特定于体系结构的设置。这包括初始化硬件寄存器、标识根设备和系统中可用的DRAM和Flash的数代码,其中press_kernel()子程序主要用来进行解压缩,而call_kernel()子程序则完成启动vmlinux的任务,并将控制权完全交给vmlinux执行。 因为它强加了限制:指定在内存中,每个参数必须位于param_struct中的特定偏移量处。的内核期望参数作为标记列表的格式来传递,并将参数转化为已标记格ARMLinux内核启动过程和移植过程进行简单的分析。为了使启动操作系统的正常启动。zImage映像自引导程序与体系结构相关,位于/arch/arm/boot/head.S中,它的执行流程如下#if#if(TEXTADDR&#errorTEXTADDRmuststartat0xXXXX8000这个阶段首先设置CPSR寄存器状态,确定SVC模式并关闭IRQ、FIQ调用_lookup_processor_type,判断processor类型,如果找不到则退出;判断architecture_type,调用_lookup_architecture_type,如果找不到则退出。创建页表,调用_creat_page_tables,为内核映射4M的RAM空间。返回_retcpl5寄存器,打开MMUcache、buffer和系统保护。arch_typestart_kernel(init/main.c),真正开始内核初始化的工作。由于在启动代码U-Boot中正确设置了内核运行前所需要的参数,那么在进入start_kernelinit和bash进程,引导kernel进入s中。至此Linux操作系统内核获得控制权。汇聚节点选用Linux2.6.10本版作为操作系统,在/arch/arm/mach-pxa中已有XScale处理器的支持汇聚节点选用的PXA270是In公司基于XScale核的处/arch/arm/mach-pxa下为汇聚节点建立对应的平台文件,编写与此硬件平台相关进行新制作的汇聚节点上移植Linux内核时,首先要建立汇聚节点硬件开发平structmachine_desc每个硬件平台都需要一个描述相关平台的structmachine_desc的结构变量。这个宏定义从MACHINE_STARTMACHINE_END宏结束,移植内核时,MAINTAINER(“AccelentSystemsPxa270”)BOOT_PARAMS)其中 pxa270,名字定义为“AccelentXscalePxa270台类型pxa270必须在arch/arm/tools/mach_type在BOOT_MEM(pram,pio,vio)宏定义中,参数依次定义为:内存物理地址、I/OI/Ovio/include/asm-arm/arch-pxa/hardware.h#define +(x)&0x01ffff)+(x)&0x1c000000)>>1对pxa270的定义可解释为物理地址为0xa I/O开始。宏BOOT_PARAMS根据Bootloader的配置,设置启动参数的存放地址;宏MAPIOI/OINITIRQ定义了中断初始化函数;宏INIT_MACHINE定义了板级初始化函数。structmap_descstructstructunsignedlongvirtual;unsignedlonglength;unsignedinttype;}示地址空间的长度,type描述地址空间的类型,它们取值可以为MT_DEVICE、MT_ROM中的一种。本文所设计的硬件平台Flash起始地址为0x 在Linux内核根中的Makefile文件中,主要修改ARCH和 定义。ARCH默认时为X86,而XScale是ARM体系结构的处理器,所以应设Kconfig中定义了汇聚节点硬件平台的类型Obj-selectPXA27xogrr/c-p/selectPXA27x至此,本文已经完成了汇聚节点的U-Boot、Linux内核移植等工作,将其进行编译,到所设计的硬件平台上,系统能够成功运行,达到预期效果。在本文中,我们使用Atmel公司生产的AT86RF230作为通信模块,AT86RF230是一款基于ZigBee/802.15.4而设计的工作于2.4GHz频段的射频。片内发送数据和接收数据的缓冲分别为129字节和130字节,正好可以满足IEEE802.15.4协议规定的最大帧长度127字节的要求,发送时需要加2字节的CRC16,接收时还要多加1字节的链路质量指示。在通信协议栈设计上面,严格按照IEEE802.15.4标准来设计的。传感器节点之间的通信使用的消息类型message_t,其格式如图3.3所示。message_theader、data、footermetadata,每部分的大小随着平台的不同而不同。message_t为TinyOS通用的消息类型,在每个平台下,通过platform_message.h文件来重新定义message_header_t、message_footer_t以及型为message_t的消息进行通信。下面对针对RF230协议栈中消息格式的定 data[TOSH_DATA_LENGTH]; }head

{nxle_uint8_tlength; } Bit:0-34567-10-12-14-帧类使理请内保目标地址模保Bit:0-34567-10-12-14-帧类使理请内保目标地址模保源地址模否则不需要应答;dsn为数据序列号,用来使确认帧和数据帧或者命令帧相匹配,dsn赋值给相对应的确认dsndsn重传该帧信息;destpanPANPAN0xFFFF时代表广播传送方式,对当前侦听该信道的所有的PAN设备都有效,即在该通信信道时,代表广播地址,对网络中所有当前侦听该信道的设备均有效;src为发送节点的地址;type为消息类型,唯一的标识该数据包。datadata802.15.4MAC帧的数据单元,路由层数据包允许用户在编译应用程序时通过编译选项-DTOSH_DATA_LENGTH=x来更改默认值,x为数据长度值。footerfooter域一般用来对数据帧的校验值,接收方根据该校验值可判断数据在metadatarf230packet_metadata_t{uint8_tflags;uint8_tlqi;//链路质量uint8_t rf230packet_metadata_t{uint8_tflags;uint8_tlqi;//链路质量uint8_t //uint32_ttimestamp;//D0x01,//数据包是否被确认= //RF230PACKET_TXPOWER=0x04, //数据包传输能量域有效RF230PACKET_RSSI=0x08, //数据包传输RSSI域有效RF230PACKET_TIMESYNC=0x10, //是否时间同步RF230PACKET_CLEAR_METADATA=0x00,//所有的域均无效3.6RF230metadata传感器网络的网络层消息封装在链路层消息的data域中,根据通信模式不同,数据,CTPcollect_id来标识每一种数据包,当汇聚节点接收到数据包后,通过collect_id据。其数据格式如图3.7所示。CTP数据传感器

collect_id=传感器类型:01:温 02:湿 03:光04:CO2浓 05:土壤温 06:土壤湿3.7seq_no占一个字节,为应用层序列号,每发送一个传感器数据该字段值加一,设置该字段的目的是用来剔除重复的传感器数据包;sensor_type占一个字节,标识传感器类型,01代表空气温度,02代表空气湿度,03代表光照强度,04代表大气CO2占两个字节长度。由于最多可以发送20个字节的用户数据,因此我们一次最多可其数据格式如图3.8所示。CTP状态

collect_id=„状态类型:01:节点类 02:剩余电3.8其数据格式如图3.9所示。„neighbor_infoneighbor_infoneighbor_info拓扑数邻居节链路点信3.9其中,length的含义和传感器数据包中的length域相同。parent_id表示父节点数据结构neighbor_info表示除父节点以外的其他邻居节点的链路信息,其内容包括邻居节点的地址以及该节点与邻居节点之间的链路ETX值,共占用节,由于一次最多可发送20个字节的用户数据,因此除父节点之外,我们最多可发送三发数据包中,通过Root下发到网络中,普通节点接到该分发消息后,通过对命令的解析执行相应的操作。我们规定分发协议使用key等于42来标识分发令包。bit16-7位为保留位。图3.10列出了分发命令的格式。key=分发数有效载01234501234567命令类传感器节点状节点拓设置节设置节设置节据上数据上信息上运行状通信信类3.10bit3置位时,dubug_statedebug_state1时表示节点处于调试模式,节点软件中设置的指示灯都会打开,否则全部关闭。当bit4置位时,字段channelnode_id有效,其中channel占一个字节长度,node_idnode_id进行比较,如果匹配则将自己的通信信道设置为channel指定的值,channel取值范node_type占一个字节长度,节点接收到命令后,也是通过地址匹配来决定是义不同令并将其封装在广播数据包中,通过Root下发到网络中,普通节点接length域标识了有效节点地址所占的字节长度,例如当需要重传网络中两个节点的传感器数据时,length4,这样设计是为了方便得到广播命令包中有效节点的个数,node_id为节点地址,占两个字节。由于广播消息头占用了三个字址。图3.11列出了广播命令格式。有效载定节定节感器数01234567node_idnode_id命令类3.11当bit0置位时,节点接收到命令后,通过将自己的节点地址和数据包中的节点DB51接口,通过它可以外接传感器节点。一方面,感知节点通过自身的无线通讯模块(如CC1100、CC2420等)可以实现与其它传感器节点间的簇内通信;DB51DB51DB51将数据发送给汇聚使用DB51扩展接口的好处是可以不考虑传感器节点的通信方式,即不管感知CC1100CC2420DB51的扩展接口,就Linux下的Socket编Linux系统的套接字(Socket)windows类似,用来进行主机之间的通信。(SOCK_STREAM(SOCK_RWstruct这个结构用来套接字地址,在Linux内核头文件structstruct{sa_family_tsa_family; structsockaddr_in unsignedshortint structunsigned//////pad[ -sizeof(shortint)sizeof(unsignedshortint)-sizeof(structsa_family是地址,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET。sa_data是14字节协议地址,包含一些电脑的地址、端口和套接字bind、connect、recvfrom、sendto等函数的参数,指明价的数据结构structsockaddr_in。struct这个结构提供了方便的来socketaddress(structsockaddr)结构中的每一个元素,在Linux内核头文件/include/linux/in.h中定义。代码如下表所示。sockaddr_in(使用bzero()或者memory()函数。由于两个结构占用同样大小的内存空间,可以使用强制类型转换将structsockaddr_in类型的变量转换为structsockaddr的结构。sock()structsockaddrTCP/IP的编程,structsockaddr_in类型更易于使用。要注意的是,在structsockaddr_in中,sin_family相当于在structsockaddr中的sa_family,需要设成“AE_INET”。最后一定要保证sin_port和sin_addr是网络字节序的。struct4IP地址(按网络字节顺序排放structstructin_addrunsignedlongDB51扩Linux对设备的是通过设备文件来进行的,设备文件位于系统的下面,例如ux下的/de/tt0表示的是串口1我们的串口打开操作函数op_ra()主要完成打开串口并对串口的属性进行设置,相关的部分实现代码如下。structstructtermiosif(inout_stream<0){fprintf(stdout,"Cannotopenserialdevice%s\n",serial_port);}tio.c_cflag=MICA2_BAUDRATE|CS8|CLOCAL|在使用系统函数open()打开串口后得到一个文件的描述符inout_stream,通过此read()循环地从串口一个字符,判断是否为有效的数据包起始符0x7E,如果不 while(input_buffer[0]while(input_buffer[0](char)(0x7E)){while(1!=read(inout_stream,input_buffer,1)){}}count=//Readpacketwhile(count<}转发数据之前需要先调用系统函数socket()建立一个新的socket,即向系统注SOCK_DGRAM指定建立的是数UDPSocket编程中需要注意的一个Internet上数据以字节优先的顺序在网络上,所以对于在内部以低字节优先方式数据的机器,在因特网上传输数据时需要进行转化,这里使用structsockaddr_in类型的结构体serv_addr实现以上转换。部分代码实现如下表。structhostent*host;structhostent*host;}1){perror("socket}其中“9IP地址。gethostbyname成功hostentperror()if((sendbytes=sendto(sockfd1,buf,TOS_PACKET_LENGTH,0,\(structif((sendbytes=sendto(sockfd1,buf,TOS_PACKET_LENGTH,0,\(structsockaddr*)&serv_addr,sizeof(structsockaddr)))==-1){}除了最后两个参数以外,其他的参数和系统调用send()时相同。其中参数serv_addr为指向包含目的IP地址和端的数据结构sockaddr的指针,最后一个参数为此结构体的长度。系统调用sendto()返回实际发送的字节数,如果出错则返协议转换程序做实验。一个声音的传感器节点通过DB51接口与汇聚节点连接,汇聚节点通过以太网接口与PC相连。传感器节点把通过无线方式(例如Linux系统采用TCP/IP协议并提供Socket网络接口服务,对接收到的信息进行解析并转发到远端的管理节点PCPC端运行Ethereal抓包工具,可以对接收到的数据报协议进行分析。实验结果如图3.3所示。图 驱动程序的组织结devcesdevices)和网络接口(Networkinterfaces)[8]。只能按照一定的顺序读写。字符设备是Linux系统中较为简单的一类设备,可以通过在/dev下的设备文件,像普通文件一样去字符设备。字符设备驱动程序一般都要实现两种系统调用:open/release和read/write。般是2的n次幂字节。块设备基本是允许随机的,和字符设备不同的是,块设备是通过/dev下的设备文件进行的。内核内部对数据的管理方式,是字符设BSD套接口来访在Linux系统中,设备被一个主设备号和一个次设备号所标识。主设备号标识号仅由设备驱动程序解释,大多数用于识别在一些可能的硬件设备中,I/O请求涉以设备驱动程序为用户应用程序了硬件的一些繁琐细节,Linux中的设备管理应用设备文件这个概念统一了设备的接口。这样,根据用户应用程序来看,硬进。用户应用程序与字符设备和块设备之间的通信关系如图4.1所示。用户应用程用户应用程系统调用接高速缓内核高速缓字符设块设设备驱动程硬件设硬件设4.1在Linux系统中,大部分的字符设备和块设备驱动程序的操作都用到了以下几struct在Linux系统中,字符设备和块设备都是设备文件来进行标识,内核中设备文并传递给在这个文件上需要进行操作的所有函数,直到最后的close函数为止。在structdentry*f_dentry:dentry结构是VFS中文件管理的重要结构,它记录structfile_operations*f_op:所有与文件相关的操作函数的接口。系统内核open操作的时候对这个指针进行赋值,以后需要处理而调用的时候就会读1的openfilp->f_op中的操作,这种方loff_tf_pos:当前的读/写位置。loff_t是个64位的数,可以这个值,但是不能直接对它进行修改,除非使用了llseek的方法;structinode在内部表示文件,对于单个文件可能会有许多个表示打开dev_ti_rdev:对表示设备文件的indoestructblock_device*i_bdevinode个块设备文件时,该字段包含了指向block_device设备文件时,该字段包含了指向cdev结构的指针。structfile_operations与structblock_device_operations分别是字符设备和块设include/linux/fs.h文件中,驱动程序的编int(*open)(structinode*,structfileint(*release)(structinode*,structfile设备驱动程在Linux下,MTD(MemoryTechnologyDevice,技术设备)是用设备(ROM,Flash)的系统。MTD的主要目的是为了使新的设备驱动变得更加简备想。MTD的所有源代码在drivers/mtd子下。这里,以CFI(CommonFlashInterface,通用Flash接口)MTDLinux4层(从设备节点直到底层硬件驱动4.2所示。 的NORFlash驱动遵循CFI接口标准,其驱动程序位于drivers/mtd/chips子目录下;NANDFlashdrivers/mtd/nand子下。NANDFlash也有通用的时序可设备ID等信息,从而实现驱动程序的自动加载。MTDMTD原始设备的通用代码;另一部分是各个特定的Flash的数据,例如分区。用于描述MTDdrivers/mtd/maps/子下存放的是特定的Flash的数据,每个文件都对应了相关硬件平台上的Flash。MTDMTD原始设备,LinuxMTD的块设备(主一系列字符设备操作函数在mtdchar.c中实现。MTD块设备则是定义了一个描述MTD块设备的结构mtdblk_dev,并了一个名为mtdblks的指针数组,该数组中的每个mtdblk_dev成员与mtd_tablemtd_info一一对应。设备节点:通过mknod在/dev子 下建立MTD字符设备节点(主设备31,根文件系统:在bootloader中将建立在Flashmount命令将建立在Flash中的分区作为文NORFlash驱动程NORFlashLinuxNORFlash驱动程序,通常放在 下。在驱动程序的在struct{char*name;unsignedlongsize;unsignedlong#defineNO_XIP(-1UL)voidiomem*virt;void*cached;intSmap_word(*read)(structmap_info*,unsignedvoid(*copy_from)(structmap_info*,voidstruct{char*name;unsignedlongsize;unsignedlong#defineNO_XIP(-1UL)voidiomem*virt;void*cached;intSmap_word(*read)(structmap_info*,unsignedvoid(*copy_from)(structmap_info*,void*,unsignedlong,ssize_t);void(*write)(structmap_info*,constmap_word,unsignedlong);void(*copy_to)(structmap_info*,unsignedlong,constvoid*,ssize_t);void(*inval_cache)(structmap_info*,unsignedlong,ssize_t);void(*set_vpp)(structmap_info*,int);unsignedlongmap_priv_1;unsignedlongmap_priv_2;void*fldrv_priv;structmtd_chip_drivernameNORFlashsizeFlash空间大小,MTD程序通过它确定映射空间的范围。使用宏定义WINDOW_SIZE(64MB);physFlashNORFlash启动,所以它从0x0空间开始。inval_cache——指向DCache(数据缓冲)无效的函数指针。这里对应的pxa27x_map_inval_cacheFlash空间的擦除、写入等操作,必须要严格FlashCache。同时,为了兼顾效率,MTDNORFlash空间映射两块虚拟空间:一个是没有CacheFlashCache的空间,主要考要完成的任务。在linux2.6下,通过内核的consistent_sync调用即可实现。bankwidth——Flash所在空间的总线宽度。MTD驱动程序要根据Flash设备,就必须已知当前系统总线的宽度(18位;2来分析系统配置的Flash32位宽度的总线上,有可能是使48Flash,或216FlashPXA270上,可以通过BOOT_DEF寄存器状态,来判断Bank0空间总线宽度。virtFlash起始空间的无Cacheioremap Flash起始空间的有Cache重新定义宏WINDOW_SIZE,因为主控节点的NORFlash64MB#define U-boot: ——内核 —— ——:staticstructmtd_partitionpxa27x_partitions[]={.name.size,{.name.size {.name.size}MTD程序的配要在MTD设备上建立文件系统,就必须有MTD块设备驱动程序的支持。通常[*]MTDpartitioningsupport<*>RedBootpartitiontableUserModulesAndTranslation<*>DirectchardeviceaccesstoMTD<*>CachingblockdeviceaccesstoMTDMTD4.3“FileMTDNORFlashU-boot,内核和文件系统。它们的容量分别是512K,2M,61.5M。块大小都为256KCFCFCF50PXA270CF卡内,有一个集成的片上控制器控制CF卡的方式,这个控制器管理着接口协议、数据和恢复、错误处理和诊断、电源管理和时钟控制等。通过配置CF卡的属性器可以选择不同的模式。一般,CF卡有3种模式[9]。I/O模式。通过CF卡的内部寄存器所指向的16字节数据块,实现CF卡的通用空间寻址TrueIDECF卡视为IDE的磁盘进行寻址操作,同时用IRQ进行其中,CF卡控制器在Memory模式下能够最快地响应操作命令。该模式较好地满CF卡可以工作在IDE方式。当CF卡上电时,如果OE#信号为低,CF卡就IDEIDECIS信息就不再有效了,CF卡和PXA270的接口PXA27016位的PCCardCF卡接口,利用PSKTSEL脚可以支持两个PCMCIA(CF)PCMCIACF接口的硬件电路及工作原理类似,也可通过PSKTSEL引脚同时支持PCMCIA接口和CF接口。我们的硬件平台上CF卡与PXA270的接口设计如图4.4所示。

CF_ADDR[0 MA[0 GPIO85_GPIO54_E<2>

CF_DATA[0MD[0

CF卡与PXA270CE2使能奇地址数据的输入。如果使用16位的,则需要同时将CE1、CE2置CD#[2:1]CF卡内部都与地信号连通。物理CF卡完全插入时,这两个信号才能同IREQ#:低电平有效中断请求。PCCard2种模式:电平模式和脉PCCard适配器需要同问标准空间不同,属性空间只有偶地址是有效的,即只有数据总线的低8位方式。如果此空间不能用16位方式,则系统需要使用8位模式分别访16位空间的高低字节。CFCFPCMCIA规范类似,其接口共有50针,和PCMCIA接口的68针相比只是少了一些地址线和Vpp电源而已,从某种程度上说CF卡接口就是PCMCIA接口的一个简化版,所以Linux下的CF卡接口驱动程序基本上是从PCMCIA的驱动软件包移植过来的。driver,第二层是PC卡服务层(CardService,最上层是卡服务客户层(CardServicesClient。卡服务客户层中包含各种类型的卡设备驱动和一种称为驱动服务(DriverServices)的特殊的虚拟设备驱动。在PCMCIA的这种分层驱动架构中,每一层都通过标准API接口为上层提供服务。对不同PCMCIA控制器和不同系统平台的支持,从而了PCMCIA“插口”和硬件资源配置的差异。在使用不同PCMCIA控制器的系统时,只是各自的“插口”体的PCMCIA电路无关。根据PCMCIACF卡驱动程序的移植实虽然PCMCIA的软件协议比较复杂,但是它已经相当成熟,其硬件设备和驱动程序都已经标准化。Linux内核的PCMCIA驱动程序为我们做了很多事情,我们可以从免费获取更新的驱动程序和应用程序源码,以适应新的硬件设备。在内核的源码中对pcmcia的支持主要在插口驱动层向上层提供的接口函数用structpcmcia_low_level类型的结构体定义。此类型在/driv mon.h中定staticstaticstructpcmcia_low_levelmst_pcmcia_ops= = = = =.configure_socket= = = =mst_pcmcia_hw_init是硬件初始化函数,它的主要功能就是设置涉及I/O口的输入/输出方向、工作模式及中断的初始化(实现通用I/O口到中断号的转换、设置GPSR(GPIO48_nPOE)GPSR(GPIO48_nPOE)GPIO_bit(GPIO48_nPOE)|//GPIO_bit(GPIO49_nPWE)| skt->irq=Socketstate->detectGPLR(59)&GPIO_bit(59))||(GPLR(60)&GPIO_bit(60)))?0 //测state-GPLR(107&GPIO_bit(10710;//由中断state->detectGPLR(59)&GPIO_bit(59))||(GPLR(60)&GPIO_bit(60)))?0 //测state-GPLR(107&GPIO_bit(10710;//由中断=(GPLR(106)&GPIO_bit(106))?1:=//3.3VSocketmst_pcmcia_configure_socket()函数主要完成Socket的电源管理配置,这个函数ifif(state->flags&printk("rockpcmica:%s FUNCTION);GPSR(104)|=GPIO_bit(104); //CFRESET位置1 //GPCR(104)| CFRESET}CF无线网卡驱大多数可用的WLAN卡是基于IntersilPrism或LucentHermes组的,大致分为三类:PrismIIcards、Orinococards和Symbolcards。每一种类型的无线网pcmcia-cs及wireless_tools的驱动源码地址,然后简单介绍本驱动移植的主要pcmcia-cs-wirelesstools 向内核添加hostap首先将hostap-driver-0.4.9.tar.gz拷贝到开发板内核源码所在的那个 后运行补丁命令,把hostap驱动源代码driver/modules/hostap*.[ch]全部拷贝到linux内核的 下。使用令如下#cdlinux-2.6.9另外,将hostap-driver-0.4.9/driver/etchostap_cs.conf 进入Generalsetup-->PCMCIA/CardBussupport-->菜单,分别选中对haradoWLAN802.11b协议和CF无线网卡驱动类型的支持。具体如下:其中以标志符<symbol>形式表示的是“bool”()类型的菜单选项,<>表示未选择,<*>表示选择并编译到内核中;以标识符[symbol]形式表示的是(三态)类型的菜单选项,[]表示未选择,[*]表示选择并编译到内核,[M]表示选编译pcmcia工具——对源码pcmcia-cs-3.2.8进行编译的时候,注意要在./configure--后指定交叉编译器等选项,具体的编译过程不再赘述。编译结束后把/cardmgr下生成cardctl、cardmgr拷贝到根文件系统的/sbin下,以及把/etc下的所有文件拷贝到根文件系统/etc/pcmcia下。WirelesstoolsWirelesstools是用于无线上网配置的一个工具包。包括WirelessExtensionsv18iwlist、iwspy、iwpriv拷贝到根文件系统的/sbin 件libiw.so.28拷贝到根文件系统的/lib CF接口硬件初始化的几个关键信号RESET、IREQ、BVD1/STSCHG设置正确,如果RESETGPIO没有配置好的话,或者设置的方向不对,则会出现CF卡供电不正常的情况。设置中断类型为电平触发:set_irq_type(irqs[i].irq,网络设备驱动程本次移植目标板使用了CS8900ACIRRUSLOGIC公司的的以太网接入带宽。另外,CS8900A集成了支持IEEE802.3协议标准的MAC引擎,多的CPU资源。因此PXA270处理器只须向该发送/数据报,就可以完成插入、CRC校验等,都由CS8900A自动完成[6]。CS8900A有两种工作模式可供选择:内存模式和I/O模式。在内存模式下,次系统设计选择的工作模式。在我们自主设计的硬件开发板上CS8900A的以太网接口电路原理框图如图4.5所示。 CS8900A的是以字为单位,最小的地址的间距是2个字节,如果地址按字对齐,那么最低地址应该为0,所以最低地址SA0应该接地。nCS22使能信号,通过两个“或”CS8900A的读写控制端:IOW#IOR#2被选中(为低电平)时,PXA270的读写信号才能到达CS8900A。上电以后,CS8900AI/O发送端,它们通过以太网器连接到RJ45。CS8900A工作于I/O模式下,与Memory有关的引脚,如MEMR#、MEMW#REFRESH#等接电Linux立起数据通信的桥梁。Linux网络驱动的体系结构如图4.6所示。中断处从设备接收中断处从设备接收数向设备发送数net_device(网络设备接口向下层发送向上层发送数网络设备接网络设备驱网络设备媒网络物理设备网络物理设备Linux中对所有网络设备都抽象为一个接口,这个接口在Linux源码中是—方面,上层协议栈产生的数据需要调用网络协议接口层的函数dev_queue_xmit发送,此函数又通过网络设备接口结构体类型net_device的hard_start_xmit()函数指针,调用驱动程序的数据发送函数net_rx(),将上层协议产设备驱动程序响应中断,从网络设备接收数据,并通过网络协议接口层的函数初始化与网络设register_netdev()函数进行正式前,必须首先完成网络设备的初始化。虽然net_deviceether_setup(dev)函数所提供的许多默认值来初始化这个结构的大部分成员,初始化CS8900A网络接口函数示例如下:====要设置网络接口址(dve->base_addr)、中断号(dve->irq)及中断触发方式MAC地址(dev->dev_addr)。在网卡驱动移植过程中,参考PXA270和CS8900A,并根据开发板的配置,设置接口虚拟址为0xF 为由nCS2片选空间映射的虚拟地址空间,0x300为CS8900A的片内基址),IRQ为IRQ_GPIO(84)。网络设备的初始化工作还有一部分是在cirrus_start()函数中完成的,在使用ifconfig命令配置网络设备时便调用此函数,它的主要作用就是设置以太网控制器cirrus_set(dev,PP_RxCTL,RxOKA|IndividualA|BroadcastA);发送函数cirrus_send_startstructsk_buff*skb,structnet_device*dev)负责将数据接收函数cirrus_receive(structnet_device*dev)负责接收来自以太网的数据,它要由网络驱动的中断处理函数调用。该函数的主要任务是把来自网络的数据从CS8900A中读出,并将其存放于套接字的缓存区中,然后以该套接字为参数调用netif_rx(skb)将数据送往上层协议栈进行处理。数据的接收流程如下图4.7所示:NNY 接收与发送是网络设备程序非常重要的两个功能[10],其中,接收数据方面,核是通过协议接口层函数dev_queue_init来调用net_device结构中的hard_start_xmitCSA8900A移植实汇聚

温馨提示

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

评论

0/150

提交评论