Linux 下使用USB 網絡

2021-02-14 嵌入式Linux中文站


在介紹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接我的機器,學生機也是如此,現在伺服器上把有線網絡接入區域網,而我的開發板與伺服器則直接相連.

   

(1)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網絡結構如下

 

 

 

二、Linux USB 網絡搭建

 

 USB Host安裝,以RHEL5為例,直接運行如下命令即可安裝 rndis_host.ko

 

     modprobe rndis_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]# modprobe rndis_host

[root@hxy]# lsmod | grep rndis_host

rndis_host 10433 0

cdc_ether 9793 1 rndis_host

usbnet 19913 2 rndis_host,cdc_ether

  

在開發板上編譯好內核模塊,g_ether.ko.執行如下命令

   insmod g_ether.ko

   

# insmod g_ether.ko

g_ether gadget: ing random self ethernet address

g_ether gadget: using random host ethernet addr

usb0: MAC de:5e:8b:3d:84:db

usb0: HOST MAC 32:90:92:52:a9

g_ethethernet Gadget, morial Day 2008

g_ether gadget: g_ether ready

Registered gadget driver 'g_ether'

分別在主機和開發板之間抽入USB線,其中開發板使用D型的Slave端接口(不要插在HOST接口上!) 讓USB網卡結點生效,這裡一般是usb0

 

 ifconfig usb0 192.168.3.101 up

hub 1-0:1.0: unable to enumerate USB device 2

g_ether gadget: high speed config #1: Chernet (ECM)

 

在主機端做類似配置,配成另一個IP即可

 

ifconfig usb0 192.168.3.120 up

 

# ifconfig usb0 192.168.3.120 up

usb 1-1: new high speed USB device using ehci_hcd and address 5

usb 1-1: configuration #1 chosen from 2 choices

usb0: register 'cdc_ether' at usb-0000:00:1d.7-1, CDC Ethernet Device, 32:90:26:92:52:a9

 

這時在兩端即可以互相 ping 通。

  

三、與Windows 建立聯接。

   

  如果希望與Windows 建立RNDIS網絡聯接,需要下載RNDIS驅動,並且根據g_ether.ko的產商號和設備號調整安裝INF文件。

1.確定VID和PID

  首先確認g_ether.ko的RNDIS的vendor號和product號.它的定義在 drivers/usb/gadget/ether.c中

 

#define RNDIS_VENDOR_NUM 0x0525 /* NetChip */

#define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */

 

 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 修改成查到的數字,這裡必須是Linux定義的 USB\VID_0525&PID_A4A2

   把inf和兩個sys放在一起,隨意取個名字,我取名 hxy_rndis.inf

 

4.安裝驅動

   在開發板與WINDOWS之間插入USB線。這時WINDOWS會提示安裝驅動,選擇手功安裝,並且選擇上一步的 sys所在目錄即可安裝

   

  

   

    安裝後系統會出現一個RNDIS的網卡,配置IP即可與開發板通訊

相關焦點

  • 【黑蘋果】解決linux和黑蘋果下usb無線網卡兼容問題
    比如最近我本想安裝個linux,選了一款兼容linux的網卡,突然一抽風又想裝個黑蘋果,結果兼容linux的網卡並不兼容黑蘋果,裝到一半裝不下去了,這就尷尬了。由於手邊沒有合適的網卡,因此只好急中生智,「獨闢蹊徑」地想了個辦法來解決上網問題,因為徹底繞開了usb,沒想到意外地解決了usb網卡不兼容這個老大難的問題,下面我將簡單介紹一下這個萬能方法。
  • Linux 上如何禁用 USB 存儲
    編譯自 | http://linuxtechlab.com/disable-usb-storage-linux/  作者 | Shusain
  • Linux USB滑鼠驅動程序詳解
    <linux/kernel.h>    #include <linux/slab.h>    #include <linux/module.h>    #include <linux/init.h>    #include <linux/usb/input.h>    #include <linux
  • adb使用技巧和usb通信原理探索
    一、adb使用的技巧1.
  • Linux USB-Gadget 驅動框架
    有兩點值得注意,第一是 usb gaget 驅動框架不象 usb 主機端有 usb core 的概念,usb 主機可能支持成百類型的外設,把通用功能抽象出來很有意義。Usb device 端則通常沒有這個需求,一些通用功能抽象在一些 Helper 函數裡就可以了。第二是 usb 2.0 裡提出了 OTG 的概念,可以在同一接口上支持 host 以及 device 功能。
  • 安卓adb使用技巧和usb通信原理探索
    來源:安卓巴士Android開發者門戶(ID:iProgrammer)一、adb使用的技巧1. 查詢當前展示的Activityadb shell dumpsys activity top | head -n 10
  • Linux USB總線驅動框架分析
    Linux USB子系統較為龐大,本文主要對Linux系統下的USB總線驅動框架進行概述,重點的細節待後續文章展開。首先來看一個現象,插入USB設備後linux系統列印如下日誌:1.2 USB接入識別大致過程當識別出有USB設備插入後,linux內的USB總線驅動程序發出命令至該設備,與設備對話,並詢問設備信息(描述符),設備收到請求後,回復設備描述符給總線驅動程序。且總線驅動程序會為該設備分配一個地址,如上地址為2,當後期訪問某個USB設備時,均會通過這個地址編號,當新接入的USB設備被第一次訪問時,以地址0來訪問。
  • linux minicom usb串口
    ;/dev/ttyS0查看串口名稱使用 ls -l /dev/ttyS*一般情況下串口的名稱全部在dev下面,如果你沒有外插串口卡的話默認是dev下的ttyS*,一般ttyS0對應com1,ttyS1對應com2,當然也不一定是必然的;查看usb設備  lsusb查看串口驅動:cat /proc/tty/drivers/serial[root@dy
  • 在 Linux 上恢復一個損壞的 USB 設備至初始狀態 | Linux 中國
    編譯自 | http://www.linuxandubuntu.com/home/restore-corrupted-usb-drive-to-original-state-in-linux
  • Linux 有問必答:如何在 Linux 中永久修改 USB 設備權限
    作為一個永久的方式,你可以創建一個基於 udev 的 USB 權限規則,它可以根據你的選擇分配任何權限模式。下面是該如何做。首先,你需要找出 USB 設備的 vendorID 和 productID。使用lsusb命令。$ lsusb -vvv
  • 在 Linux 上檢查網絡連接的更多方法 | Linux 中國
    你也可以使用 ip 命令來啟用和禁用網絡接口。$ sudo ip link set eth1 up$ sudo ip link set eth1 downethtool 命令另一個檢查網絡非常有用的工具是 ethtool。這個命令提供了網絡接口上的許多描述性的數據。
  • Linux dmesg命令使用示例
    在dmesg命令的幫助下進行硬體的連接或斷開連接操作時,我們可以看到硬體的檢測或者斷開連接的信息。dmesg命令在多數基於Linux和Unix的作業系統中都可以使用。下面我們展示一些最負盛名的dmesg命令工具以及其實際使用舉例。dmesg命令的使用語法如下。# dmesg [options...]1.
  • 在 Linux 系統裡識別 USB 設備名字的 4 種方法
    如果在系統中插入一個設備,尤其是在桌面環境下,比如 USB 設備,它會自動掛載到一個指定目錄,一般是在 /media/username/device-label 目錄下,之後你就可以進入到該目錄下訪問那些文件了。然而,在伺服器上就不是這麼回事了,你必須手動掛載[1]這個設備,並且指定一個掛載點。Linux 系統使用 /dev 目錄下特定的設備文件來標識插入的設備。
  • 在 Linux 下使用任務管理器
    當你剛使用 Linux 的時候,你也會尋找一個在 Linux 相當於任務管理器的一個東西。一個 Linux 使用專家更喜歡使用命令行的方式查找進程和消耗的內存等等,但是你不用必須使用這種方式,至少在你初學 Linux 的時候。所有主流的 Linux 發行版都有一個類似於任務管理器的東西。
  • 「圖文」深入了解Linux USB驅動工作的整個流程
    驅動程序把驅動程序對象註冊到USB子系統中,稍後再使用製造商和設備標識來判斷是否已經安裝了硬體。USB核心使用一個列表(是一個包含製造商ID和設備號ID的一個結構體)來判斷對於一個設備該使用哪一個驅動程序,熱插撥腳本使用它來確定當一個特定的設備插入到系統時該自動執行哪一個驅動程序的Probe。 5.
  • 網絡啟動一個 Fedora Live CD | Linux 中國
    Live CD 對於很多任務是很有用的,例如:作為使用 DVD 和 USB 驅動器來存儲你的 Live CD 鏡像是一個替代方案,你可以上傳它們到一個不太可能丟失或損壞的 iSCSI 伺服器中。這個指南向你展示如何加載你的 Live CD 鏡像到一個 ISCSI 伺服器上,並使用 iPXE 啟動加載程序來訪問它們。
  • 在 Kali Linux 下實戰 Nmap(網絡安全掃描器)
    雖然 nmap 不是 Kali 下唯一的一個工具,但它是最有用的網絡映射工具[2]之一。Nmap, 是 Network Mapper 的縮寫,由 Gordon Lyon 維護(更多關於 Mr. Lyon 的信息在這裡: http://insecure.org/fyodor/) ,並被世界各地許多的安全專業人員使用。
  • 運維丨linux如何掛載光碟
    武漢商啟網絡信息有限公司現招聘銷售、客服、網絡工程師,詳情請點擊查看原文!
  • Linux下使用tar命令
    範例:範例一:將整個 /etc 目錄下的文件全部打包成為 /tmp/etc.tar[root@linux ~][root@linux ~][root@linux ~]特別注意:在參數[root@linux ~]由於我們使用 gzip 壓縮,所以要查閱該 tar file 內的文件時,就得要加上 z 這個參數了,這很重要。
  • Linux下tcpdump命令的使用
    查看網卡命令:知道了網卡,就可以使用tcpdump工具針對伺服器上的網卡監控、過濾網絡數據。tcpdump常用命令:#抓取所有經過 eth0,目的或源地址是 192.168.29.162 的網絡數據命令:tcpdump -n -i eth0 host 192.168.29.162# 源地址命令:tcpdump -i eth1 src host 192.168.29.162# 目的地址