ImageVerifierCode 换一换
格式:DOCX , 页数:6 ,大小:65.94KB ,
资源ID:5930113      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/5930113.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(基于Linux的USB主、从设备之间的三种通信方式.docx)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

基于Linux的USB主、从设备之间的三种通信方式.docx

1、基于Linux的USB主/从设备之间的三种通信方式 随着简单易用的USB接口日益流行,在嵌入式系统中添加对USB接口的支持已成为大势所趋。本文通过介绍Linux中支持USB的各种模块和库,分析了在Linux上利用USB实现高速串口和以太网连接等通信方式的具体方法。 通用串行总线(USB,Universal Serial Bus)是一种非常实用的通信接口,其应用日益广泛。有三种方法可以使运行Linux操作系统的嵌入式系统支持USB接口,本文将对这三种方法逐一进行介绍。 基于Linux的USB设备与USB主机一般有以下三种通信方式:1.一些功能最完备结构也最复杂的设备采用用户定制内核模块

2、来实现在标准USB总线上运行复杂的高级协议,而由USB主机上相应的用户驱动程序和应用来完成连接。2.另一些基于Linux的USB设备则利用USB总线来实现与主机上所运行的某个应用的简单的点对点串行连接。主机上的应用虽然利用了主操作系统所提供的USB编程接口,但表面看来却似乎是在通过一个典型的串口进行通信。3.最后,还有些设备以主计算机作为网关,将USB设备连接到办公局域网或互联网上,从而使USB设备看起仿佛构成了一个以太网。这种方法专业性较强,但通常可行,是主机驱动程序使该方法成为可能。 在这三种方法中,您可以根据预留给开发的时间长短和期望USB接口在嵌入式应用中所扮演的角色来决定选用那一

3、种方法比较恰当。为了帮助您做出正确的选择,下一节将向您介绍这三种方法分别应用于基于Linux的USB设备时的情况,但首先让我们对USB接口做一个大致介绍。 USB概述 USB是一种方便快捷的接口,可用于为计算机工作站连接一些小配件。根据USB规范的定义,鼠标、键盘、音频播放和录音设备、照相机、大容量存储设备以及许多其他设备均可以通过USB接口,以高达480Mbps的速度连接到一台主计算机。协议定制者对USB上运行的这种复杂的主从式协议做出了仔细的说明,这就帮助保证了所有这些设备之间具备互操作性和兼容性。例如,该协议规定,USB设备只有在被询问时才可以回答,并且USB主机会根据所连接的U

4、SB设备类型的不同,采用某些特定的格式,在某些特定的时间段从不同的设备获取数据。 USB设备和主机之间通常通过专用的总线控制芯片建立连接。在USB主机上,名为UHCI或OHCI等的控制芯片通过插卡形式加入主机或直接集成到工作站的主板上。在主机一端的总线控制驱动程序管理着主机控制芯片,它同时还跟踪监视着主机目前连接的是哪些USB设备,从而决定应如何与它们通信。 可用于连接照相机和鼠标之类USB设备的总线控制器有很多种。其中的一种就在一块芯片上同时集成了USB接口以及另一端的串口、I2C接口或并口。USB控制器(包括主机上的和USB设备上的控制器)也可能集成到英特尔StrongARM或 H

5、itachi H8之类的微控制器中去。这些芯片及其外围部件有点类似以太网和CAN控制器,不同的是他们用于连接USB设备,并运行USB协议。 很多人都知道Linux操作系统中包含了USB主机控制器的驱动程序,因而USB键盘、数码相机以及其他一些USB设备都可以在一个运行Linux操作系统的桌面工作站上使用。但很少有人知道Linux中还包含了一组USB设备控制器的驱动程序,尤其是集成到StrongARM SA1110处理器中的控制器。有了这些控制器驱动程序,基于Linux的嵌入式系统就能利用USB接口来与主计算机(运行Linux或其他操作系统)通信。大多数USB通信的实现过程都是双端的。主机利

6、用一个内核模块或驱动程序来与USB设备通信,而USB设备则通过其自身的驱动程序来与主机通信。根据主机和USB设备所采用的通信风格的不同,驱动程序可以很简单明白,也可以很复杂,很具挑战性。本文主要关注USB设备端的通信过程,但也在适当的地方包含了关于主机端通信过程实现的信息。 以下讨论的技术应当引起读者的注意。本文的目的是介绍如何在数码相机和PDA等基于Linux的USB设备上使用Linux。此处所指的USB设备是严格意义上的USB设备,即带正方形连接器的完整的设备,而不是哪些连接器形状为扁平矩形的设备。此外,USB连接的另一端(通常是一台PC工作站),应该是一台USB主机。 关于USB

7、信息包的格式和通信参数的详细信息,见本文的参考文献。 通过编写内核模块添加USB接口 1. USB设备端通信过程 向一个基于Linux的设备中添加USB接口的第一种方法是编写一个用户定制的Linux内核模块,这也是可实现最完备功能的一种做法。采用这种方法时通常需要针对主机的操作系统(Windows, Linux等)开发相应的驱动程序。 一旦在设备中实现了用户定制的内核模块,就可以使该设备完成相当复杂的功能,例如仿真一个文件系统,从而允许嵌入式应用将其USB主机当作一个远程存储设备。除此以外,采用这种方法之后,设备还可以具备存储转发(store-and-forward)的功能

8、因而能够在与USB主机的连接建立之前对来自嵌入式应用的数据流进行缓冲。 在基于StrongARM的Linux设备中,内核代码用于管理芯片所携带的USB设备控制器外设,通过调用函数sa1100_usb_open()来初始化。在初始化之后,内核模块还会调用函数sa1100_usb_get_descriptor_ptr() 和sa1100_usb_set_string_descriptor()来设置在设备查询期间传送给USB主机的描述符,其中包含设备的数字厂商号和产品标识符,以及可以让主机用来识别设备的字符串,甚至还有一个序列号域,以便主机可以唯一地识别一个连接在USB接口上的设备,或者在同种

9、型号的多个设备中进行区分。 设备查询过程是由USB设备控制器驱动的,并且一旦和USB主机连上之后会自动执行,所以内核模块必须在USB通信开始之前设置好每个设备的描述符。当准备工作就绪之后,USB设备模块就会调用函数sa1100_usb_start()来通知内核接收主机发来的USB连接请求。如果设备模块在连上USB 主机之前调用了函数sa1100_set_configured_callback(),那么接着内核模块就会在查询过程结束时调用回调函数。回调函数很适合用来在设备上发出警告或给出一些形象的暗示,说明连接已经建立。 如果不再需要进行USB通信,那么设备的内核模块就会先调用函数sa1

10、100_usb_stop(),然后调用sa1100_usb_close(),来关闭SA1100上的USB控制器。 StrongARM的 USB控制器支持bulk-in和bulk-out两种数据传送方式。当接收来自USB主机的数据包时,内核模块会调用sa1100_usb_recv(),将一个数据缓冲区的地址和一个回调函数送给它。然后内核中的USB设备控制代码会从主机取回一个bulk-out数据包,将其内容存入制定的缓冲区,接着调用回调函数。 下一步,回调函数从接收缓冲区中提取出数据,将其存放到其他地方,或者将缓冲区空间添加到一个队列中,然后分配一个新的缓冲区来接收下一个数据包。然后,如果

11、还有数据需要接收,那么回调函数会重新调用sa1100_usb_recv(),准备接收另一个数据包。 向USB 主机发送数据的过程与此类似。内核模块收集了一帧数据之后,将数据的存放地址、数据长度和回调函数的地址送给sa1100_usb_send()函数。接着,在数据传送结束之后,内核模块会调用回调函数。 在 Linux USB模块的例子。该模块将USB设备与USB 主机之间的连接变成一种高速串行链接。此外, usb-eth( arch/arm/mach-sa1100/usb-eth.c)模块也是个不错的例子,该模块将USB变成了一种虚拟的以太型网络。后面会深入探讨这两种模块。 2.

12、USB主机端通信过程 有些很好的主机端USB驱动程序的例子是随主流Linux操作系统的发布而提供的,位于The Linux Kernel Archives (kernel.org)发布的原始内核源代码中。其中,Handspring Visor 模块(drivers/usb/serial/visor.c)是一个编写得更清晰,也更易理解的模块,它同时也是USB 主机端模块(drivers/usb/usb-skeleton.c)的模板。 利用USB实现高速串行通信 1. USB设备端通信过程 为了达到最实用的效果,我们可以将USB总线简单地看作一个高速串口,然后,在一些嵌入式设备和应

13、用中,我们就可以用USB接口来模拟串口。StrongARM处理器的Linux内核就提供了一个名为usb-char的USB设备驱动程序,它所完成的恰好就是用USB模拟串口的功能。 当需要与USB 主机通信时,Linux操作系统中的USB设备应用只是简单地打开一个与其usb-char设备节点的连接(连接类型为字符型,major number 为10, minor 为240),然后就开始读写数据。在与USB 主机的连接建立之前,read()和write()操作均返回一个错误信息。一旦连接建立好,并且设备查询完成之后,USB接口就开始象一个点对点的串口一样与主机进行通信。 这种进行USB数据传

14、送的方法非常简单有效,因而usb-char设备模块发布之后一直很受欢迎。而且,该模块还为通过其他方法进行USB通信提供了一个参考。 在usb-char中,真正的操作开始于usbc_open()函数,列表1给出了函数的一部分代码。笔者由于临时的兴趣,对该代码做了一点修改,取消了错误和超时句柄。在此向代码的原作者Brad Parker、Nicolas Pitre 和Ward Willats致歉。 twiddle_descriptors()函数用于设置设备的USB描述符。在描述符设置好之后,我们就可以开始进行设备查询,并从USB 主机接收一帧数据。kick_start_rx()函数段的代码主

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

16、SB设备查询完成之后,主机上的一项应用就会利用某个usbserial设备节点(字符型, major 为188, minor 大于等于0)与其通信。这些节点通常叫做/dev/ttyUSBn。Usbserial模块会报告它将哪一个节点分配给了哪一台USB设备,并将这一信息按如下方式记载在内核消息记录中: =================================== usbserial.c:检测到一般转换器 usbserial.c:将一般转换器加入ttyUSB0 ================================== 这种连接一旦建立,USB 主机上的应用就可

17、以通过向特定的节点读或写的方式与某USB设备通信。 此时,笔者并未考虑在运行Win32或其他类型操作系统的主机上已有类似usbserial的模块。但用于这些主机上的任何USB驱动程序,只要能够进行bulk-in 和 bulk-out数据传输,就很可能是一个近乎完整的驱动程序,只需进行一定的产品调整,并添加与产品绑定的厂商ID。 Linux主机上还有另一种类似usbserial模块的库,叫做libusb (参见)。该库通过低级的内核系统调用而不是通过usbserial模块来完成USB数据传输,因而在Linux kernel版本上更容易设置和使用。同时,该库还能提供大量实用的调试功能,十分

18、利于对USB链接上运行的复杂的通信协议进行调试。 为了通过libusb与一个采用了usb-char模块的USB设备进行通信,Linux主机应用首先通过库中的usb_open()函数与设备建立连接,然后利用函数usb_bulk_read()和usb_bulk_write()与设备交换数据。Libusb中含有几个程序范例。 利用USB实现以太网连接 1. USB 设备端通信过程 如果利用USB连接来实现高速串口并非您所希望,那么您还可以将所有USB连接用作一个以太网。不论在主机端还是在设备端,Linux均有模块能实现这一功能。iPAQ(掌上电脑)的Linux内核就独一无二地采用了这

19、种通信策略,因为iPAQ硬件中既没有可访问的串口也没有专门的网络接口。 StrongARM Linux内核中,有一个叫做usb-eth的模块(arch/arm/mach-sa1100/usb-eth.c),它利用USB作为物理媒介,模拟出一个虚构的以太网设备。一旦这种网络接口创建起来之后,就可以为它分配IP地址,并且外部环境均将其作为一个普通的以太网硬件对待。一旦USB 主机连接建立起来,usb-eth模块就允许USB设备“浏览”因特网,拼其他的IP地址,甚至通过DHCP、HTTP、NFS或者远程网“交谈”,以及收发电子邮件。简而言之,任何能够在真正的以太网接口上运行的应用都可以原封不动地

20、在usb-eth 上运行,因为这些应用无法识别它们所使用的其实并非真正的以太网硬件。 2. USB 主机端通信过程 相应的,在运行Linux操作系统的主机一端,可用来在USB上实现以太网连接的内核模块叫做usbnet。安装了该模块之后,一旦主机与USB设备的连接建立起来,它就会创建一个虚拟的以太网接口,在主机一端的内核模块以及用户应用看来,这个虚拟的接口与真正的以太网接口别无二致。主机端的应用可以通过拼一个USB设备的IP地址来检查该设备是否已经连上,如果拼操作成功,那么就表示设备已经连接成功。 最近出现了一种针对Win32主机的usbnet风格的驱动,叫做Bahia网络驱动,关于

21、该驱动的详细信息请访问 USB通信的调试 遗憾的是,在USB 主机与Linux USB设备之间进行通信时,能够帮助我们跟踪通信过程中出现的问题的工具实在不多。除了libusb所提供的调试功能以外(该功能十分强大,但对于内核的系统调用接口则无能为力),在一次失败的设备查询或数据传输的尝试过程中发生了什么问题?只有内核源代码和记录能够提供一些线索。笔者尝试在开发过程中向USB 主机和设备代码中大量添加printk()函数调用,但这种方法会引入额外开销,从而改变USB代码自身的性能,这在有些情况下反而是事与愿违。 对那些希望对 USB设备接口进行逆向工程处理,或者希望查找其产品缺陷的Linux开发者而言,一个叫做USB Snoopy ( Snoopy仅能在Win32主机上运行。关于USB Snoopy的详细信息或关于常规的USB调试,请参看本文末给出的参考文献中Jan Axelson撰写的 “USB Debug Tips”。 Linux已成为通用型操作系统 如今Linux已不再是USB 主机专用的操作系统了,USB设备也可以方便地选择它。而且Linux下的USB通信太灵活易用了,因而笔者采用其他易用型串口(RS-232)的日子很可能就此结束,对我而言,这是件好事。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服