嵌入式Linux和普通Linux并无本质区别。PC上用到的硬件,嵌入式Linux几乎都支持。Linux上各种硬件的驱动程序源代码都可以得到,为用户编写自己专有硬件的驱动程序带来很大方便。这里我们就对在嵌入式Linux平台上进行USB主机控制器的软、硬件设计做一个简单介绍。主动识别USB目前,大部分的嵌入式产品都具有USB 接口功能,但实际指的是下位机的功能,不具备主动识别USB设备,更不能对其进行控制和读写等操作,这也是美中不足的地方。比如在一个工业数据采集的领域中,由于便携式嵌入设备的存储容量一般非常有限,经常需要使用USB优盘作为数据存储的载体。这就要在项目中实现一个嵌入式的USB主机来采集数据,并且把数据存储到优盘中。这里,这个USB主机只需具有控制读写功能就行了,不必实现外设的功能,因为它根本不用连接到PC。用户的需求呼唤USB主机实现嵌入式化,也就是开发和设计嵌入式的USB主机。移动数据交换和存储,是近年来信息技术行业的热点。如今,各式各样的移动存储设备有如雨后春笋般出现。它们从最早的存储量为几KB、能存储用户个人信息的USB小钥匙,到容量可与PC硬盘媲美的USB活动硬盘,再到以Flash作为存储介质的USB闪盘和优盘,直到今天大量的PC外设和多媒体家电中大量使用的数据存储器。同时,我们也应注意到:移动数据交换业,是伴随着通用串行总线(Universal Serial Bus,简称为USB)的成熟而兴起的。USB既是数据交换的媒介,又是其核心。可以说,没有USB,就不会有移动数据业务如此迅猛地发展。从USB问世,从1.1到协议规范2.0版本再到目前的USB OTG(On-The-Go),USB在不断自我完善,并走向成熟。厂商对于USB的硬件和软件支持的也越来越完备。现在开发一个USB外设产品,所需要投入的成本和时间大大降低了。随着USB应用领域的逐渐扩大,对于USB的期望也越来越高。希望USB能应用在各种计算机领域中,尤其是在移动数据领域中;希望能通过PDA等移动设备直接和USB外设通信,使得USB能应用在没有PC的领域中。USB的拓扑结构中居于核心地位的是Host(也称为主机)。任何一次USB的数据传输都必须由主机来发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间或是两个主机之间无法直接通信。而目前,大量的扮演主机角色的是个人电脑PC。因此,我们目前所买到和使用的USB移动设备,都是USB的外设,比如USB的移动硬盘、USB接口的数码相机等。所有这些设备都只能在PC上使用,只能通过PC来进行相互的文件和数据交换。这正是USB的弱点。数码相机和mp3播放器等类似的产品都是作为USB的外设。现在的技术条件下,我们只能通过PC作为数码文件的中介。我们首先是把数码相机连接到PC上,并且安装相应的驱动程序和用户界面,把数码相机存储盘上的内容复制到PC硬盘上。然后,把USB打印机连接到PC。最后,再把照片打印出来。整个过程,很复杂,更是不方便。有了嵌入式的USB主机,就不需要PC的介入。这里,需要做的就是在MP3播放器、数码相机里嵌入USB主模块,使其由传统的USB外设成为USB主机。这样,这些嵌入式的主机就可以直接和移动硬盘、打印机等USB的外设连接,实现所需的功能。USB 主机设计传统意义的USB开发,仅仅是对USB外设的开发。USB底层驱动程序和USB主控制器驱动程序都由Windows等操作系统提供。有关这些驱动程序的细节过程都蒙着一层神秘的面纱。所以,要设计USB 主机,就须设计这两部分驱动程序,Windows源码不公开,这些细节资料就无从得到。但是,嵌入式Linux 操作系统具有得天独厚的条件。当然,目前并不是所有版本的嵌入式Linux(如UCLinux)都支持USB设备。是否支持USB设备是由Linux核心决定的。因此,嵌入式Linux操作系统采用什么版本的核心就成为是否支持USB设备的关键。一般而言,Release版的2.2.XX及以前的版本都不支持USB设备,2.4.XX及以后的版本都加入了对USB设备的支持。因此,在做开发之前应该将内核升级为2.4.10或以上版本。USB设备是通过USB总线连接到USB主机上。主机通过与设备相连的逻辑通道与设备进行通信。在通信过程中,USB主机充当数据流的源端或者目的端。在USB系统设计中,USB主机接口的设计一直是其难点所在。USB主机控制器完成了主机与设备之间的电气和协议层的匹配,主要包括以下功能:串并转换、帧起始、数据处理、协议使用、传输错误处理、远程唤醒、根Hub、主机系统接口等。在嵌入式Linux平台上进行USB主机开发所需开发环境:1.开发主机:Linux系统,开发主机上还装有目标系统上运行的uCLinux操作系统和应用软件的所有源代码,以及编译、调试这些源代码所需的工具软件。2.目标系统:嵌入式Linux系统及其电路板。下面简要介绍一下USB 主接口的软硬件设计:USB Host接口的硬件设计 USB总线与计算机系统的接口部分就是主机控制器。它可以被看作一个硬件、固件和软件的综合体。USB主机与设备之间的通信最终都将通过USB主机控制器和USB设备的总线接口之间相连的电缆进行,任何一个输出请求都是由主机控制器组织成包的形式发往总线的。USB总线中只有一个主机,它是USB树形结构的根,通过一个根Hub来提供一个或多个连接点,从它分发连接着各个USB设备。USB主机控制器硬件接口设计的目的是在嵌入式Linux系统开发板上增加一个USB Host接口,使其能够作为USB主机与各种USB Slave设备进行通讯。硬件上首先要选择支持USB主机的接口芯片。现在比较成熟的有Cypress公司的SL811HS和Philips公司的ISP1161。并且选用一款合适的MCU和MPU来控制。这款MCU的选用比较讲究。因为,整个USB协议框架是非常复杂的。那么这就需要MCU具有足够的RAM,用以处理大量的数据缓冲区、大量的变量、数据存储等。8KB的RAM是最基本的要求,而且越大越好。其次系统要有大量的程序存储区,一般Flash的需求大概在10KB~60KB左右。之所以有如此大的范围,是因为USB定义很多的类,用以支持不同类型的USB外设。每一类就有其不同的驱动程序,因此,设计的嵌入式USB主机支持的类越多,那么需要的程序空间就越大。例如,要实现Mass Storage类就需要10K所有的Flash空间。本人推荐USB Host接口芯片选用Scanlogic公司的SL811HS/T。这是市场上为数不多的,既能用作Host模式又能用作Slave模式的,具有标准微处理器总线接口USB控制芯片,它适合于非PC设备。在Host模式下,它支持嵌入式主机与USB外围设备的通信;在Slave模式下,可以作为主机的一个外设。固件方面,就是要实现完整的USB主机协议类,包括设备的上电检测、设备重起、分配地址、读取设备的各种描述符等基本的操作,更重要的是要实现每一类USB设备的协议栈。简单来说,每一类设备的协议栈就是一个特定的驱动程序。传统的做法,我们是在PC上使用WDM来编制驱动程序。这里,在嵌入式系统的开发环境里就要像开发嵌入式的软件一样,可以用C语言、汇编语言等来实现。USB Host接口的软件设计 在Linux操作系统中,驱动程序的加载方式为:1.将驱动程序作为可加载的模块,在系统超级用户(Root)权限下使用insmod命令动态加载,使之成为系统核心的一部分。对于USB设备而言,由于可热插拔,一般采用模块化的设备驱动程序。USB主机控制器驱动程序一般也采用这种方法。2.将设备驱动程序的源代码加进系统核心,系统启动后自动加载驱动。USB协议栈程序一般采用这种方法加入内核,进而产生一个叫做USB核心的子系统。这个子系统提供了许多数据结构、宏定义、功能函数和应用程序接口(API)来对硬件或设备进行支持。完成驱动程序后,要进行系统配置 ,通常步骤如下:1.编写Makefile文件。2.增加设备文件。因为USB设备主要都是通过快速串行通讯来读写数据,故一般作为字符设备。3.在目标系统上插入驱动程序模块到内核。编译完成后,驱动程序作为一个模块动态加入到uCLinux内核中。至此,USB主机控制器的软件设计完成。这个嵌入式的USB主机能够具有同装有Windows 操作系统的PC一样的功能;能够直接对USB的移动存储设备进行读取;能够自动识别设备并把设备配置为标准的磁盘驱动器;能够直接进行文件的读娶格式化等一系列操作。为了通用,可以选用朗科公司的USB优盘作为外设。目前整个系统可以直接对优盘进行操作,读取优盘中的文件、写文件到优盘中等。可以在嵌入式Linux平台上运行USB主机,作为嵌入式设备与USB Slave设备进行通信。小结我们对在嵌入式Linux平台上进行USB主机控制器的软、硬件设计做了简单的介绍。设计的重点和难点主要在于主机控制器芯片的驱动程序开发,但作为开放系统,在Linux上开发设备驱动程序有着其它嵌入式系统不可比拟的优势,大量的开放源码无疑可以加速开发的进程并使得其应用更加的广泛。因此,USB作为一种新型的高速外设总线,在嵌入式Linux领域必定有着广阔的应用前景。
[1] [2] 下一页
httpg://www.Stcore.com 收集整理
(出处:http://www.sheup.com)