基于Linux的USB主、从设备之间的三种通信方式_第1页
基于Linux的USB主、从设备之间的三种通信方式_第2页
基于Linux的USB主、从设备之间的三种通信方式_第3页
基于Linux的USB主、从设备之间的三种通信方式_第4页
基于Linux的USB主、从设备之间的三种通信方式_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、基于Linux的USB主、从设备之间的三种通信方式通用串行总线(USB,UniversalSerialBus)是一种专门有用的通信接口,其应用日益广泛。有三种方法能够使运行Linux操作系统的嵌入式系统支持USB接口,本文将对这三种方法逐一进行介绍。基于Linux的USB设备与USB主机一样有以下三种通信方式:1.一些功能最完备结构也最复杂的设备采纳用户定制内核模块来实现在标准USB总线上运行复杂的高级协议,而由USB主机上相应的用户驱动程序和应用来完成连接。2另一些基于Linux的USB设备则利用USB总线来实现与主机上所运行的某个应用的简单的点对点串行连接。主机上的应用尽管利用了主操作系统

2、所提供的USB编程接口,但表面看来却看起来是在通过一个典型的串口进行通信。3最后,还有些设备以主运算机作为网关,将USB设备连接到办公局域网或互联网上,从而使USB设备看起看起来构成了一个以太网。这种方法专业性较强,但通常可行,是主机驱动程序使该方法成为可能。在这三种方法中,您能够按照预留给开发的时刻长短和期望USB接口在嵌入式应用中所扮演的角色来决定选用那一种方法比较恰当。为了关心您做出正确的选择,下一节将向您介绍这三种方法分不应用于基于Linux的USB设备时的情形,但第一让我们对USB接口做一个大致介绍。USB概述USB是一种方便快捷的接口,可用于为运算机工作站连接一些小配件。按照USB

3、规范的定义,鼠标、键盘、音频播放和录音设备、照相机、大容量储备设备以及许多其他设备均能够通过USB接口,以高达480Mbps的速度连接到一台主运算机。协议定制者对USB上运行的这种复杂的主从式协议做出了认确实讲明,这就关心保证了所有这些设备之间具备互操作性和兼容性。例如,该协议规定,USB设备只有在被询咨询时才能够回答,同时USB主机会按照所连接的USB设备类型的不同,采纳某些特定的格式,在某些特定的时刻段从不同的设备猎取数据。USB设备和主机之间通常通过专用的总线操纵芯片建立连接。在USB主机上,名为UHCI或OHCI等的操纵芯片通过插卡形式加入主机或直截了当集成到工作站的主板上。在主机一端

4、的总线操纵驱动程序治理着主机操纵芯片,它同时还跟踪监视着主机目前连接的是哪些USB设备,从而决定应如何与它们通信。可用于连接照相机和鼠标之类USB设备的总线操纵器有专门多种。其中的一种就在一块芯片上同时集成了USB接口以及另一端的串口、I2C接口或并口。USB操纵器(包括主机上的和USB设备上的操纵器)也可能集成到英特尔StrongARM或HitachiH8之类的微操纵器中去。这些芯片及其外围部件有点类似以太网和CAN操纵器,不同的是他们用于连接USB设备,并运行USB协议。专门多人都明白Linux操作系统中包含了USB主机操纵器的驱动程序,因而USB键盘、数码相机以及其他一些USB设备都能够

5、在一个运行Linux操作系统的桌面工作站上使用。但专门少有人明白Linux中还包含了一组USB设备操纵器的驱动程序,专门是集成到StrongARMSA1110处理器中的操纵器。有了这些操纵器驱动程序,基于Linux的嵌入式系统就能利用USB接口来与主运算机(运行Linux或其他操作系统)通信。大多数USB通信的实现过程差不多上双端的。主机利用一个内核模块或驱动程序来与USB设备通信,而USB设备则通过其自身的驱动程序来与主机通信。按照主机和USB设备所采纳的通信风格的不同,驱动程序能够专门简单明白,也能够专门复杂,专门具挑战性。本文要紧关注USB设备端的通信过程,但也在适当的地点包含了关于主机

6、端通信过程实现的信息。以下讨论的技术应当引起读者的注意。本文的目的是介绍如何在数码相机和PDA等基于Linux的USB设备上使用Linux。此处所指的USB设备是严格意义上的USB设备,即带正方形连接器的完整的设备,而不是哪些连接器形状为扁平矩形的设备。此外,USB连接的另一端(通常是一台PC工作站),应该是一台USB主机。关于USB信息包的格式和通信参数的详细信息,见本文的参考文献。通过编写内核模块添加USB接口1.USB设备端通信过程向一个基于Linux的设备中添加USB接口的第一种方法是编写一个用户定制的Linux内核模块,这也是可实现最完备功能的一种做法。采纳这种方法时通常需要针对主机

7、的操作系统(Windows,Linux等)开发相应的驱动程序。fOTHifutrjlwijwmUIlf*inc-Ct尸谢MilMu出opilfKWvchMlrfeeq巾irhtrapsitv%p#ckw父,n.M-imn5:Lmnll:TX_PMKIT皿的JU即叫由iDMA);pui<k«hLrWf*-UMr-)hnwiiMi:昭WtllT_Sl?EGF_KEfiNEijGFP_DMAi.尸ifFMma中版vh#buNw;theeimhghd讣&brfe<代pgvtopj&inngread(|7gg阜birfatchdTlItiiMPliOtlRBUF.S

8、UIrGfP.lURKttL"IupUSB早<g7h*»cfied«Cf1pt«10:尸«bleSBgVHi赫岫1ism;rwrtup冲咻cirpiskri"/kKkWJrt_ntnc*urn小;一旦在设备中实现了用户定制的内核模块,就能够使该设备完成相当复杂的功能,例如仿真一个文件系统,从而承诺嵌入式应用将其USB主机当作一个远程储备设备。除此以外,采纳这种方法之后,设备还能够具备储备转发(store-and-forward)的功能,因而能够在与USB主机的连接建立之前对来自嵌入式应用的数据流进行缓冲。在基于StrongARM

9、的Linux设备中,内核代码用于治理芯片所携带的USB设备操纵器外设,通过调用函数sa1100_usb_open俳初始化。在初始化之后,内核模块还会调用函数sa1100_usb_get_descriptor_ptr伊口sa1100_usb_set_string_descriptor(来设置在设备查询期间传送给USB主机的描述符,其中包含设备的数字厂商号和产品标识符,以及能够让主机用来识不设备的字符串,甚至还有一个序列号域,以便主机能够唯独地识不一个连接在USB接口上的设备,或者在同种型号的多个设备中进行区分。设备查询过程是由USB设备操纵器驱动的,同时一旦和USB主机连上之后会自动执行,因此内

10、核模块必须在USB通信开始之前设置好每个设备的描述符。当预备工作就绪之后,USB设备模块就会调用函数sa1100_usb_start(来通知内核接U主机发来的USB连接要求。如果设备模块在连上USB主机之前调用了函数sa1100_set_configured_callback()那么接着内核模块就会在查询过程终止时调用回调函数。回调函数专门适合用来在设备上发出警告或给出一些形象的暗示,讲明连接差不多建立。如果不再需要进行USB通信,那么设备的内核模块就会先调用函数sa1100_usb_stop()然后调用sa1100_usb_close()来关闭SA1100上的USB操纵器。StrongARM

11、的USB操纵器支持bulk-in和bulk-out两种数据传送方式。当接收来自USB主机的数据包时,内核模块会调用sa1100_usb_recv(),将一个数据缓冲区的地址和一个回调函数送给它。然后内核中的USB设备操纵代码会从主机取回一个bulk-out数据包,将其内容存入制定的缓冲区,接着调用回调函数。下一步,回调函数从接收缓冲区中提取出数据,将其存放到其他地点,或者将缓冲区空间添加到一个队列中,然后分配一个新的缓冲区来接收下一个数据包。然后,如果还有数据需要接收,那么回调函数会重新调用sa1100_usb_recv()预备接收另一个数据包。向USB主机发送数据的过程与此类似。内核模块收集

12、了一帧数据之后,将数据的存放地址、数据长度和回调函数的地址送给sa1100_usb_send()函数。接着,在数据传送终止之后,内核模块会调用回调函数。2. USB主机端通信过程有些专门好的主机端USB驱动程序的例子是随主流Linux操作系统的公布而提供的,位于TheLinuxKernelArchives()公布的原始内核源代码中。其中,HandspringVisor模块(drivers/usb/serial/visor.c)M一个编写得更清晰,也更易明白得的模块,它同时也是USB主机端模块(drivers/usb/usb-skeleton.c的模板。利用USB实现高速串行

13、通信1. USB设备端通信过程为了达到最有用的成效,我们能够将USB总线简单地看作一个高速串口,然后,在一些嵌入式设备和应用中,我们就能够用USB接口来模拟串口。StrongARM处理器的Linux内核就提供了一个名为usb-char的USB设备驱动程序,它所完成的恰好确实是用USB模拟串口的功能。当需要与USB主机通信时,Linux操作系统中的USB设备应用只是简单地打开一个与其usb-char设备节点的连接(连接类型为字符型,majornumber为10,minor为240),然后就开始读写数据。在与USB主机的连接建立之前,read()和write()操作均返回一个错误信息。一旦连接建立

14、好,同时设备查询完成之后,USB接口就开始象一个点对点的串口一样与主机进行通信。这种进行USB数据传送的方法专门简单有效,因而usb-cha改备模块公布之后一直专门受欢迎。而且,该模块还为通过其他方法进行USB通信提供了一个参考。在usb-char中,真正的操作开始于usbc_open()®数,列表1给出了函数的一部分代码。笔者由于临时的爱好,对该代码做了一点修改,取消了错误和超时句柄。在此向代码的原作者BradParker、NicolasPitre和WardWillats致歉。twiddle_descriptors()函数用于设置设备的USB描述符。在描述符设置好之后,我们就能够开

15、始进行设备查询,并从USB主机接收一帧数据。kick_start_rx()函数段的代码要紧用于调用sa1100_usb_recv()建立回调。在USB主机发送一个数据包时,设备的内核模块会通过回调方式调用rx_done_callback_packet_buffer()B数,将数据包的内容送入一个FIFO队列,以便能通过read()函数将该数据包返回给usb-char设备节点。2. USB主机端通信过程关于运行Linux操作系统的USB主机,与usb-char相应的USB主机模块叫做usbserial。大多数Linux版本中都包含了该模块,但它并不总能自动加载。通常应在主机与USB设备之间的连接

16、建立之前利用modprobe或insmod加载该模块。USB设备查询完成之后,主机上的一项应用就会利用某个usbserial设备节点(字符型,major为188,minor大于等于0)与其通信。这些节点通常叫做/dev/ttyUSBn。Usbserial模块会报告它将哪一个节点分配给了哪一台USB设备,并将这一信息按如下方式记载在内核消息记录中:=usbserial.c:检测到一样转换器usbserial.c:将一样转换器加入ttyUSB0这种连接一旦建立,USB主机上的应用就能够通过向特定的节点读或写的方式与某USB设备通信。现在,笔者并未考虑在运行Win32或其他类型操作系统的主机上已有类

17、似usbserial的模块。但用于这些主机上的任何USB驱动程序,只要能够进行bulk-in和bulk-out数据传输,就专门可能是一个近乎完整的驱动程序,只需进行一定的产品调整,并添加与产品绑定的厂商ID。Linux主机上还有另一种类似usbserial模块的库,叫做libusb(参见)该库通过低级的内核系统调用而不是通过usbserial模块来完成USB数据传输,因而在Linuxkernel版本上更容易设置和使用。同时,该库还能提供大量有用的调试功能,十分利于对USB链接上运行的复杂的通信协议进行调试。为了通过libusb与一个采纳了usb-char模块的USB设备进行通信,Linux主机

18、应用第一通过库中的usb_open()l数与设备建立连接,然后利用函数usb_bulk_read伊口usb_bulk_write()与设备交换数据。Libusb中含有几个程序范例。利用USB实现以太网连接1. USB设备端通信过程如果利用USB连接来实现高速串口并非您所期望,那么您还能够将所有USB连接用作一个以太网。不论在主机端依旧在设备端,Linux均有模块能实现这一功能。iPAQ(掌上电脑)的Linux内核就独一无二地采纳了这种通信策略,因为iPAQ硬件中既没有可访咨询的串口也没有专门的网络接口。StrongARMLinux内核中,有一个叫做usb-eth的模块(arch/arm/mac

19、h-sa1100/usb-eth.c)它利用USB作为物理媒介,模拟出一个虚构的以太网设备。一旦这种网络接口创建起来之后,就能够为它分配IP地址,同时外部环境均将其作为一个一般的以太网硬件对待。一旦USB主机连接建立起来,usb-eth模块就承诺USB设备“扫瞄”因特网,拼其他的IP地址,甚至通过DHCP、HTTP、NFS或者远程网“交谈”,以及收发电子邮件。简而言之,任何能够在真正的以太网接口上运行的应用都能够原封不动地在usb-eth上运行,因为这些应用无法识不它们所使用的事实上并非真正的以太网硬件。2. USB主机端通信过程相应的,在运行Linux操作系统的主机一端,可用来在USB上实现以太网连接的内核模块叫做usbnet安装了该模块之后,一旦主机与USB设备的连接建立起来,它就会创建

温馨提示

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

评论

0/150

提交评论