2024年2月8日发(作者:)

Linux集成下USBGadet的USB虚拟网口设计g2,赵昕1,郭恩全1,林成文2(中国船舶重工集团公司第7西安71.05研究所,10075;陕西海泰电子有限责任公司)2.摘要:因此也可以利用其将ULinux内核集成的USBGadet提供了开发USB设备端驱动的支持,SB设备接口虚拟成g其他类型接口。本文阐述了U深入分析了其USBGadet原理和总体架构;DC驱动层和Gadet接口层复杂的数据结gg在SUSBGadet通用模块中UDC层依据平台环境进行修改配置,3C2440平台上实现了USB接口虚拟成网口。经测试g验证,虚拟后的网口传输正常稳定,为用户在Linux下应用USBGadet提供了参考。g构、各类操作函数以及主要工作流程;在G对Ladet功能驱动层给出了虚拟成网口的具体开发方法;inux内核初始的g;;关键词:设备驱动;网口;LinuxUSBGadetS3C2440g中图分类号:TP316.89

文献标识码:AImlementationofUSBVirtualNetworkPortBasedonUSBGadetinLinuxpg(,’;705thResearchInstituteofChinaShibuildinndustrororationXian710075,ChinapgIyCp11,22ZhaoXin,GuoEnuan,LinChenwenqg,lexdatastructureoerationpgpp:,AbstractLinuxkernelinteratedUSBGadetrovidessuortfordeveloinSBdevicedriversoitcanalsobeusedtovirtualizeUSBggppppgU)HitechElectronicLimitedLiabilitomanyCpy,functiadetfunctionaldriverlaerthecon-ygyygy,cretedevelomentmethodofvirtualnetworkportisivenandtheUDClaerintheinitialUSBgadeteneralarchitectureofLinuxker-pgygg,tverifiesthatthevirtualnetworkportcommunicationisnormalandstablewhichprovidesvaluablereferenceferfacevirtualnet:;;;;KewordsLinuxdevicedriverUSBGadetnetworkportS3C2440gy0

言动资源属于通用模块,这种通用模块将其直接加载到内核后,并没有正常工作,还需依据运行环境对其进行修改和配置,USBGadet在应用时就存在这样的情况。综上考g的外设种类越来越多,同时也有将USB虚拟成其他类型接口的应用需求,因此Linux内核除了支持USB主机端的驱动程序,后来的内核版本还提供了USBGadet支持g如今基于UUSB是计算机广泛使用的接口之一,SB虑,本文采用USBGadet实现USB虚拟网口。为了能够g开发Gadet功能驱动层的USB虚拟网口程序以及修改g配置内核提供的U首先对UDC驱动层,SBGadet总体g在USB设备端开发其驱动程序,USBGadet具有UDCg驱动层、Gadet接口、Gadet功能驱动层,Linux内核已gg框架和原理进行了介绍;分析了UDC驱动层和Gadet接g口层的复杂数据结构和操作函数的意义,并对其工作流程进行了描述;然后给出了虚拟网口程序中数据结构、关联绑定、数据发送和接收等主要方面的详细开发方法,给出了要运行在S3C2440平台上UDC驱动层需要配置修改的内容;最后利用Socket测试程序对虚拟后的网口进行了测试。测试结果表明,传输正常稳定,同时也对利用USBGadet实现USB设备驱动具有工程参考价值。g经将U用户可根据自身特SBGadet通用架构搭建完成,g定的需求,再开发出G便能实现adet功能驱动层的程序,g是免费的,并非进行了商品化,它没有像微软组织了专门的研发团队对其进行高品质的维护和完善,用户在利用发现内核集成的一些驱Linux开发自己的嵌入式产品时,想要的USB设备端的驱动程序。但美中不足的是,Linux 2Microcontrollers&EmbeddedSstems

2021年第7期

1 USBGadet总体架构和原理g端点操作函数集指针、数据包长度;structusb_reuest表q示一个传输请求,其主要成员包含数据缓冲区、完成时的回调函数、请求状态。对于Uusb_reuest链表、DC操作q函数,其主要功能是返回U唤醒与设备相DC当前数据帧、连接的主机、设置或清除设备自供电特征、UDC电源管理,如表1所列;对于端点操作函数,其主要功能是配置端点是否可用、为端点分配或释放缓冲区、为端点分配或释放请求对象、向端点提交或取消一个特定请求、设置端点的停止特征等,如表2所列。端点操作函数()驱动、USBDeviceControllerGadet接口、Gadet功能gg驱动,整体框架如图1所示。Linux内核提供了一种为开发者实现USB设备端驱[1-2]动的U其框架主要分为三个层次:SBGadet,UDCg表1 UDC操作函数功

能,int*enable(structusb_ep*ep__conststructusbendointdescri-使能配置端点pp)tor*desc_e)int*disable(structusbp*ep图1 USBGadet整体框架gstructusb_reuest*alloc_reuestqq(_e,_)structusb*eintfflasppgpg_r(void*freeeueststructusb_eqp,_)*estructusbreuest*repqq不使能配置端点为端点分配请求对象控制UUDC驱动直接操作访问硬件,SB设备和主机间的底层通信,并将这个USB设备依附于USB主机控制器上,同时向Gadet接口层提供与硬件相关操作的函数g接口。USB设备控制器作为一个Linux设备在这一层是接口层是U实现了一套与硬件DC驱动程序函数的封装,无关的功能,它为上层提供了一组标准的编程接口,以及则USB设备的一些基本数据结构。如果没有这一层,导致Gadet功能驱动都需要实现自己的USB设备驱动,g例如UUSB设备功能的实现,SB摄像头、USB音乐设备)、接口(MIDIUSB扫描仪、USB虚拟成串口或网口等。它不仅调用G还涉及到与功能相关的内核里adet接口,g其他模块的交互,像内核存储子系统[4][3]以platform设备注册到Linux设备模型中的。Gadetg释放端点请求对象_bvoid*allocuffer(structusb_ep,,__*eunsinedbtesdmaaddrtpgy,_)*dmaintgfflaspg为端点分配缓冲区_bvoid*freeuffer(structusb_ep,,*evoid*bufdma_addr_td-p,)maunsinedbtesgy释放端点缓冲区了代码的重用率很高。Gadet功能驱动层主要是控制g,int*queue(structusb_ep*ep,将请求插入指定的端点队列structusb_reuest*reintfqqgp_)flasg_e,将请求从指定的端点队列中int*deueue(structusbqp*ep_)删去structusbreuest*reqq、网络协议栈等。int*set_halt(structusb_ep*,)eintvaluep设置端点的停止特征2 UDC层和Gadet接口层分析g而USB设备控制器以platform设备形式进行工作,这latform设备需要注册一个platform_drive的结构体,p个结构体变量主要设置对设备的探查、卸载、加载、暂停、_p重启,其中最重要的就是探查,实现在modulelatform_[4]_p在函数内初始化设备的时钟,申请driverrobe函数中,表2

端点操作函数_(_gint*getframestructusbadet*)gUDC操作函数(_gint*wakeustructusbadet*)pg返回UDC当前数据唤醒主机功

能_sint*setelfowered(structusb_gadet*,pg设置设备自供电)intselfoweredpInt*vbus_session(structusb_gadet*,gUDC电源管理_a)intisctive/初始化描述pIO资源、irlatform设备的结构体变q资源、量。在UDC层定义和使用的数据结构是描述USBplat-、form设备的结构体变量成员structusb_gadetstructg_e、_r,usbstructusbeueststructusb_gadet描述UDC,pqg其主要包含U端点链DC操作函数集指针、0端点指针、_e表、设备信息;其主要包含structusbp对端点进行描述,从而为设备与主机间底层交互做了准备。UDC驱动主要工作流程如图2所示,EP0处理是用EP0Handler函数实通过定义这些函数和结构体变量,UDC得到了抽象,5]现设备枚举,函数流程是按照设备枚举[的过程设计的,

敬请登录网站在线投稿

()2021年第7期

3

EP3处理和EP1处理分别用EP3Handler函数和实EP1Handler函数完成设备与主机底层间的数据交互,此层实现U它通常与LSB设备驱动功能,inux内核有着现数据收发。E通过查看端点1P3Handler的收流程为:紧密的联系,本文要将U具体开发方法为:SB虚拟成网口,,_g;成员需要包含sdevicetructusbadet结构体变量gadetgg_;_estructusbreuest结构体指针变量restructusbqgp结构控制状态寄存器的I判断相应的端点FN_RDY位,IFO寄存器是否有数据,有数据时将其取出存入内核缓冲器。通过查看端点3控制状态寄存EP1Handler的发流程为:器的OUT_R判断相应的端点FDY位,IFO寄存器是否为空,为空时向FIFO发数据。Gadet接口层主要的数据结g_d构有usb_gadetriver结构体、g_e_定义一个描述虚拟成网口的结构体类型structvirtualth、,分别代表发送和请求uresrx_ressb_reuest链表;qqq_dstructnetevice结构体指针变量net表示网络设备描述_e、_e、_e,体指针变量i分别代表输入端点、noutstatusppp_h_输出端点、状态端点;structlistead结构体指针变量tx_c_dusbomositeev结构体、usb_pcomosite_driver结构体。usb_p[]结构,字符数组变量m表示网络设备MAacC地址。设_v_e(_g)计一个u函数,sbirtualthstructusbadet*gadetgg用来完成虚拟成网口准备及关联绑定工作,主要是通过设_d;_d调用内核提供的anetevice*netllocev函数为dev分,配内存,然后将d将设计的发送函数ev>net赋给net_u_x_x,将设计的接收函数ethsbmit赋给net>startmit_dadetriver结构体定义了bindgg绑定、unbind解除、connect连接、disconnect断开等操作USB这一层向下Gadet的函数指针,g_e置两个全局变量:structvirtualth_device*dev和struct与UDC层交互方式主要通过调_dadetriver结构体变量;usb_gg_dcomositeev结构体主要定义和p__dusbcomsiteriver的指针成员。p说明这个结构体联系了UDC层与功能驱动层。这一层向上与Gadet功能驱动层交互方式主要g_c_p是通过调用usbomositerobep个结构体代表一个USB设备驱动,结构体也定义了bind绑定、们的参数是usb_comosite_devp结构体变量,是对USB设备进行图2 UDC驱动主要工作流程_p用usb_gadetrobe_drive函数g完成,传递的参数就是一个usb_配置USB设备的描述符和各类属性,还有指向usb_gadet与g_u_r_r,从而实现为ethsbeceived赋给net>starteceived网络设备描述结构分配内存及相关配置;获取内核向该驱动交互的信息,如果握手成功,则调用Gadet接口层提供g,的函数b将虚拟成网口和UindDC描述结构关联绑定;6]_n()利用r函数[注册网络设备驱eisteretdevdev>netg_v_e动;最后将定义的usbirtualth函数让加载初始化函数调用,当驱动加载便会引导其运行。和exmit(structsk_buff*skb)th_usb_received(struct_,)函数完成,在发送方面,由于usbreuest*reintflasqqg数据的发送和接收功能就是分别由上述的eth_usb__u_x转换处于网络数据链路层,ethsbmit函数主要功能是7-9]把内核网络协议栈[里的structsk_buff类型数据取出函数完成,传递的参数是usb__d这comsiteriver结构体变量,punbind解除、connect连接、dis-但是它connect断开等函数指针,_,_o(_量s调用ctructusbreuest*reontainerfdev>txqq,,)函数,将返回值赋给ructusb_reuestlistqq网络数据包,然后按照structusb_reuest类型生成USBq发送数据,将其发送出去。主要是通过:函数体内设置变;_a()利用l生成ureistdd&relistsb_reuest链表,qq>q,将s将rkb>data的数据传给reufeontextq>bq>c设置成真,在数据发送完成后,让UDC驱动的中断处理函数调用c做完成处理,即把tomlete函数,x_comlete函pp_g_d操作,同时该结构体又包含u这样sbadetriver成员,gGadet功能驱动层提供标准接口。当USB设备驱动加载g_时,内核会调用加载初始化函数,它首先会相继调用usb_d又能得到u解除、连sb_gadetriver向UDC层的绑定、g接、断开等函数,因此Gadet接口层就是通过这些函数为g,数赋给r组织r利用ueomleteesb_eq>cpq完毕后,p_(_e,,向Iueuedev>inreGFP_ATOMIC)N端点提交qpq数据发送请求,调用Gadet接口层提供的函数conncet建g_p_g_p_d从comositerobe函数和usbadetroberive函数,pg而三个软件层就通过数据结构联系到一起。_rusbeceived函数主要功能是为请求的structsk_buff*把接收的uskb生成初始状态,sb_reuest数据组织成q立连接,等待中断响应进行数据发送。在接收方面,eth_3 Gadet功能驱动层开发方法g通过Gadet功能驱动层是USBGadet软件最上层,gg,_A,向OUT端点提交数据接收请求,调reGFPTOMIC)q用G等待中断adet接口层提供的函数conncet建立连接,g_b通知内核网络协议栈取走该类structskuff类型数据,_e_q(_e,型数据。主要是通过:调用usbueuedev>outpp 4Microcontrollers&EmbeddedSstems

2021年第7期

,)经过以下计算:sizesize=(sizeof(structethhdr+RX_;_eEXTRA)size+=dev>outaxacket-1;size-p>mp;_p,);skb>dataskbut(skbreontextskb>dev=q>c;_t(,)调用e获取返dev>netth_teransskbdev>netyp响应进行数据接收,定义一个给skb分配内存大小的变量备管理器便出现U此时主机SB虚拟成网络设备的图标,已经发现U如图4所示。SB设备端虚拟成了网口,_e,_s调用函数a=size%dev>outaxacketllockp>mpp(,)生成s将rsizeflaskb初始状态,euf数据传给gq>b;回值赋给s组织s调用内核网kb>protocolkb完毕后,_()络协议栈函数n取走数据,完成接收。etifrxskb4 UDC层配置修改目前内核提供的U所SBGadet是一个通用的模块,g以要依据平台环境对其U针对DC层进行修改和配置,/_g需要修改dGadet环境变量的文件路径,riversusbad-gg/_()函数,将该函数etudc.c文件里的staticintudcinitvoid对于嵌入式系统的开发,文件S3C2440具体有以下几处:系统一般也会根据自己的需求裁剪,所以修改读取USB图3 USB已经被虚拟成网络设备/[]s3c24xxmach-smdk2440.c文件里smdk2440__devices_d_u,数组初始值添加s即向S3cevicesbadet3C24xx平gg//在a将S3C24xx系列处理器,rcharmdevs.c文件里,_ustructplatform_device结构体变量devicesbadet各成gg(_e_p,体里c函数第一个参数reateadetnvarathNULL)gg//修改为当前环境变量文件的路径;向archarmmatch-台添加U配置USBGadet设备;SBgadet的运行平台为gg图4

主机发现了虚拟成网络的USB设备[13]在设备端编写一个基于Socket的网络驱动测试程”,员赋初始值,具体是name=“s3c2440-usbadetnum_gg_u_r),resources=ARRAY_SIZE(s3csbadetesourcere-gg_u_r,将ssource=s3csbadetesourcetructresourceusb-gg10]_[],结构体变量各成员赋初始值[具体adetresource0gg序,用来实现数据收发,主机端运行网络通信调试工具,这样便可开始对USB设备虚拟成网口驱动进行测试。从设的调试工具里的TCPServer下挂的TCPClient为192.与设备端的I并且设备端发送的字符168.2.254,P一致,,!”,备端发送一个字符串“在主机端HelloIamusbgadetgPA_USBDEV+S3C24XX_SZ_USBDEV-1,flas=g_v将UIORESOURCE_MEM,SB的时钟设置为ullaluep;(对当前判断然后配置wPLLCON_SDIVSHIFT)hileullp_v!=(_U)(_v,aluereadls3c24xxPLLCON)writelullaluep=(0x78<

测试验证在系统看来已经是一个网络设备,此时可以配置IP地址,如图3所示,图中方框区域就是目前配置的USB网络设[12]备信息。将U出现了RSB设备与主机相连,NDIS驱动安装向导,说明设备枚举成功。当安装成功后,上位机设图5

驱动发送功能测试将U当设备端启动时,SBGadet加载到内核后,USBg

敬请登录网站在线投稿

()2021年第7期

5

网口传输正常。[]T4schudinP,tandinhegeneticmakeugtp//ofLinuxdevicedrivers[C]ProceedinsoftheSeventhg[]万玛宁,侯志化.基于L5inux操作系统的USB设备驱动程序开发,ACMPress2018:36.,vaniaUSA:poggLggy[]孙文华,何荣高.基于U6SB接口的无线网卡驱动研究与实现],():及传输实现[微电子学与计算机,J.27.[]/[alAPIchanes[EBOL].2021g[]():微型机与应用,J.2015,[]魏永明,沈岳.北京:电子工8LINUX设备驱动程序设计[M].]:////ent44pg图6

驱动接收功能测试[]倪继利.北京:电子工业出版9Linux内核分析及编程[M].业出版社,2018.社,2016.6

语[]陈侃松,邵冲,张丹.基于S103C2440平台的USB_WiFi驱动操作函数意义以及工作流程之Gadet接口层数据结构、g后,提供了在Gadet功能驱动层详细的虚拟网口开发方gS3C2440硬件环境给出了具体的配置修改方法。结果表明数据传输正常可靠,同时也为用户利用USBGadet实g本文采用了USBGadet来实现USB虚拟网口的开g发,在分析了USBGadet总体架构和UDC驱动层、g法,因L针对inux内核集成的USBGadet处于通用模块,g[]11SAMSUNGELECTRONICS.S3C244032BitRISCMicro-]():移植[物联网技术,J.201553436.[]M/Networkp/rocessorUser'sManual[EBOL].[2021p//://03].http现USB设备驱动提供了工程参考。参考文献[]杨树青,王欢.北京:清华13LINUX环境下C编程指南[M].,InerfaceSecification(RNDIS)ProtocolSecifica-pp大学出版社,2018.[][/SBGadetAPIFrameworkEByg,,赵昕(工程师)主要研究方向为嵌入式系统开发;郭恩全(研究员),主要研究方向为计算机控制技术;林成文(高级工程师)主要研究。方向为计算机总线接口技术。通信作者:赵昕,haodz2006@()责任编辑:薛士然

收稿日期:2021-03-24[][/[etAPIforLinuxEBOL].2021g][]:///[]茅俊杰,]陈渝.清华3Linux设备驱动的内核服务需求特征[J.]:////,():大学学报(自然科学版)2015,558911955.1

图4

全球嵌入式计算市场的影响因素()来源:AlliedMarketResearchAlliedMarketResearch用一个雷达图进行了总结。他们的结论是:ML芯片会逐渐流行起来。究其原因,人形的机器人需求非常IoT对AI有着很强的推动作用,强劲,技术人才的缺口正在逐步缩小。AI的机会正逐渐增多,大众对AI的担忧会逐渐减少。图5

全球机器学习芯片市场的影响因素()来源:AlliedMarketResearch本文授权来自本刊的合作伙伴E如lektor媒体集团,果希望免费订阅E请访问lektor的英文在线内容,:///。()责任编辑:芦潇静

收稿日期:2021-05-21 6Microcontrollers&EmbeddedSstems

2021年第7期