嵌入式Linux下USB设备的大容量数据传输驱动开发与实现_第1页
嵌入式Linux下USB设备的大容量数据传输驱动开发与实现_第2页
嵌入式Linux下USB设备的大容量数据传输驱动开发与实现_第3页
嵌入式Linux下USB设备的大容量数据传输驱动开发与实现_第4页
嵌入式Linux下USB设备的大容量数据传输驱动开发与实现_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

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

文档简介

1、前沿技术DOI: 10. 3969/.j issn 1001-3824. 2011. 02 014嵌入式Linux下USB设备的大容量数据传输驱动开发与实现范耀武,何维,田增山(重庆邮电大学无线定位与空间测量研究所,重庆400065)摘 要:针对手持终端探测过程中大容量数据传输 驱动开发存在的难点,利用嵌入式L nux平台及USB驱动架构, 分析了 EZ-U SB驱动读取数据的流程,提岀了大缓存 USB驱动的设计方案,通过原型设备测试验证了该设计方案 的有效性,解决了 EZ-USB FX2芯片高速传输中出现的数据丢失现象 。关键词:嵌入式Linux;高速传输;USB设备驱动;内存页申请

2、9; 1 4-2012 ChinaJournal Electronic Publishing Hcuuc. All fights rvstrved. htlp: /wwW.Cftki前沿技术© 1 4-2012 ChinaJournal Electronic Publishing Hcuuc. All fights rvstrved. htlp: /wwW.Cftki前沿技术0引言USB以其低成本、速度高、通用性强、支持即插 即用等优 点使得越 来越多的 设备采 用USB接口。 随着L nux系统的逐步完善,功能逐渐强大,在嵌入 式Linux平台下的USB设备驱动开发成为了该领域 工

3、程实现的热点和难点。本项目研发的手持终端主要应用于定位和跟 踪手机目标,在刑警抓获匪徒、解救人质,以及在地 震等灾难后定位和搜寻人员都有着重大的意义。 但是手持终端在定位和跟踪目标时需要采集大量的数据来解算,如果是4倍采样的 话,则速率 高达 20 48 Mb it/s,实时高速的传输是整个项目的一个研 发难点。基于L nux嵌入式平台,我们开始设计了 3种方 案,分别采用 GPIO, GFM C USB来传输。GPIO ( gen era- purpose I /O)由于收发之间没有时钟约定以及I/O本身数据传输能力有限导致数据丢失的问题无法 解决。GFMC( gen era-purpose

4、memory con troller)专门 用于高速存储之间的访问,一般用于SRAM等设备, 在L inux内核源码中仅仅有 nandflash访问的源码,开 发用于FPGA高速传输的驱动难度较高。由于上述 原因我们采用较为成熟的USB2 0芯片,其理论速度收稿日期:201012-28高达60 M bit/s,同时在 Linux下也有 USB的相关源 码仔细分析Linux内核及USB源码,从USB读取数据流程中提出USB驱动改进的方案,经原型设备测 试其有效性后,基于EZ-USB FX2设备的4 Mbit/s大 缓存的USB驱动最终被项目采用。1硬件系统介绍本次项目 开发采用的嵌入式开发板是D

5、evK it8000 具有 ARM + DSP双内核的 OMAP3530处理 器,可兼顾设备的数据处理强 度大、调度和控制功能要求高的需要。DSP内核对数据的压缩处理能力 非常强,而ARM内核可以完成系统的整 体控制功能和对DSP运算结果的访问。USB芯片采用的拥有1个独特的结构成独立串行数据的编是 EZ-USB FX2, EZ-USB FX2,其串行接口引擎SIE负责完解码、差错控制、位填充等与USB协议有关的功能,FX2还包含一个通用可编程 接口(GPIF),它支持所有通用的总线标准,如ATA-PI(PIO和 UDMA ), IEEE1284( EPP并行口 ), UTOP LA等,并可与

6、外部 ASIC; DSP等直接连接。为了验证数据传输的正确性还加了EP3C5E144型号的FPGA,根据项目需要,FPGA的工作频率是 10 24MH z让其产生16位的循环码,通过USB传送 给DevK it8000并计算其丢包率和误码率。53© 1 4-2012 ChinaJournal Electronic Publishing Hcuuc. All fights rvstrved. htlp: /wwW.Cftki前沿技术54 D G ITAL COMMUN CAT ON/20112硬件系统结构如图i所示。图i硬件系统结构图1. 1嵌入式L inux系统1 1 1嵌入式Lin

7、ux系统嵌入式L nux系统主要分为4个部分,分别为MLO, Uboot ulm age和 rootfs L inux 启动过程也是 按照这个顺序,先加载MLO即x-loader,为第一阶段 引导装载器,主要实现的功能是初始化最基本的硬 件,然后根据启动方式从nand flash或mmc/sd拷贝u-boot代码到内存,把系统引导到能够装载 第二阶 段引导装载器的状态。第二阶段引导装载器是U-boot但是大多数 发行版在 u-boo.t bin文件中 提供 自己的U-boo t版本。U-boot对大部分的硬 件进行 初始化,然后引导L inux内核,完成系统的启动。112系统移植步骤MLO与u

8、boot的编译非常相似,都是在其对应 源码中修改 makefile CROSS_COMPILE为自己的 交叉编译 器,然后执行 make d stclean和 make omap3530stalker_config&& make , MLO 还要多 1 个 签名步骤 /signGP x bad bin,然后执行 mvxload. b in. iftMLO 将 xload. bin 改名为 MLO。内核的编译可以通过命令 make menuconfig 来自己配置需要的选项,生成自己定 制的内核,也可以在内核源码目录/arch/arm /configs中将对应的配置文件拷贝出来,

9、执行 make om ap3_devkit8000_ defconfig 和 make uImage 生成 DevKit8000系统默 认配置的内核文件。1 1 3根文件系统 rootfs如果是将 rootfs烧录至U nand flash启动的话,可 以使用后缀为.mg的镜像文件如ub.i mg如果是在SD卡启动,可以采用 ram disk的压缩包格式,它 是在内核加载完成后将rootfs解压缩到内存中让用户自行操作内核;还有另外一种较为常用的方法是 使用双分区技术将SD格式化为 2个分区,一个是FAT32格式,另一个是 EXT3 FAT32格式的分区可 以在 windovs下识别,用以存放

10、 MLO, uboot和u W age而Linux分区即EXT3则存放 rootfs这样做的好处是系统启动后不需要将文件系统解压到内存中,可以节约一部分内存。在嵌入式平台资源本来 就紧张的环境下,这不失为一种较好的方法。1 2 U SB驱动结构USB驱动采用树形拓扑结构,在USB接口协议 中,USB被划分为USB主机和USB设备2个部 分1。每条总 线上只有 1个主 机控制器HC ( host controller),负责 协议主 机与 设备之 间的通 信。而 USB设备则可以对应很多个,主机是 USB的核心,管理着每个USB设备,每一次USB数据通信都必须 由USB设备来发起。USB主机系统

11、由多层构成,总 体结构如图2所示。图2 USB驱动架构在L nux主机驱动中,硬件部分包括根集线器 和USB主机控制器,提供USB的物理层功能。在其 之上运行的是 U SB主机控制器驱动 H CD( host cont- oller driver)。 H CD作为底层硬件的驱动程序,一方面控制和管理底层硬 件,负责将USB事务发送给 USB主机控制器芯片;另一方面为上层的USB系统软件提供了 统一的 接口 HCI( host controller nte- face),方便将各种不同的 HC映射到USB系统。目 前HCI主要有3种不同的标准:UHC, OHCI和EH- C,其中EHCI标准为增

12、强型,HCI支持USB2 0高 速模式(60 M bit/s)。主机控制器驱动之上为USB驱动(USBD)层,再上层为USB设备驱动层。因此, 在驱动的总 体结构中,要实现的USB驱动包括2 类:USB主机控制器驱动和 USB设备驱 动,前者控 制插入其中的USB设备,后者控制USB设备如何与 主机通信。Linux内核USB核心(USBD )负责USB驱动管 理和协议处理的主要工作,它通过定义一系列的数 据结构、函数和宏定义 来抽象设备的 硬件细节,向 上为设备驱动提供编程接口,向下为主机控制器驱动提供编程接口。其具体功能包括:提供与设备驱动程序的接口 API、读取USB设备描述符、配置描述

13、符,为USB设备分配唯一的地址端点,支持基本的USB命令请求、配置设备、连接设备与相应的驱动 程序、转发设备驱动程序的数据包。在Lnux编写U SB设备的驱动程序,从严格意义上 来讲,就是使 用USB内核定义的这些数据结构、函数来编写数据 的处理功能。1 3 EZ-U SB FX 2驱动开发与实现1 3 1 EZ-U SBFX2驱动U SB驱动文件是在L inux2 6 29 drivers usb目录下,通过 makemenuconfg命令将 USB驱动下EHC I H CD (USB 2 0 ) support 和 Select FHY / TLL m ode for USB ports

14、on OMAP34xx /OMAP35xx 配置选项选择为*编译进内核,然后再编译对应的USB设备驱动2。EZ-USB FX2芯片驱 动可使用L inu*2 6 29 drivers'usb目录下的示例 usbskeleton. c文件,将该 文件的第27行和第28行即匹配具体设备的VID和PID,将其改为 EZ-U SB FX2芯片的 V ID和 PID号, 具体修改女口 下:# define USB _SKEL _VENDOR _ID# 0x0547 和 # define USB _ SKEL _PRODUCT _ ID# 0x1002然后将该文件 与编译驱动的M akefile放

15、在一个目录下,在终端直接输入M ake命令便可得到想要的驱动文件,输入 insn od skeleton ko后系统 识别该文件下的 m odule_ n it( usb_skel_ n it)继而调 用skel_probe()函数实现 USB驱动的加载,若要卸 载该驱动 则输入 mmod skeleton ko系统会识别 该驱动文件的 m odule_exit( usb_skel_ex it)实现卸载 该驱动3。1 3 2数据读取流程上述编译的驱动虽然可加载成功,也可以读到 从FPGA产生并传给E乙USB的循环码数据,但是速率只有15M bit/s左右,同时伴随着丢失数据的不 连续。分析整个

16、数据读取的过程,该驱动的skel_read()读数据函数,其函数原型为:static ssize_t skel_read( struct file * file char* buffer size_t court,loff_t* ppos)其中第 1 个参数为 该驱动的文件描述字,第2个参数为存放数据的首地 址,第3个参数为读取数据的大小。该函数最关键的 是调用USB驱动核心部分的bulk传输函数。usb_bulk_msg(dev- > udevusb_rcvbulkpipe( dev- > udev dev- > buk_h_end pointAddr),dev- >

17、 bulk_ n_bu fferm n( dev- > bulk_in_size count),& bytes_read 10000);从中可以 看到该USB驱动使用了bulk传输。第1个参数指定了该驱动对应的USB设备,第2个参数定义了 bu lk传输过程的输入端点,第3个参数 为驱动存放数据的首地址,第4个参数表示最大可 读取的字节数,第5个参数表示实际读取数据的大 小,因为该函数采用同步等待,所以有最 大等待时间为10 000ms该函数会调用 USB核心函数通过 USB主机控制器驱动将USB设备硬件端点的数据传输到 dev- > bu k_in_buffer当数据已经

18、读到 dev- > bu lk_in_buffer中,skel _read函数又调用 copy_to_user()函数将 USB数据 传送到应用层空间。1 3 3 EZ-USB FX2驱动设计方案整个数据读取流程只有dev- > bulk_ n_buffer可以修改,该buffer大小的申请在usbskeleton. c文件的第 382 行:dev- > bulk _ in _bu ffer = km alloc (buffer_ size GFP_KERNEL ),其 中 buffer_size= le16_to_cpu ( endpoint- > wM axPack

19、etSize),初始大 小为512 bit也就是每调用一次skel_read()只能读取512 bit如果应用层一次需要读取几M大小的字节则会频繁调用该函数,这样会导致在连续调用该 函数的间隙中丢失一部分数据,将该dev- > bulk_n_buffer = kmalloc( buffer_size* 128 GFP_KER- NEL)即该buffer增大到64 kB时测试接收到的速率 有所提升,数据的丢失率也减少了,但是数据仍然存在着丢失。因为利用kmalloc()函数申请 buffer的大小最大只能是128 kB,如果还想扩大 bu ffer只 能采用内存页的申请方式,同时由于底层传

20、输采用 的是DMA方式,这就要求该buffer的物理地址必须 是连续的,所以最后决定使用_get_free_pages()内存页申请函数,该函数定义在mm/page_alloc. c文55件的line 2172处,其原型为:© 1 4-2012 ChinaJournal Electronic Publishing Hcuuc. All fights rvstrved. htlp: /wwW.Cftki前沿技术unsigned long_get_ free_pages( ) (gp_t gfp_ mask unsigned int order)第1个参数gfp_mask为标识符也称之为

21、分配优先级,第2个参数order是指分配的大小,其最大 值由 in clude/L nux /Mm zone h 文件中的 MAX _OR- DER宏决定,在默认的2 6 29内核版本中,该宏定 义为1C。该函数申请内容空间大小的计算公式为:sze= (1< < order) 4 kB,最大可以申请 4Mbi大 小的连续内存空间即oider= 10。这里我们需要修改为 dev- > bu k_ in_buffer = _get_free_pages(_ GFP_DMA, 10),然后在对应kmalloc()函数释放内存空间的地方我们也修改为对应的内存释放函数,将 75 lin

22、e处的 k free( dev- > bulk_ in_buffer);修改 为 free_page(dev- > bulk_in_buffer);保存后输入命 令 make后生成新的 usb-ske leton ko驱动,加载后 运行应用程序发现数据传输速率为理想的20 48Mbit/s,用程序验证接收到 的数据也没有 发 现有数据丢失的现象。至此,4M bit/s大缓存的45U SB驱动开发完成。2测试及结果在 DevKit8000和 EZ-USB FX2 平台上,将 USB 驱动中dev- > bulk_ n_buffer修改为不同大小的数 值,分别为 512 bit

23、64 kB 1 MB、4M, 1 M缓存是将 order赋值为8, 4M缓存对应的order为10不同的 buffer大小都测试100次以上,取其平均值得到以下 的测试结果如表1所示。表1不同buffer对应的测试结果Bu ffer大小Bytes实际速率M bit/s理论速率Mbit/s丢失率%51215 1220 482764 K17 7820 48131M19 5320 4854M20 4820 480经测试发现buffer值的大小对数据的传输速率和数据的丢失多少有着根本的影响,从表1中可以看出驱动申请的 buffer越大则数据丢失率越小。在 buffer为1 MB的时候速度已经接近理想速度,提高 为4 M B时发现测试速度为20 48 MB与理论速度相同,并用测试程序测试收到的数据也完全是FRGA产生的循环码序列,从而验证了 4M B大缓存的 USB驱动的有效性。3结束语本文为 D ev< it8000平台下的 E乙USB FX2设计 了基于嵌入式 Linux的大容量数据传输驱动,成功解决了数据丢失与速率不够的问题,目前已用于项目开发平台。由于 Linux内核源码的开放性与USB设备的大量涌现6,在解决高速传输数据的问题上 可以为同类Linux下的USB设备驱动开发所借鉴。参考文献:1 毛德操,胡希明.Linux内核源代码情景

温馨提示

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

评论

0/150

提交评论