研制说明书文档_第1页
研制说明书文档_第2页
研制说明书文档_第3页
研制说明书文档_第4页
研制说明书文档_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、研制说明书现有移动机器人的远程控制系统采用专门的工控PC机作为机器人的控制服务器,并与机器人本体分离。显然,这种控制方式的成本非常高昂,体积也过于庞大,无法适应移动机器人的小型化、群体化的要求。随着集成电路技术和软件业的飞速发展,实现嵌入式系统直接接入Internet 已经变为可能。在硬件上,有 ARM、XScale、PowerPC 及 MC68K 等 32 位CPU 可以满足嵌入式操作系统的要求;软件方面,嵌入式 Linux 得到了蓬勃发展,并已进入实用阶段。嵌入式技术的飞速发展,使得我们可以将嵌入式系统引入到移动机器人中,从而以较低的成本实现移动机器人的远程控制。1 系统体系结构本课题设计

2、了一个基于嵌入式Linux的移动机器人控制系统。系统从体系结构上可以分为四大部分,如图1-1所示,即机器人控制系统平台、机器人服务器、机器人运动控制与传感信息采集、客户端。机器人运动控制与传感信息采集图像采集单元无线传感网络接入运动控制与内部传感单元调速电机内部传感器机器人控制系统平台Web服务器网络控制服务器机器人服务器客户端无线路由器802.11bWeb浏览器远程控制程序Internet图1-1系统结构远程用户可以利用机器人网络控制服务器提供的控制接口,对机器人进行编程控制;同时还可以网页查看机器人上的Web服务器提供的机器人状态信息、传感数据和图像信息等,监视机器人的运动;另外,操作者还

3、可以使用网页上提供的机器人运动控制功能,来调整机器人的位置,设置机器人的工作参数等。多个机器人间则也可通过网络控制服务进行通讯,实现信息共享。1.1 机器人控制系统平台随着嵌入式处理器不断发展,以及嵌入式软件的不断进步,嵌入式设备的计算能力和功能得到了极大的提升。在本系统中,机器人控制系统平台为机器人服务器提供运行的软硬件环境,硬件上主要由一块基于ARM处理器的嵌入式控制板,无线网卡和摄像头组成,软件上则是由移植到主控制板上的嵌入式Linux操作系统,以及外围设备的驱动组成。嵌入式Linux系统支持各种标准的通讯协议,能为服务器提供完备的网络环境。该平台通过一块支持802.11b协议的无线网卡

4、,实现了机器人对网络的无线接入,满足其移动性的要求;通过USB摄像头实现对外部环境的图像信息采集。另外,机器人控制系统平台同机器人运动控制与内部传感单元、无线传感网络接入单元通过RS-232接口连接。采用嵌入式设备来实现机器人控制系统平台,大大降低了系统的总体成本,符合移动机器人的小型化、群体化的发展趋势;另外,平台与各个模块间采用标准的连接方式,极大增强了系统的扩展能力。1.2 机器人运动控制与传感信息采集机器人运动控制与传感信息采集主要完成对移动机器人驱动电机的控制、图像信息采集,以及内部传感器(指机器人自身携带的各式传感器,如超声波传感器、电子罗盘和光敏传感器等)信息的获取。多数机器人的

5、这几个部分是作为3个独立单元来实现,即一块电机驱动板,一块传感器采集板和一台PC作为图像服务器。为适应小型移动机器人的要求,系统在实现过程中,将内部传感器信息的采集和机器人运动控制合成在一块控制板上,这样不断可以满足一般的运动控制和传感信息采集,还可以将一些简单的行为控制(如转向、寻光等)放到该块控制板上完成,提高了机器人控制的效率,以及灵活性。图像采集则被集成在远程Web监控服务中,采用网页发布的方式来实现对机器人运行环境的图像观察。另外,系统通过无线传感网络接入模块与布置在环境中的无线传感网络相连,极大拓展了机器人对环境的感知能力,并为无线传感器网络与移动机器人的协作性研究提供了可能。1.

6、3 机器人服务器机器人服务器能为远程用户提供机器人的控制服务,一方面,它需要完成与远程用户的交互、任务的调度等,即接受用户的指令,并返回机器人的执行结果和运行状态;另一方面,它需要与机器人的运动控制机构和传感采集模块进行交互,控制机器人执行用户的命令。机器人服务器构建在机器人控制系统平台之上,由两部分组成,即机器人网络控制服务器和Web监控服务器。机器人网络控制服务器采用socket通讯的方式与用户进行交互,操作者需要根据该服务器的控制接口编写控制程序,即可实现对机器人的控制;Web监控服务器采用嵌入式Web技术,通过CGI程序完成与用户的动态交互,操作者可以通过网页来观察机器人的运行状态、传

7、感信息,以及机器人自身配备的摄像头所捕捉的环境图像信息。同时提供这两种服务,融合了C/S模式的高度灵活性和B/S模式的简单、便捷性。用户可以根据任务的需要,选择最优的控制方式。1.4 客户端客户端,既用户的操作平台,可以由一台联网的PC机,或任何具备上网功能的PDA、智能手机等嵌入式终端来实现。用户可以根据操作平台的不同,选择不同的控制方式,在PC机上可以采用网页来控制;在智能手机上可以通过编写控制程序来控制,等等。2 系统硬件设计系统硬件平台主要由五部分组成,即主控制模块、USB无线网卡、USB摄像头、运动控制与内部传感单元和无线传感网络接入模块,系统硬件框图如图2-4所示。主控制板基于S3

8、C2410微处理器,运行嵌入式Linux操作系统;USB无线网卡连接到主控制板上,通过无线路由为机器人提供Internet接入;USB摄像头则用来采集环境的图像信息;运动控制与内部传感单元完成机器人驱动电机的控制,以及内部传感器信息的采集,如超声波传感器、电子罗盘和光敏传感器等;无线传感网络接入模块则可以将布置在环境中的传感器网络收集的信息提供给机器人。USBUSBFLASHSDRAMS3C2410微处理器主控制板无线传感网络接入模块RS-232运动控制与内部传感模块RS-232无线网卡摄像头图2-1 系统硬件框图2. 1 主控制板为支持嵌入式Linux的运行,机器人主控制板采用了Samsun

9、g 公司的微处理器S3C2410。该处理器内部集成了ARM公司ARM920T处理器核的32 位微处理器,主频最高可达203MHz。ARM920T处理器核实现了内存管理功能(MMU),AMBA BUS和Harvard高速缓冲体系结构。这一结构具有独立的16KB 的指令Cache 和16KB数据Cache。S3C2410处理器集成的外围器件主要有外部存储控制器(SDRAM控制和片选逻辑)、 LCD控制器(最大支持4K色STN和256K色TFT)、3通道UART和两通道SPI、2个USB主机端口和1个USB设备端口(1.1版本) 、117个通用I/O口和24通道外部中断源、触摸屏接口等。由于S3C2

10、410微处理器提供了一系列完整的外围设备,可以大大减少为系统配置的额外器件,降低了整个系统的开发难度和成本。在处理器丰富资源的基础上,本平台还为其配置了两片16M 16 位数据宽度的SDRAM 构成,拼成32位模式,共用nGCS6,共64M RAM,起始地址为0x;一片8M 16 位数据宽度的INTEL E28F128 FLASH,安装在BANK0,起始地址为0x00;通过以太网控制器芯片DM9000E扩展了一个网口;一个方便调试的JTAG 接口;一个LCD接口和一个触摸屏接口。为满足前述机器人控制系统结构的要求,主控制板引出了两个USB HOST接口和3个UART接口。主控制板硬件框图如图2

11、-2所示。其中,串口0作为Linux系统的控制台;串口1用于连接无线传感网络接入模块;串口2用于连接底层机器人运动控制与内部传感单元;USB HOST1用于连接USB无线网卡;USB HOST2用于连接USB摄像头;以太网口和JTAG口可以方便对系统进行调试和升级。USB HOST1USB HOST2JTAG以太网口电 源串口2串口1串口0FLASHSDRAMS3C2410主控制芯片图2-2 主控制板硬件框图2.2 运动控制与内部传感单元系统将机器人的运动控制与一内部传感器信息采集集成在一块控制板中。该控制板采用一片8位PIC18F8520单片机作为微控制器(MCU)。PIC系列单片机是由Mi

12、crochip公司开发的微控制器,其突出的特点是低功耗,非常适用于各种低功率要求的应用。它有多个系列和型号,分别由一些基本的功能模块按照不同的应用目标组合而成。由于其较高的性价比,在智能仪表,医疗设备,保安系统等领域已经取得了广泛的应用。PIC18F8520采用16位的指令总线,8位的数据总线;内部有2K的RAM,1K的数据存储空间(EEPROM),32K的程序存储空间(FLASH);通用输入输出引脚(I/O)68个;有中断优先级(两极);4个外部中断输入引脚;有5个内部定时器;5个捕捉/ 比较/PWM(CCP)模块;16路模/数转换(10位)接口;两个通用同步/异步收发器(USART),支持

13、RS232和RS485;主控同步串行端口模块(MSSP),支持两种工作模式(SPI和I2C)。这款芯片接口丰富,性价比高,非常适合小型机器人底层控制的要求。该控制板在硬件设计上采用双层布线,提供了8个通道的调速电机接口,6个通道的模拟传感器接口(可接光敏传感器、寻迹传感器等),两个通道的数字接口(可接碰撞开关),以及5个通道的捕获接口(可接电子罗盘、超声波传感器等),其硬件框图如图2-3所示。运动控制与内部传感单元与主控制板通过串口连接,并使用自定义的一套命令接口进行通讯,实现底层硬件操作的封装。马达输出口1-4PIC18F8520马达输出口5-8计 数 口 模拟输入口数字输入口串口 主控制板

14、图2-3 运动控制与内部传感单元硬件框图2.3 其它为满足移动性和网络化的要求,机器人需要以无线的方式接入Internet,系统通过在主控制USB HOST1处外接一个USB无线网卡,配合无线路由器,实现了此项功能。无线传感器网络能对环境进行大范围的、连续的监测,可以弥补机器人感知能力的不足。系统在主控制板的串口1处外接一个无线传感网络接入模块,实现机器人与无线传感器网络的连接。该模块采用的是Crossbow公司的MicaZ无线传感器网络节点,集成了Zigbee协议,从而为无线传感器网络与移动机器人的协作性研究提供了可能。另外,系统在主控制板的USB HOST2外接了一个USB摄像头来实现图像

15、信息的采集。3 系统软件设计3.1 机器人控制系统平台构建3.1.1嵌入式Linux系统开发环境的建立绝大多数的Linux 软件开发都是以native 方式进行的,即本机开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,没有足够的资源在本机(即开发板上系统)运行开发工具和调试工具。通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台PC 机)上,对应的开发板叫做目标板。 开发时使用宿主机上的交叉编译、汇编及连接工具形成能在目标板上执行的二进制代码,然后把可执行文件下载到目标机上运行。调试时的方法很多,可以使用串

16、口,以太网口等,具体使用哪种调试方法可以根据目标板处理器所提供的支持作出选择。宿主机和目标板的处理器一般都不相同,宿主机为Intel 或AMD处理器, 而目标板处理器为SAMSUNG S3C2410,GNU 编译器提供这样的功能,在编译编译器时可以选择开发所需的宿主机和目标机从而建立开发环境。在本系统开发的过程中,采用的是宿主机交叉编译调试的开发方式。宿主机安装的Linux系统是Redhat9.0,GNU交叉编译器选择的是armv4l-unknown-linux-gcc。宿主机和目标板通过以太网连接(如图3-1所示)。 图3-1 宿主机和目标板连接示意图另外,还需在宿主机上配置NFS服务TFT

17、P服务:(1) NFS服务的配置: 首先必须关闭Linux系统的防火墙,然后在REDHAT LINUX PC机上shell提示符root.#中执行setup,弹出菜单界面后, 选中System services,回车进入系统服务选项菜单,在其中选中 *nfs ,然后退出setup界面返回到命令提示符下, 执行vim /etc/exports ,将这个默认的空文件修改为只有如下一行内容: / (rw) /即根目录可读写,/和(rw)之间要要留空格 然后保存退出(:wq),再执行/etc/rc.d/init.d/nfs restart 或 service nfs restart来启动NFS服务。(

18、2) TFTP服务的配置: 在PC机上执行setup,选择System services,将其中的tftp一项选中(出现 *表示选中),并去掉ipchains和iptables两项服务(即去掉它们前面的*号)。 最后,退出setup,执行如下命令以启动TFTP服务: service xinetd restart 在具体的开发过程中,宿主PC 机上运行minicom 作为目标板的显示终端,在目标板上通过NFS (网络文件系统) 来mount宿主机硬盘,让应用程序直接运行在目标板上进行调试。图3-2给出了这种开发模式下的开发流程: 图3-2 开发流程REDHAT在加入网关设置后,网络建立TCP链接

19、非常慢,例如FTP/TELNET/NFS等都是,建立链接后,以太网通信还是很快的。若您安装网络时加入了网关,就会出现你在开发板NFS mount REDHAT PC时,敲“mount -o nolock XXX.XXX.XXX.XXX:/ /mnt”后非常长的时间不返回SHELL提示符,就一直停在那里,这就是建立连接的时间非常的长。一般的,遇到这种情况,建议在REDHAT LINUX PC上执行 “route del default”即去掉网关,然后再进行NFS mount等操作就会非常快了。3.1.2 引导装载程序引导装载程序,是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启

20、动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、 堆栈、存储器系统等,所以也称作Bootloader。Bootloader代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于Bootloader和CPU及电路板的配置情况有关,因此不可能有通用的Bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的Bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的Bootloader,可以支持多种体系结构,但相对

21、也比较复杂。本系统使用的引导装载程序也是基于u-boot来实现的。 u-boot简介u-boot是souceforge网站上的一个开放源代码的项目。它可对PowerPC、MPC、ARM、MIPS、X86等架构的处理器提供支持,支持的嵌入式操作系统有Linux、Vx-Works、NetBSD、QNX、LynxOS等,主要用来开发嵌入式系统初始化代码Bootloader。u-boot 最初是由Denx开发的PPC-boot发展而来的,它对PowerPC系列处理器的支持最完善,对Linux操作系统的支持最好。源代码开放的u-boot软件项目经常更新,是学习硬件底层代码开发的很好样例。大

22、多数Bootloader都分为stage1和stage2两大部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1,且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。stage1代码通常放在start.S文件中,它用汇编语言写成,主要完成以下几部分工作:(1) 定义入口。一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(FLASH)的0x地址处,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。(2) 设置异常向量(Except

23、ion Vector)。(3) 设置CPU的速度、时钟频率及中断控制寄存器。(4) 初始化内存控制器 。(5) 将ROM中的程序复制到RAM中。(6) 初始化堆栈 。(7) 转到RAM中执行,该工作可使用指令LDR PC来完成。stage2代码使用C语言编写,lib_arm/board.c中的start_armboot()是整个启动代码中C语言的主函数,该函数主要完成如下操作:(1) 调用一系列的初始化函数。(2) 初始化FLASH设备。(3) 初始化系统内存分配函数。(4) 如果目标系统拥有NAND设备,则初始化NAND设备。(5) 如果目标系统有显示设备,则初始化该类设备。(6) 初始化相

24、关网络设备,填写IP、MAC地址等。(7) 进入命令循环,接受用户从串口输入的命令,然后进行相应的工作。 u-boot的移植(I)与移植相关的目录u-boot源代码可以在/projects/u-boot网站上下到,目前最新的版本是u-boot-1.1.5,本文使用的是1.1.4版本。将下载的源代码解压后,可以看到有很多的文件和目录,其中和移植相关的文件夹有:(1) CPUCPU相关文件,其中的子目录都是以u-boot所支持的CPU为名,比如有子目录arm920t、mips、mpc8260和nios等。在arm920t子目录中包括有make

25、file、config.mk、cpu.c、interrupt.c、start.S等文件,以及s3c24x0、at91rm9200等文件夹。其中,cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础;s3c24x0和at91rm9200等子目录下的文件则是对那些集成了arm920t核的微处理器相关的代码,如serial.c、usb_ohci.c等。(2) board开发

26、板的相关文件,其中的子目录都是以u-boot已经支持的开发板为名,比如有子目录smdk2410、ep7315、evb4510等。在smdk2410子目录中一有makefile、u-boot.lds、smdk2410.c、flash.c、lowlevel_init.S等文件。其中,Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关;smdk2410.c则是对开发板的I/O等一些初始化;flash.c是对开发板flash的低层读写代码;lowlevel_init.S则是对开发板的内存进行设置。(3) lib_armARM体系结构下的相关实现代码,包括board.c、arml

27、inux.c等。其中,board.c是u-boot命令循环的实现;armlinux.c则是完成Linux内核启动参数的设置和引导等。(II)移植过程由于u-boot已经支持了S3C2410微处理器,所以CPU目录下的文件不需要专门去编写,而与主控制板相关的代码也可以参照board/smdk2410目录中的文件进行开发。具体的移植过程如下:第一步:建立基本的文件和目录1. 在board目录下新建myboard目录,并将board/smdk2410/目录下的文件全部复制到board/myboard目录下,修改smdk2410.c为myboard.c,修改makefile里的smdk2410.o为m

28、yboard.o。在include/configs/目录下将smdk2410.h另存为myboard.h。2. 修改u-boot-1.1.4/目录下的makefile。先在“ifeq ($(ARCH),arm)”这一行的下面添加“CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux-” 来指定交叉编译器的路径;再在合适的地方添加如下两行代码:myboard_config:unconfig./mkconfig $(:_config=) arm arm920t myboard NULL s3c24x03. 执行make distclea

29、n;make myboard_config;make。在编译过程中出现了两个错误,发生第一个错误时,编译器提示 “invalid option”,经检查是/cpu/arm920t/config.mk有问题,应将“PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)”这一行修改为“PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),)”。发生第二个错误时,编译器提示出错的地方在/include/asm-arm/proc

30、essor.h中的52行,应将以下几行代码union debug_insn u32arm; u16thumb; 修改为:union debug_insn u32arm_mode;u16thumb_mode;第二步:让u-boot在开发板上运行1. 根据需要的中断向量来修改start.S;根据设置的FPCLK和串口波特率修改/cpu/arm920t/s3c24x0/serial.c。2. 在/include/configs/myboard.h中,修改“#define CONFIG_SMDK24101”为“#define CONFIG_myboard 1”;设置FLASH和SDRAM的大小、起始地

31、址等。3. 根据主控制板存储设备的配置情况,修改/board/myboard/ lowlevel_init.S,设置各个bank的控制器参数,如SDRAM的刷新频率、数据位宽度等。4. 执行make distclean;make myboard_config;make。编译时有一个错误出现,编译器提示出错的地方在/include/configs/myboard.h文件中,应将“defined(CONFIG_SMDK2410) | defined(CONFIG_VCMA9)”修改为“defined(CONFIG_SMDK2410) | defined(CONFIG_myboard) | defi

32、ned(CONFIG_VCMA9)”,即添加对myboard的支持。此时,将编译生成的u-boot.bin文件通过并口烧写进主控制板的FLASH中固化,将主控制板的串口0与电脑相连,重新启动开发板,就可以通过串口看到u-boot的启动信息了。第三步:实现 u-boot对FLASH和网口芯片的驱动1. 实现对FLASH的支持,需要修改/board/myboard/下的flash.c、flash-define.h文件,以及/common/cmd_flash.c和/include/cmd_boot.h等文件。在我们的硬件系统中,FLASH使用的是Intel的E28F128系列芯片大小为16M字节。在

33、对该芯片的支持中,必须在底层完成对FLASH的擦除以及写处理函数供上层调用,具体实现与存储芯片的一套机制相关。2. 实现队网口芯片DM9000的驱动,主要是在drivers/目录中添加网口设备控制程序dm9000.c 和dm9000.h,其中dm9000.c 主要包括以下函数:int eth_init (bd_t *bd),初始化网络设备; void eth_halt (void),关闭网络设备; int eth_send (volatile void *packet,int len),发送数据包; int eth_rx (void) 接收数据包;最后在drivers/Makefile中加入d

34、m9000.o。第四步:实现 u-boot对Linux系统的引导1. 从 Flash 上拷贝内核和文件系统。由于像 ARM 这样的嵌入式 CPU 通常都是在统一的地址空间中寻址 Flash 等固态存储设备的,因此从 Flash 上读取数据与从 RAM 单元中读取数据并没有什么不同,用一个简单的循环就可以完成从 Flash 设备上拷贝映像的工作。2. 设置内核的启动参数。Linux 2.4.x 以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。启动参数标记列表以标记 ATAG_CORE 开始,以标记 ATAG_NONE 结束。每个标记由标识被传递参数的 tag_heade

35、r 结构以及随后的参数值数据结构来组成。数据结构 tag 和 tag_header 定义在 Linux 内核源码的include/asm/setup.h 头文件中。3. 设置命令行参数。Linux 内核在启动时可以以命令行参数的形式来接收信息,利用这一点我们可以向内核提供那些内核不能自己检测的硬件参数信息,或者重载(override)内核自己检测到的信息。我们用这样一个命令行参数字符串console=ttyS0,n8来通知内核以 ttyS0 作为控制台,且串口采用 bps、无奇偶校验、8位数据位这样的设置。4. 调用内核。调用 Linux 内核的方法是直接跳转到内核的第一条指令处,即执行“th

36、eKernel (0, bd-bi_arch_number, bd-bi_boot_params);”。但在执行内核调用前需要做好以下准备:CPU 寄存器的R00,R1193(机器类型的ID,可以参见 linux/arch/arm/tools/mach-types),R20x(启动参数标记列表在 RAM 中起始基地址); CPU要工作在管理模式,关闭中断和MMU;关闭数据Cache和指令Cache。这部分工作主要是由/lib_arm/ armlinux.c完成,可以在已有的文件基础上根据控制板进行适当的修改即可。图3-3是u-boot启动后的信息。 图3-3 u-boot启动信息3.1.3 L

37、inux内核的移植Linux系统能支持如此多平台的部分原因是因为内核把原程序代码清晰的划分为体系结构无关部分和体系结构相关部分。对于任何平台,都必须包含以下几个目录:(1) /arch包含了所有硬件结构特定的内核代码。移植工作的重点就是移植arch目录下的文件。boot:包括启动内核所使用的部分或全部平台特有代码。kernel:存放支持体系结构特有的(如信号处理和SMP)特征的实现。lib:存放高速体系结构特有的(如strlen和memcpy)公用函数mm:存放体系结构特有的内存管理程序的实现。(2) /drivers包含了内核中所有的设备驱动程序。(3) /fs包含了所有的文件系统的代码。(

38、4) /include包含了建立内核代码时所需的大部分库文件,这个模块利用其他模块重建内核。该目录也包含了不同平台需要的库文件。比如,asm-arm是arm平台需要的库文件。(5) /init包含了内核的初始化代码,内核从此处开始工作,但不是系统的引导代码。主要有main.c和version.c两个文件,这是研究核心如何工作的好起点。(6) /ipc包含了进程间通信代码。(7) /kernel包含了主内核代码。(8) /mm包含了所有内存管理代码。(9) /net包含了和网络相关的代码。在移植过程中,定时器、中断、CACHE管理、MMU等和硬件密切相关的地方都是要相关平台的底层代码支持的,要特

39、别注意。实际,在开源社区中已经有很多人做过针对ARM架构处理器的移植工作,其中最有影响力的是由Russell King领导的ARMLinux。ARMLinux已被成功运行在超过500种的机器平台上,包括网络计算设备、手持设备和各种评估板等(.uk/docs/whatis.php)。这其中已经包括了基于S3C2410处理器的计算设备。由于本文在移植时就是基于ARMLinux来进行的,选用的内核版本是2.4.18。此时主要的工作,就是根据需要对内核进行裁剪和编译:(1) 修改Linux源代码根目录下的makefile,指定目标板处理器类型,即“ARCH

40、=arm” ,并指定交叉编译器的路径“CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux-” ;(2) 配置内核:make menuconfig;(3) 创建内核依赖关系:make dep;(4) 创建内核镜像文件:make zImage;(5) 创建内核模块:make modulesmake,modules_install。对每一个配置来说,内核生成以后包括4个文件:没有压缩的内核镜像(zImage或bzImage),压缩的内核镜像(vmlinux),内核符号映射文件(System.map)以及配置文件(config)。图3-4

41、是移植的Linux系统启动时的画面。图3-4 Linux系统启动信息3.1.4 嵌入式Linux系统下的USB设备驱动设备驱动程序在Linux内核中扮演着特殊的角色。它们是一个个独立的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口。这些接口完全隐藏了设备的工作细节。用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。这个编程接口能够使得驱动程序独立于内核的其它部分而建立,必要的情况下可在运行时“插入”内核。这种模块化的特点使得Linux驱动程序的编写非常简单,因此内核驱动程序的数目也迅速增长,目前

42、已有成百上千的驱动程序可用。(摘自“Linux设备驱动程序”)Linux把设备分为三大类,即字符设备(char device)、块设备(block device)和网络设备(network device)。块设备驱动程序和字符设备驱动程序的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般紧接着就发生了,块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备的,以免耗费过多地CPU时间来等待。一般来说,Linux的设备驱动程序需要完成如下功能:(1) 设备初始化

43、、释放;(2) 提供各类设备服务;(3) 负责内核和设备之间的数据交换;(4) 检测和处理设备工作过程中出现的错误。USB设备驱动程序完全符合通用设备驱动的准则,不同的是内核提供了一些特别的API函数,方便驱动注册、销毁自己,例如usb_resister()和usb_deresister();24版的内核还提供了对于hotplug的支持。本系统使用了两个USB设备,即USB无线网卡和USB摄像头。在实现其驱动的过程中,笔者充分利用了开源社区的代码,体现开源Linux的优势。 Linux下USB设备驱动程序概述1. OHCI简介:OHCI规范定义了两个主机控制器(HC)与主机控制器

44、驱动(HDC)的通信通道(Communication Channel)。第一个为主机控制器操作寄存器,第二个为主机控制器通信域(Host Controller Communications Area, HCCA)。OHCI规范支持USB四种数据通信方式,并根据数据传输特定,将中断数据传输和等时数据传输归为同一类周期性数据传输方式。在HCCA(主机控制器通信域)中定义了4个链表。其中除完成数据链表外,其它的周期性数据链表、控制传输数据链表和批量传输数据链表都是二维链表。每个ED(Endpoint Descriptor)描述USB设备的一个端点的所有的数据传输,所有的ED被连接在一起,而TD(Tr

45、ansfer Descriptor)描述的才是最终要在USB总线上传输的数据包。属于同一个USB设备的端点的TD被连接在一起,并挂在相应的ED上。主机控制器硬件通过寄存器访问该链表来得到相关的USB传输数据包,并将其发送到USB总线上。主机控制器驱动程序则根据实际的数据传输需要,将要发送的数据包添加到相应的链表上。OHCI定义了两类TD:通用TD(General TD)和等时TD(Isochronous TD)。通用TD被用来支持USB中断、批量和控制三类传输方式,而等时TD被用来支持USB等时数据传输。用一个单独类型的TD来实现USB等时数据传输的目的是为了方便实现DMA数据传输功能。2.

46、Linux下USB系统文件节点:同其他外设一样,上层应用软件对连接在系统地USB设备访问是通过文件系统的形式进行的。每个连接到系统总线上的USB设备可以同时对应有一个或者多个驱动程序。即一个USB设备可以在Linux系统上形成一个或多个设备节点,以供应用程序使用。在Linux系统上,每个设备节点都有其相关的主设备号和次设备号。3. USB主机驱动结构:Linux USB主机驱动由三部分组成:(1) USB主机控制器驱动(HCD):是USB主机驱动程序中直接与硬件交互的软件模块,其主要功能有:主机控制器硬件初始化;为USBD层提供相应的接口函数;提供根HUB(ROOT HUB)设备配置、控制功能

47、;完成4种类型的数据传输等。(2) USB驱动(USBD):是整个USB主机驱动的核心,其主要实现的功能有:USB总线管理、USB总线设备、USB总线带宽管理、USB的4种类型数据传输、USB HUB驱动、为USB设备类驱动提供相关接口、提供应用程序访问的USB系统的文件接口等。(3) USB设备类驱动:是最终与应用程序交互的软件模块,其主要实现的功能有:访问特定的USB设备、为应用程序提供访问接口等。应用程序首先通过文件系统(POSIX)接口来访问相应的USB设备类驱动程序和USBD;USB设备类驱动程序则通过USBD提供的相关接口将数据请求包传递给USBD;USBD通过HCD提供的接口,进

48、一步将数据包传递给HCD;HCD最终将数据发送到USB总线上。Linux定义了通用的数据结构URB用来在USB设备类驱动和USBD,USBD和HCD间进行数据传输。统一的URB(Universal Request Block)结构为usb主机驱动程序的开发带来了很大方便。4. USB时序:(1) 数据传输时序:在USB总线上,所有的数据传输都是由USB HOST发起的。每个USB设备通过地址过滤出自己要接受的数据包,并根据数据包请求的类型与USB HOST进行数据传输。由于数据传输的时序和总线带宽问题,当应用程序通过设备类提供一个URB时,该数据包并不能立即被送到USB总线上,而只能在USB总

49、线上有足够带宽的情况下,该数据请求才会被传输。因而,HCD层为不同类型的数据传输维护了相应的数据链,当数据链上的数据包传输结束后,HCD通过调用与该数据包相关联的回调函数来通知设备类驱动程序。(2) 设备连接:当一个USB设备连接到USB总线上时,USB HUB驱动程序首先通过中断数据传输获得设备连接信息,然后通过调用USB内核模块所提供的相关函数来完成对USB设备的配置工作。同时USBD不但要为新设备分配在USBD层所需要的资源,同时也要为USB设备分配在HCD层所需要的资源。接着,USBD通过调用所有USB设备类驱动程序提供的Probe函数来查找适合该USB设备的驱动程序。(3) 设备断开

50、:当一个USB设备断开时,USB HUB驱动程序首先通过中断数据传输获得设备断开信息,然后通过调用USB内核模块所提供的相关函数来释放USBD层和HCD层为该设备分配资源。同时通过调用该设备的相关驱动程序提供的Disconnect函数来通知设备驱动程序该设备已经断开。 USB无线网卡驱动程序移植在Linux下驱动USB无线网卡,除了按常规的做法自己进行代码开发外(工作量非常大),还有两种比较好的途径:1. ndiswrapperndiswrapper通过在Linux平台上虚拟windows的api,然后用windows下的驱动程序来驱动网卡。具体做法可参考http:/ndiswr

51、/mediawiki/index.php。 2. linux-wlan-nglinux-wlan-ng是专门为解决嵌入式Linux系统下无线网卡驱动的问题而成立的一个开源项目。目前,该项目对基于Intersil 802.11b Prism2、 Prism2.5和 Prism3 芯片的PCMCIA、PCI,和 USB无线网卡的支持比较好。详情见 /。本系统采用的是第二种方法,下载的版本是linux-wlan-ng-0.2.3,选用的USB无线网卡是NETGEAR公司提供的基于Prism3芯片的MA111。具

52、体的移植步骤如下:1. 执行make config,选则for usb;指定Linux的源代码所在路径(在编译过程中会用到内核的一些文件);指定交叉编译器路径;不要debug代码。2. 执行make进行编译。在编译的过程中,先后遇到4个错误:(1) 提示mkmetadef无法运行。这是因为mkmetadef是一个需要在编译过程中运行的程序,而使用了交叉编译器后,mkmetadef只能在ARM架构的处理器上运行了,当然无法在PC(X86架构)上运行了。解决办法是修改/linux-wlan-ng-0.2.3/src/mkmeta目录下的makefile,将$(HOST_CC)改为gcc;将$(HO

53、ST_CPP)改为gcc E,再编译时,此处错误消除。(2) 提示“msleep(100) implicated defined”。原因可能是msleep()函数的定义不正确,将其改为wait_ms(100)即可消除该项错误。(3) 提示/linux-wlan-ng-0.2.3/src/prism2/driver/hfa384_usb.c中,might_sleep()缺少参数。解决方法是修改/linux-wlan-ng-0.2.3/src/include/wlan/下的wlan_compat.h文件,将“#define might_sleep(a) do while (0)”改为“#defin

54、e might_sleep() do while (0)”即可。(4) 提示/linux-wlan-ng-0.2.3/src/prism2/driver/hfa384_usb.c 中,3134行“z”无法识别。找到这一行Read from index %zd failed, continuingn,可能是在打印输出的格式设置有错,将其改为Read from index %d failed, continuingn,即可消除此错误。3. 编译通过后还需将驱动加载到内核中,并进行一些简单的配置,才能让无线网卡真正在Linux系统下运行起来。具体步骤如下:(1) 将编译得到的p80211.o和pri

55、sm2_usb.o添加到嵌入式Linux的ramdisk中的/application目录下。(2) 在主控制板的控制台中执行“insmod /application/p80211.o”和“insmod /application/prism2_usb.o”来动态加载驱动程序模块。(3) 执行“wlanctl-ng wlan0 lnxreq_ifstate ifstate=enable”。(4)执行“wlanctl-ng wlan0 lnxreq_autojoin ssid=sensorrobot authtype=opensystem” 。其中“ssid=sensorrobot”是无线路由器的I

56、D,“authtype=opensystem”表示没有安全密码设置。(5) 执行“ifconfig wlan0 23”。设置无线网卡的IP地址。至此,无线网卡就可以工作了。实际上,可以将无线网卡的这些配置操作添加到/usr/etc/rc.local(Linux系统的启动脚本)中,这样就可以实现开机自动加载驱动了。图3-5是系统启动后,无线网卡开始工作的画面。图3-5 无线网卡启动信息 USB摄像头驱动程序移植USB摄像头以其良好的性能和低廉的价格得到广泛应用。同时因其灵活、方便的特性,易于被集成到嵌入式系统中。摄像头属于视频类设备。在目前的Linux核心中,视频部分的标准是Video for Linux(简称V4L)。这个标准其实定义了一套接口,内核、驱动、应用程序以这个接口为标准进行交流。目前的V4L涵盖了视、音频流捕捉及处理等内容,USB摄像头也属于它支持的范畴。Linux本身自带了采用ov511芯片的摄像头,而市场上应用最广泛的是采用中星微公司生产的zc301芯片的摄像头。在开源社区中,有一个专门针对

温馨提示

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

评论

0/150

提交评论