在介紹USB的驅動開發時,我通常會用用Linux的的USB網絡來演示,它兼容RNDIS網絡,一台Linux即可充當USB的device端,也可以由另一台Linux來充當USB的Host端,Host端的也可以由安裝的微軟的標准的Rndis驅動來充當.
這種網絡有相當強的實用價值,而且完整實現的Linux USB Slave驅動和Linux USB Gadget兩種驅動,因此有很強演示效果.
應用場景:
一.智能手機共享網絡
現在智能手機采用3G網絡,通過Linux/Android手機上安裝相關驅動,可以用USB線在主機和手機建一個共享網絡,這樣智能手機充當一個無線路由器的功能.現在手機一般都有這個功能,WINDOWS安裝Rndis驅動即可.而且就是用的我們後面提到的g_ether.ko驅動.
這種方式,遠遠優於把手機當成3G的modem,用USB來撥號這種方式,共享網絡相當於手機和電腦都上網不誤.
這種方式跟用手機WIFI作無線熱點的功能一樣,但是APN的實現的要求較高,很多手機不一定能支持,而且USB還有同時供電.還是有其優點.
二.增加第二個有線網絡.
在教室上課時,很多時候服務器和學生用機只有一個網絡口接口,我把網線接到局域網時,我的開發板就無法用NFS接我的機器,學生機也是如此,現在服務器上把有線網絡接入局域網,而我的開發板與服務器則直接相連.
一.USB 網絡的結構
在與以太網不同,在USB網絡裡各終端不是對等的,即USB Host端和USB Device端的所需要軟件和硬件接口不一樣.
USB網絡有很多種,其中用得最多是RNDIS網絡。它的全稱是
Remote
Network Device Interface Specification.
它是由微軟制定的規范,因為手機使用用得較多,因此LINUX也在驅動中兼容這個規范
(PS:Android手機這個功能幾乎是標配,而手機需要支持的功能FAT,RNDIS,MTP(媒體傳輸協議),都是MS的專利,這幾張牌成了MS向Android手機制造產家收取專利費的重要武器,三星已經交了錢了)
一般象PC機充當USB Host角色,帶USB Host的接口的Linux開發板也可以充當這個角色.
如果是LINUX主機,需要安裝安裝 rndis_host.ko 這個驅動。一般發行版均已經編譯好,直接運行即可。
如果嵌入式開發板可以配置內核的rndis_host為動態模塊
它位於
- │ Prompt: Host for RNDIS and ActiveSync devices (EXPERIMENTAL) │
- │ Defined at drivers/net/usb/Kconfig:234 │
- │ Depends on: NETDEVICES && USB && NET && USB_USBNET && EXPERIMENTAL │
- │ Location: │
- │ -> Device Drivers │
- │ -> Network device support (NETDEVICES [=y]) │
- │ -> USB Network Adapters │
- │ -> Multi-purpose USB Networking Framework (USB_USBNET [=m]) │
如果是WINDOWS主機,則需要安裝MS的Generic RNDIS驅動。
在USB的另一端,一般是嵌入式設備,以嵌入式LINUX為例,需要安裝USB Gadget驅動g_ether.ko 來進行通訊。g_ether.ko在配置菜單位置如下
- Symbol: USB_ETH_RNDIS [=n] │
- │ Prompt: RNDIS support │
- │ Defined at drivers/usb/gadget/Kconfig:609 │
- │ Depends on: <choice> && USB_ETH │
- │ Location: │
- │ -> Device Drivers │
- │ -> USB support (USB_SUPPORT [=y]) │
- │ -> USB Gadget Support (USB_GADGET [=y]) │
- │ -> USB Gadget Drivers (<choice> [=m]) │
- │ -> Ethernet Gadget (with CDC Ethernet support) (USB_ETH [=n │
因此一個完整RNDIS網絡結構如下