当前位置: 首页 > 科技观察

Linux下USB网络的使用

时间:2023-03-22 00:27:49 科技观察

在介绍USB驱动开发的时候,我一般使用LinuxUSB网络来演示,它兼容RNDIS网络,一个Linux可以作为USB的device端,或??者另一个Linux可以作为hostUSB端,主机端也可以通过安装的微软标准Rndis驱动来实现。这种网络具有很强的实用价值,而且完全实现了LinuxUSBSlave驱动和LinuxUSBGadget两个驱动,所以具有很强的示范作用。应用场景:1.智能手机共享网络现在智能手机使用的是3G网络。通过在Linux/Android手机上安装相关驱动程序,可以使用USB数据线在主机和手机之间建立一个共享网络,让智能手机充当无线路由器的功能。现在手机一般都有这个功能,在WINDOWS安装Rndis驱动即可。它使用了我们后面提到的g_ether.ko驱动程序。这种方法远比用手机当3G调制解调器,用USB拨号上网要好得多。共享网络相当于手机和电脑都在线。这种方式和手机WIFI作为无线热点的功能是一样的,但是APN的实现要求更高,很多手机可能支持不了,USB也有同步供电。它仍然有它的优点。2.添加第二个有线网络。在课堂教学中,很多时候服务器和学生计算机只有一个网络接口。当我将网线连接到局域网时,我的开发板无法通过NFS连接到我的机器,学生机也是如此。现在服务器连接有线网络连接局域网,我的开发板直接连接服务器。(1)USB网络的结构与以太网不同。在USB网络中,终端不是对等的,即需要USBHost终端和USBDevice终端。软件和硬件接口不同。USB网络有很多种,其中使用最多的是RNDIS网络。它的全称是RemoteNetworkDeviceInterfaceSpecification。它是微软制定的规范。因为手机使用比较多,LINUX在驱动中也兼容这个规范(PS:这个功能几乎是安卓手机的标配,手机需要支持的功能FAT,RNDIS,MTP(MediaTransferProtocol),都是有专利的通过MS,这些卡成为了MS向Android手机厂商收取专利费的重要武器,这笔钱三星付了)一般像PC电脑充当USBHost,带USBHost接口的Linux开发板可以也担任这个角色。如果是LINUX主机,需要安装驱动rndis_host.ko。一般release版本已经编译好,可以直接运行。如果嵌入式开发板可以将内核的rndis_host配置为动态模块,则位于│Prompt:HostforRNDISandActiveSyncdevices(EXPERIMENTAL)││Definedatdrivers/net/usb/Kconfig:234││依赖于:NETDEVICES&&USB&&NET&&USB_USBNET&&EXPERIMENTAL││Location:││->DeviceDrivers││->Networkdevicesupport(NETDEVICES[=y])││->USBNetworkAdapters││->Multi-purposeUSBNetworkingFramework(USB_USBNET[=m])│如果是WINDOWS主机,需要安装MS的GenericRNDIS驱动。USB的另一端,一般是嵌入式设备。以嵌入式LINUX为例,需要安装USBGadget驱动g_ether.ko进行通讯。g_ether.ko在配置菜单中的位置如下符号:USB_ETH_RNDIS[=n]││提示:RNDISsupport││Definedatdrivers/usb/gadget/Kconfig:609││Dependson:&&USB_ETH││位置:││->设备驱动程序││->USB支持(USB_SUPPORT[=y])││->USB小工具支持(USB_GADGET[=y])││->USB小工具驱动程序(<选择>[=m])││->EthernetGadget(withCDCEthernetsupport)(USB_ETH[=n│所以一个完整的RNDIS网络结构如下2.LinuxUSB网络搭建USBHost安装,以RHEL5为例,直接运行以下命令安装rndis_host.komodproberndis_host它将安装rndis_host.ko和usbnet.ko[root@hxy]#find/lib/modules/2.6.18-194.el5/-name"rndis*"/lib/modules/2.6。18-194.el5/kernel/drivers/usb/net/rndis_host.ko[root@hxy]#modproberndis_host[root@hxy]#lsmod|greprndis_hostrndis_host104330cdc_ether97931rndis_hostusbnet199132rndis_host,cdc_ether在开发板上编译好内核模块,g_ether.ko.执行如下命令#insmodg_ether.kog_ethergadget:ingrandomselfethernetaddressg_ethergadget:usingrandomhostethernetaddrusb0:MACde:5e:8b:3d:84:dbusb0:HOSTMAC32:90:92:52:a9g_ethethernetGadget,morialDay2008g_ethergadget:g_etherreadyRegisteredgadgetdriver'g_ether'分别引出主机和开发板之间的USB线。网卡节点生效,这里一般是usb0ifconfigusb0192.168.3.101uphub1-0:1.0:unabletoenumerateUSBdevice2g_ethergadget:highspeedconfig#1:Chernet(ECM)在host端做类似的配置,另外IP到ifconfigusb0192.168.3.120up#ifconfigusb0192.168.3.120upusb1-1:newhighspeedUSBdeviceusingehci_hcdandaddress5usb1-1:configuration#1chosenfrom2choicesusb0:register'cdc_ether'atusb-0000:00:1d.7-1,CDCEthernetDevice,32:90:26:92:52:a9两端互相Ping。3.与Windows建立连接。如果要与Windows建立RNDIS网络连接,需要下载RNDIS驱动,根据g_ether.ko的厂商号和设备号调整安装INF文件。1.确定VID和PID首先确认g_ether.ko的RNDIS的厂商编号和产品编号。其定义在drivers/usb/gadget/ether.c#defineRNDIS_VENDOR_NUM0x0525/*NetChip*/#defineRNDIS_PRODUCT_NUM0xa4a2/*Ethernet/RNDISGadget*/2、下载WINDOWS的RNDIS驱动。http://www.microsoft.com/china/whdc/device/network/NDIS/rndis.mspx或http://gp2x.generation.free.fr/public/Autres/如果不成功,请查找文件RNDIS-USB-Kit_05.exe。它是一个压缩文件,rndismpy.sys和usb8023y.sys是驱动文件。3、修改安装inf文件,在RNDIS_Template.inf的基础上修改安装文件。主要修改两个地方:修改mm/dd/yyyy,x.y.v.z为任意时间和版本号,我修改09/28/2011,1.0.0.0(注意有两个地方)修改USB\VID_vvvv&PID_pppp为找到的Number,这里必须是Linux定义的USB\VID_0525&PID_A4A2。把inf和两个sys放在一起,随便取个名字,我取名为hxy_rndis.inf4。安装驱动,插入开发板和WINDOWS之间的USB线。这时WINDOWS会提示安装驱动,选择手动安装,选择上一步sys所在的目录进行安装。安装完成后系统会出现一张RNDIS的网卡,配置IP与开发板通信