学术咨询服务正当时学报期刊咨询网是专业的学术咨询服务平台!
发布时间:2015-03-03 10:19所属平台:学报论文发表咨询网浏览: 次
Linux系统下USB2.0桥接线的驱动程序开发,摘 要:本文介绍了在Linux环境下编写USB2.0桥接线驱动程序的方法。 关键词: 文章发表 ,Linux,USB,驱动程序,桥接线 1引言: USB(Universal Serial Bus), 通用串行总线,是用于主机与外部设备间串行通信的一种现代接口。
Linux系统下USB2.0桥接线的驱动程序开发,摘 要:本文介绍了在Linux环境下编写USB2.0桥接线驱动程序的方法。
关键词:文章发表,Linux,USB,驱动程序,桥接线
1引言:
USB(Universal Serial Bus), 通用串行总线,是用于主机与外部设备间串行通信的一种现代接口。USB规范的制定基于一种思想,就是尽可能地去简化设备端机制从而降低设备成本。这一思想的结果就是所有的通信都由主机端发起,在缺少主机的情况下USB设备间无法通信(后来的USB OTG定义了设备间的直通规范),主机之间也不能直接通信。本文由教育大论文下载中心WwW.JiaoYuDa.CoM整理
USB2.0的最高传输速率已达480Mbps。为利用USB远高于网卡的传输能力实现两台主机间的数据传输,一些厂商推出了USB桥接线(如图1)产品。图2是位于USB桥接线中部的芯片原理图,该芯片作为设备 图1 USB桥接线
图2 USB桥接芯片原理图
添加在主机之间从而实现为两个主控方转递数据。
目前的USB桥接线产品均出自中小厂家,芯片资料较少,产品也仅限于支持Windows系统。笔者在Linux系统上利用USB2.0桥接线实现了文件的传输,该项工作主要由Linux系统设备驱动程序开发和界面应用程序设计两部分组成,本文谨就其驱动程序给予简介。
2 Linux环境下USB2.0桥接线驱动程序设计
驱动程序是实现硬件设备与操作系统之间联系的必要途径,向应用程序提供接口,为应用程序屏蔽了硬件的细节。驱动程序的研发质量直接关系到整个硬件设备的可用性。
USB2.0桥接线驱动程序主要完成以下功能:对USB2.0桥接线进行初始化;使USB2.0桥接线投入运行和退出服务;把数据从内核传送到USB2.0桥接线和从USB2.0桥接线接受数据;以及检测和处理USB2.0桥接线出现的错误等。
2.1 Linux USB子系统
Linux USB子系统的结构分为三层(如图2所示):USB客户驱动、USB核心、USB主控制器驱动。USB核心通过定义一系列的数据结构、函数和宏定义 图2 Linux USB子系统
来抽象设备的硬件细节,即提供专门的upper API和lower API来分别支持USB设备和主控制器。其具体功能包括:提供与设备驱动程序的接口(API);读取USB设备描述符、配置描述符;为USB设备分配唯一的地址(端点)、支持基本的USB命令请求、配置设备、连接设备与相应的驱动程序、转发设备驱动程序的数据包。在Linux下编写USB设备驱动程序,实质上就是使用USB内核定义的这些数据、函数来编写数据的处理功能。
2.2 USB2.0桥接线驱动程序实现
Linux系统下,设备驱动程序的编写有两种方法:内核编程和模块编程。内核编程是将设备驱动程序模块直接编译和链接到内核里。系统启动后,自动将设备驱动起来;模块编程是驱动程序在系统运行的同时被加载和卸载。由系统或超级用户(Root)使用insmod命令动态加载它,使之成为系统核心的一部分。当不需要该模块时,可以使用rmmod命令进行卸载。为了适应USB2.0桥接线的热插拔和即插即用的特性,笔者使用了模块编程的方法。
2.2.1 分配主设备号和次设备号
Linux系统的设备一般可分为字符设备、块设备和网络设备三种。字符设备是字符流的接口设备,是一个字符通道,只能顺序读写。块设备是文件系统的宿主。它的读写都有缓存来支持,并必须能够随机存取。网络设备是能够和其他主机交换数据的设备,在Linux里做专门的处理,Linux的网络系统主要是基于BSDunix的socket机制。两台主机间的文件传输实质上是要进行字符流的顺序读取,需把USB2.0桥接线当作字符设备来处理。因而,应在驱动程序中为其指定主设备号(标识设备对应的驱动程序)和次设备号(由内核使用,用于正确确定设备文件所指的设备),我们这里的主设备号是共享系统中USB驱动程序的主设备号(即180)。
2.2.2 向系统注册和注销USB2.0桥接线驱动程序
Linux USB驱动程序首先要完成的就是在Linux USB子系统中进行注册,并提供一些相关信息,如这个驱动程序可以支持什么设备,当被支持的设备从系统插入或拔出时,会有哪些动作。所有这些信息都将被送到USB子系统中。
USB2.0桥接线驱动程序是使用如下代码来完成上述的工作:
owner是指向该驱动程序模块所有者的指针,name是指向驱动程序名字的指针,prob指向USB驱动程序中探测函数的指针,disconnect指向驱动程序中断开函数的指针,id_table指向struct usb_device_id表的指针,该表包含了一列驱动程序可以支持的所有不同类型的USB设备,对于唯一可以标识USB2.0桥接线的struct usb_device_id表将被定义为:本文由教育大论文下载中心WwW.JiaoYuDa.CoM整理
USB_CABLE_VENDOR_ID为USB2.0桥接线制造商ID,USB_CABLE_PRODUCT_ID为USB2.0桥接线产品ID.
以struct usb_driver指针为参数的usb_register_driver函数会把struct usb_driver 注册到USB子系统。当要卸载USB2.0桥接线驱动程序时,需把struct usb_driver从内核中注销,可以通过调用usb_deregister_driver来完成,该调用发生时,当前绑定到该驱动程序上的所有USB 接口将被断开,断开函数被调用。
2.2.3 USB2.0桥接线驱动程序对数据的处理
驱动程序对数据的处理包括读和写数据、打开和关闭驱动程序等。这些操作都是通过file_operations结构来进行的,其表示如下:
使用一个设备之前,我们必须先打开它。在Linux系统下,打开设备是通过调用file_operations结构中的open操作来完成的,它是驱动程序用来为今后的操作完成初始化做准备工作的。应用程序中是使用函数open()来打开字符设备文件,其返回值是字符设备文件的描述符(这里设为 fd)。通过函数open()应用程序会自动调用file_operations结构中的open操作。
如欲从USB2.0桥接线中取出数据,只需在应用程序中使用函数read(),应用程序就会自动调用驱动程序file_operations 结构中的read操作。
如欲向USB2.0桥接线中写入数据,只需在应用程序中使用函数write(),应用程序就会自动调用驱动程序file_operations 结构中的write操作。
使用完USB2.0桥接线后,必须关闭其驱动程序。对用户来说,只需在应用程序中使用函数close()就可以完成这项任务。close()函数只有一个参数,这个参数表示要关闭字符设备文件的描述符(即上面假设的fd)。系统根据字符设备文件描述符(fd),找到对应的打开文件对象(file_operation),并调用该对象操作集中的release操作完成设备的关闭。
3结束语
本文详细的讲述了Linux下USB驱动程序的开发过程。笔者已成功的在FC4上实现了在两台主机间文件的互传。经过测试,此系统可以传输长度较大的文件,其理论值可以达到839万TB。而Windows上USB2.0桥接线产品自带的软件却只能传输最大长度为2GB的文件。
USB2.0桥接线不仅传输速率超越了传统的串口/并口(最高可达6Mb/S,一般情况下也可超过4Mb/S),而且是真正的即插即用,可以取代网卡实现数据的传输。
转载请注明来源。原文地址:http://www.xuebaoqk.com/xblw/180.html
《文章发表Linux系统下USB2.0桥接线的驱动程序开发》