下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于Linux的USB主/从设备之间的三种通信方式随着简单易用的USB接口日益流行,在 嵌入式系统中添加对usbS口的支持已 成为大势所趋。本文通过介绍Linux中支持USB的各种模块和库,分析了在 Linux上利用USBS现高速串口而氐网连接等通信方式的具体方法。通用串行总线(USB,Universal Serial Bus)是一种非常实用的通信接口,其应用日益广泛。有三种方法可以使运行 Linux操作系统的嵌入式系统支持USB妾 口,本文将对这三种方法逐一进行介绍。基于Linux的USB设备与USB主机一般有以下三种通信方式:1. 一些功能最完 备结构也最复杂的设备采用用户定制核模块来实现
2、在标准USB总线上运行复杂的高级协议,而由USB主机上相应的用户驱动程序和应用来完成连接。2.另一些基于Linux的USB®备则利用USB总线来实现与主机上所运行的某个应用的 简单的点对点串行连接。主机上的应用虽然利用了主操作系统所提供的USBg程接口,但表面看来却似乎是在通过一个典型的串口进行通信。3 .最后,还有些设备以主计算机作为网关,将 USB®备连接到办公局域网或互联网上,从而 使US破备看起仿佛构成了一个以太网。这种方法专业性较强,但通常可行, 是主机驱动程序使该方法成为可能。在这三种方法中,您可以根据预留给开发的时间长短和期望USBR口在嵌入式应用中所扮演的角
3、色来决定选用那一种方法比较恰当。为了帮助您做出正确的 选择,下一节将向您介绍这三种方法分别应用于基于Linux的USB®备时的情况,但首先让我们对USES 口做一个大致介绍。USBffi述USB是一种方便快捷的接口,可用于为计算机工作站连接一些小配件。根据 USB 规的定义,鼠标、键盘、音频播放和录音设备、照相机、大容量存储设备以及 许多其他设备均可以通过 USBg口,以高达480Mbps的速度连接到一台主计算 机。协议定制者对USB上运行的这种复杂的主从式协议做出了仔细的说明,这 就帮助保证了所有这些设备之间具备互操作性和兼容性。例如,该协议规定, USB®备只有在被询问
4、时才可以回答,并且 USBi机会根据所连接的US暇备 类型的不同,采用某些特定的格式,在某些特定的时间段从不同的设备获取数 据。USB®备和主机之间通常通过专用的总线控制芯片建立连接。在USBi机上,名为UHCI或OHCI等的控制芯片通过插卡形式加入主机或直接集成到工作站的 主板上。在主机一端的总线控制驱动程序管理着主机控制芯片,它同时还跟踪 监视着主机目前连接的是哪些 USB®备,从而决定应如何与它们通信。可用于连接照相机和鼠标之类 USB®备的总线控制器有很多种。其中的一种就 在一块芯片上同时集成了 US眼口以及另一端的串口、 I2C接口或并口。USB空 制器
5、(包括主机上的和USB®备上的控制器)也可能集成到英特尔StrongARM或Hitachi H8之类的微控制器中去。这些芯片及其外围部件有点类似以太网和CAN®制器,不同的是他们用于连接 USB®备,并运行USBB议。很多人都知道Linux操作系统中包含了 USB主机控制器的驱动程序,因而 USB 键盘、数码相机以及其他一些 USBS备都可以在一个运行Linux操作系统的桌 面工作站上使用。但很少有人知道 Linux中还包含了一组USB设备控制器的驱 动程序,尤其是集成到StrongARM SA1110处理器中的控制器。有了这些控制器 驱动程序,基于Linux的嵌
6、入式系统就能利用USB8 口来与主计算机(运行 Linux或其他操作系统)通信。大多数USB®信的实现过程都是双端的。主机利 用一个核模块或驱动程序来与 USBS备通彳S,而USBS备则通过其自身的驱动 程序来与主机通信。根据主机和 USBS备所采用的通信风格的不同,驱动程序 可以很简单明白,也可以很复杂,很具挑战性。本文主要关注USBS备端的通信过程,但也在适当的地方包含了关于主机端通信过程实现的信息。以下讨论的技术应当引起读者的注意。本文的目的是介绍如何在数码相机和 PDA?基于Linux的US暇备上使用Linux。此处所指的USB®备是严格意义上 的US股备,即带正方
7、形连接器的完整的设备,而不是哪些连接器形状为扁平 矩形的设备。止匕外,US琏接的另一端(通常是一台PC工作站),应该是一台 USB主机。关于USB信息包的格式和通信参数的详细信息,见本文的参考文献。通过编写核模块添加USB® 口1. USB设备端通信过程向一个基于Linux的设备中添加USB8 口的第一种方法是编写一个用户定制的 Linux核模块,这也是可实现最完备功能的一种做法。采用这种方法时通常需 要针对主机的操作系统(Windows, Linux等)开发相应的驱动程序。srif wk 邮"4附'pirt tTufi ilk 'M总r* ?JLMl 加3
8、3 ApwOr如dh加工r 制拿源? Eerw * 丽 i>trapsit v 用 p#cke<sPMItT 眦匕0卬 K|HNfL| GH' EJMA1;packethltoc:骸 岫CW.SIZEdP_唯口海尹 研 津r i- nwma gi the fe“ buffM :IM ehi Emu of ih K0.-曲阜时(chAT kmkllliXiABUF 姐l琉忆KtRNEU.尸Hup USB "<rip«g*/nrtdg dMCriptmO;161*0如勺*/utig u他比1巾七L方/kipgrOCdWT*2*用*'Buck ,
9、O1 nU;refl urn &一旦在设备中实现了用户定制的核模块,就可以使该设备完成相当复杂的功能,例如仿真一个文件系统,从而允许嵌入式应用将其USB主机当作一个远程存储设备。除此以外,采用这种方法之后,设备还可以具备存储转发(store-and-forward)的功能,因而能够在与 USB主机的连接建立之前对来自嵌入式应 用的数据流进行缓冲。在基于StrongARM的Linux设备中,核代码用于管理芯片所携带的US破备控制器外设,通过调用函数sa1100_usb_open() 来初始化。在初始化之后,核模块还会调用函数sa1100_usb_get_descriptor_ptr()
10、和sa1100_usb_set_string_descriptor()来设置在设备查询期间传送给 USBi机的描述符,其中包含设备的数字厂商号和产品标识符,以及可以让主机用来识别设备的字符串,甚至还有一个序列号域,以便主机可以唯一地识别一个连接在USB8口上的设备,或者在同种型号的多个设备中进行区分。设备查询过程是由USBS备控制器驱动的,并且一旦和 USB主机连上之后会自 动执行,所以核模块必须在 USB!信开始之前设置好每个设备的描述符。当准 备工作就绪之后,US暇备模块就会调用函数sa1100_usb_start()来通知核接 收主机发来的USB连接请求。如果设备模块在连上 USB主瓦之
11、前调用了函数 sa1100_set_configured_callback() ,那么接着核模块就会在查询过程结束时调用回调函数。回调函数很适合用来在设备上发出警告或给出一些形象的暗示,说明连接已经建立。如果不再需要进行USB!信,那么设备的核模块就会先调用函数sa1100_usb_stop(),然后调用 sa1100_usb_close(),来关闭 SA1100上的 USB 控制器。StrongARM的USB控制器支持bulk-in 和bulk-out两种数据传送方式。当接收 来自USB主机的数据包时,核模块会调用 sa1100_usb_recv(),将一个数据缓 冲区的地址和一个回调函数送
12、给它。然后核中的 USBS备控制代码会从主机取 回一个 bulk-out 数据包,将其容存入制定的缓冲区,接着调用回调函数。下一步,回调函数从接收缓冲区中提取出数据,将其存放到其他地方,或者将缓冲区空间添加到一个队列中,然后分配一个新的缓冲区来接收下一个数据包。然后,如果还有数据需要接收,那么回调函数会重新调用sa1100_usb_recv() ,准备接收另一个数据包。向USB主机发送数据的过程与此类似。核模块收集了一帧数据之后,将数据的存放地址、数据长度和回调函数的地址送给sa1100_usb_send() 函数。接着,在数据传送结束之后,核模块会调用回调函数。在 www.embedded.
13、/code.htm(arch/arm/mach-sa1100/usb-char.c) 可以找到一个叫做 usb-char 的模块,这是一个很好的设备端SA1110 Linux USB 模块的例子。该模块将USB设备与USB主机之间的连接变成一种高速串行。止匕外,usb-eth( arch/arm/mach-sa1100/usb-eth.c) 模块也是个不错的例子,该模块将US眩成了一种虚拟的以太型网络。后面会深入探讨这两种模块。2. USB 主机端通信过程有些很好的主机端USB8区动程序的例子是随主流Linux操作系统的发布而提供 的,位于The Linux Kernel Archives (
14、) 发布的原始核源代码中。其中, Handspring Visor 模块 (drivers/usb/serial/visor.c) 是一个编写得更清晰,也更易理解的模块,它同时也是USB主机端模块(drivers/usb/usb-skeleton.c) 的模板。利用USB实现高速串行通信1. USB 设备端通信过程为了达到最实用的效果,我们可以将USB总线简单地看作一个高速串口,然后,在一些嵌入式设备和应用中,我们就可以用US眼口来模拟串口。StrongARM处理器的Linux核就提供了一个名为usb-char的USBiS备驱动程 序,它所完成的恰好就是用USB真拟串口的功
15、能。当需要与USB主机通信时,Linux操作系统中的USBS备应用只是简单地打开一个与其usb-char 设备节点的连接(连接类型为字符型,major number 为 10,minor为240),然后就开始读写数据。在与 USB主机的连接建立之前,read()和 write() 操作均返回一个错误信息。一旦连接建立好,并且设备查询完成之后,USB8 口就开始象一个点对点的串口一样与主机进行通信。这种进行US琳据传送的方法非常简单有效,因而 usb-char设备模块发布之后 一直很受欢迎。而且,该模块还为通过其他方法进行USB!信提供了一个参考。在 usb-char 中,真正的操作开始于usb
16、c_open() 函数,列表1 给出了函数的一部分代码。笔者由于临时的兴趣,对该代码做了一点修改,取消了错误和超时句柄。在此向代码的原作者Brad Parker 、 Nicolas Pitre 和 Ward Willats 致歉。twiddle_descriptors()函数用于设置设备的USB的述符。在描述符设置好之后,我们就可以开始进行设备查询,并从USB主机接收一帧数据。kick_start_rx() 函数段的代码主要用于调用sa1100_usb_recv() ,建立回调。在USB主机发送一个数据包时,设备的核模块会通过回调方式调用rx_done_callback_packet_buff
17、er() 函数,将数据包的容送入一个 FIFO 队歹!J, 以便能通过read() 函数将该数据包返回给usb-char 设备节点。2. USB 主机端通信过程对于运行Linux操作系统的USB主机,与usb-char相应的USB主机模块叫做 usbserial 。大多数Linux 版本中都包含了该模块,但它并不总能自动加载。通常应在主机与USB设备之间的连接建立之前利用 modprobe或insmod加载该模 块。USBS备查询完成之后,主机上白一项应用就会利用某个usbserial设备节点(字符型 , major 为 188, minor 大于等于0)与其通信。这些节点通常叫做/dev/t
18、tyUSBn 。 Usbserial模块会报告它将哪一个节点分配给了哪一台US暇备,并将这一信息按如下方式记载在核消息记录中:usbserial.c :检测到一般转换器usbserial.c :将一般转换器加入ttyUSB0这种连接一旦建立,USB主机上的应用就可以通过向特定的节点读或写的方式 与某USB设备通信。此时,笔者并未考虑在运行 Win32或其他类型操作系统的主机上已有类似 usbserial的模块。但用于这些主机上的任何US围区动程序,只要能够进行bulk-in 和 bulk-out 数据传输,就很可能是一个近乎完整的驱动程序,只需进行一定的产品调整,并添加与产品绑定的厂商ID。L
19、inux 主机上还有另一种类似usbserial 模块的库,叫做libusb ( 参见) 。该库通过低级的核系统调用而不是通过usbserial模块来完成USBR据传输,因而在Linux kernel版本上更容易设置和使用。同 时,该库还能提供大量实用的调试功能,十分利于对 USB上运行的复杂的通信 协议进行调试。为了通过libusb与一个采用了 usb-char模块的USBiS备进行通信,Linux主机应用首先通过库中的usb_open() 函数与设备建立连接,然后利用函数usb_bulk_read() 和 usb_bulk_write() 与设备交换数据。Libusb 中含有几个程序例。利
20、用USB实现以太网连接1. USB 设备端通信过程如果利用US琏接来实现高速串口并非您所希望,那么您还可以将所有USB连接用作一个以太网。不论在主机端还是在设备端,Linux 均有模块能实现这一功能。iPAQ(掌上电脑)的Linux核就独一无二地采用了这种通信策略,因为iPAQ硬件中既没有可访问的串口也没有专门的网络接口。StrongARM Linux 核中,有一个叫做usb-eth 的模块 (arch/arm/mach-sa1100/usb-eth.c),它利用USB乍为物理媒介,模拟出一个虚构的以太网设备。一旦这种网络接口创建起来之后,就可以为它分配IP 地址,并且外部环境均将其作为一个普
21、通的以太网硬件对待。一旦USB主机连接建立起来,usb-eth模块就允许US暇备“浏览”因特网,拼其他的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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能健身管理软件实施方案
- 健康生活方式:吃动平衡快乐成长小学主题班会课件
- 拒绝歧视平等对待四年级主题班会课件
- 传统文化我知道主题班会课件
- 关于采购订单调整确认函(7篇)
- 调整办公区域设备配置标准确认函6篇
- 弘扬科学精神培养探索精神的小学主题班会课件
- 金融机构风控专员风险防控KPI考核表
- 快消品销售经理业绩目标完成KPI考核表
- 2026中国智能机器人智能照明行业市场深度调研及投资前景与投资策略研究报告
- 崇州市人力资源开发有限责任公司公开招聘崇州市工会社会工作者(6人)笔试备考试题及答案详解
- 2026年度成都市公开选调公务员笔试备考试题及答案详解
- 中信建投:未来产业投资地图系列之“可控核聚变”
- 《具身智能技术及产业实践的阶段性进展 》
- 冰冻切片技术原理与应用
- 电脑维修保密协议书
- 车辆配送服务合同协议
- 家庭火灾应急处理
- 浦发银行申请结清证明
- CESA-2023-083《智慧园区 评价指标》
- DB43T 876.10-2015 高标准农田建设 第10部分:评价规范
评论
0/150
提交评论