精华内容
下载资源
问答
  • USBnet

    千次阅读 2017-08-30 17:46:19
    在介绍USB的驱动开发时,我通常会用用Linux的的USB网络来演示,它兼容RNDIS网络,一台Linux即可充当USB的device端,也可以由另一台Linux来充当USB的Host端,Host端的也可以由安装的...include/linux/usb/usbnet.h
    转自:http://blog.csdn.net/wuyusheng314/article/details/68946303
    在介绍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为动态模块
    它位于
       
    1. │ Prompt: Host for RNDIS and ActiveSync devices (EXPERIMENTAL) │
    2. │ Defined at drivers/net/usb/Kconfig:234                        │
    3. │ Depends on: NETDEVICES && USB && NET && USB_USBNET && EXPERIMENTAL │
    4. │ Location: │
    5. │ -> Device Drivers                                             │
    6. │ -> Network device support (NETDEVICES [=y])                   │
    7. │ -> USB Network Adapters │
    8. │ -> Multi-purpose USB Networking Framework (USB_USBNET [=m])   │
       

    如果是WINDOWS主机,则需要安装MS的Generic RNDIS驱动。

    在USB的另一端,一般是嵌入式设备,以嵌入式LINUX为例,需要安装USB Gadget驱动g_ether.ko 来进行通讯。g_ether.ko在配置菜单位置如下
    1. Symbol: USB_ETH_RNDIS [=n] │
    2. │ Prompt: RNDIS support │
    3. │ Defined at drivers/usb/gadget/Kconfig:609 │
    4. │ Depends on: <choice> && USB_ETH │
    5. │ Location: │
    6. │ -> Device Drivers │
    7. │ -> USB support (USB_SUPPORT [=y]) │
    8. │ -> USB Gadget Support (USB_GADGET [=y]) │
    9. │ -> USB Gadget Drivers (<choice> [=m]) │
    10. │ -> 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
      
    1. [root@hxy]# find /lib/modules/2.6.18-194.el5/ -name "rndis*"
    2. /lib/modules/2.6.18-194.el5/kernel/drivers/usb/net/rndis_host.ko
    3. [root@hxy]# modprobe rndis_host
    4. [root@hxy]# lsmod | grep rndis_host
    5. rndis_host 10433 0
    6. cdc_ether 9793 1 rndis_host
    7. usbnet 19913 2 rndis_host,cdc_ether
      
    在开发板上编译好内核模块,g_ether.ko.执行如下命令
        insmod g_ether.ko
       
    1. # insmod g_ether.ko
    2. g_ether gadget: ing random self ethernet address
    3. g_ether gadget: using random host ethernet addr
    4. usb0: MAC de:5e:8b:3d:84:db
    5. usb0: HOST MAC 32:90:92:52:a9
    6. g_ethethernet Gadget, morial Day 2008
    7. g_ether gadget: g_ether ready
    8. Registered gadget driver 'g_ether'
    分别在主机和开发板之间抽入USB线,其中开发板使用D型的Slave端接口(不要插在HOST接口上!) 让USB网卡结点生效,这里一般是usb0

      ifconfig usb0 192.168.3.101 up
    1. hub 1-0:1.0: unable to enumerate USB device 2
    2. g_ether gadget: high speed config #1: Chernet (ECM)

    在主机端做类似配置,配成另一个IP即可

    ifconfig usb0 192.168.3.120 up

    1. # ifconfig usb0 192.168.3.120 up
    2. usb 1-1: new high speed USB device using ehci_hcd and address 5
    3. usb 1-1: configuration #1 chosen from 2 choices
    4. 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中

    1. #define RNDIS_VENDOR_NUM 0x0525 /* NetChip */
    2. #define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */

      2.下载WINDOWS的RNDIS驱动.
         http://www.microsoft.com/china/whdc/device/network/NDIS/rndis.mspx   
       或

       如果不成功,去找一下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

       如果不想修改,直接用我改好现成的 
          hxy_rndis.zip   

    4.安装驱动
       在开发板与WINDOWS之间插入USB线。这时WINDOWS会提示安装驱动,选择手功安装,并且选择上一步的 sys所在目录即可安装
       

       
      
       
        安装后系统会出现一个RNDIS的网卡,配置IP即可与开发板通讯


    参考代码补充:

    USB驱动代码在/drivers/usb/gadget下,有三个文件:Android.c,f_adb.c,
           f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于
           f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。
           可在android.c中看到:
           static int __init android_bind_config(struct usb_configuration *c)  
           {  
              struct android_dev *dev = _android_dev;  
              int ret;  
              printk(KERN_DEBUG "android_bind_config\n");  
              ret = mass_storage_function_add(dev->cdev, c, dev->nluns);  
              if (ret)  
                  return ret;  
              return adb_function_add(dev->cdev, c);  
           }

     

    cdc-ncm:
    分为HOST端和Device端
    Linux中对应的驱动分别为host driver and gadget driver

    Host Driver位于
    drivers/net/usb/

    gadget driver位于
    drivers/usb/gadget/

    drivers/net/usb/Kconfig
    drivers/net/usb/Makefile
    drivers/net/usb/cdc_ether.c
    drivers/net/usb/cdc_ncm.c
    drivers/net/usb/usbnet.c
    drivers/usb/gadget/Kconfig
    drivers/usb/gadget/Makefile
    drivers/usb/gadget/f_ncm.c
    drivers/usb/gadget/ncm.c
    drivers/usb/gadget/u_ether.c
    drivers/usb/gadget/u_ether.h
    include/linux/usb/cdc.h
    include/linux/usb/ncm.h
    include/linux/usb/usbnet.h

    展开全文
  • usbnet 源码分析

    2012-11-03 18:00:02
    linux 2.6.20上的usbnet源码分析,包括初始化和接收/发送流程。
  • usbnet ubuntu12.04

    2012-10-23 09:44:07
    ubuntu12.04 使用的linux 3.0 以上的内核不支持 e680 的usbnet了。通过修改驱动源代码使之支持。我的系统是: xy@xy-pc:~$ cat /proc/version Linux version 3.2.0-29-generic-pae (buildd@roseapple) (gcc version...
  • usbnet/rndis

    千次阅读 2018-05-23 10:06:33
    原文地址:http://blog.csdn.net/absurd/article/details/2840360 手机探索者(mobile explorer)通过几层抽象,让它不依赖...手机探索者(mobile explorer)先实现基于rndis/usbnet的传输方式,在linux PC上支持usbnet...

    原文地址:http://blog.csdn.net/absurd/article/details/2840360

     

    手机探索者(mobile explorer)通过几层抽象,让它不依赖于特定的传输方式,然而抽象就是抽象,一个抽象的面包是不能填饱肚子的,我们一定要有具体的实现。手机探索者(mobile explorer)先实现基于rndis/usbnet的传输方式,在linux PC上支持usbnet是一件非常自然的事情,然而windows似乎并不认识我们的broncho手机:找不到相应驱动的程序,按网上的介绍去做也不凑效。

    虽然看了两周Windows DDK的资料,我还是没有信心和时间去写自己的usbnet驱动程序。没办法,最后决定把broncho伪装成一个window mobile手机,我看过RNDIS的资料和代码,了解它的基本原理,知道实现起来并不难。尽管linux下RNDIS的作者在代码中抱怨RNDIS的SPEC太模糊,但他对Windows mobile手机支持还是比较完善的。

    RNDIS也有设备端的实现,我想要模拟window mobile手机是轻而易举的事。不过还是遇到了点麻烦,在broncho上启用了RNDIS之后,linux PC仍然把它识别为一个普通usbnet设备,我发现它总是匹配不到rndis_host驱动。只好找来一台windows mobile手机,插到linux PC上,然后分析它的USB配置,其内容如下:

    1. Bus 003 Device 063: ID 0bb4:0bce High Tech Computer Corp.
    2. Device Descriptor:
    3.   bLength                18
    4.   bDescriptorType         1
    5.   bcdUSB               2.00
    6.   bDeviceClass          239 Miscellaneous Device
    7.   bDeviceSubClass         1 ?
    8.   bDeviceProtocol         1 Microsoft ActiveSync
    9.   bMaxPacketSize0        64
    10.   idVendor           0x0bb4 High Tech Computer Corp.
    11.   idProduct          0x0bce
    12.   bcdDevice            0.00
    13.   iManufacturer           1 HTC
    14.   iProduct                2 Generic RNDIS
    15.   iSerial                 3 00846335-3781-0103-4800-0050bf3f5173
    16.   bNumConfigurations      1
    17.   Configuration Descriptor:
    18.     bLength                 9
    19.     bDescriptorType         2
    20.     wTotalLength           62
    21.     bNumInterfaces          2
    22.     bConfigurationValue     1
    23.     iConfiguration          0
    24.     bmAttributes         0xc0
    25.       Self Powered
    26.     MaxPower              100mA
    27.     Interface Descriptor:
    28.       bLength                 9
    29.       bDescriptorType         4
    30.       bInterfaceNumber        0
    31.       bAlternateSetting       0
    32.       bNumEndpoints           1
    33.       bInterfaceClass       239 Miscellaneous Device
    34.       bInterfaceSubClass      1 ?
    35.       bInterfaceProtocol      1 Microsoft ActiveSync
    36.       iInterface              0
    37.       Endpoint Descriptor:
    38.         bLength                 7
    39.         bDescriptorType         5
    40.         bEndpointAddress     0x81  EP 1 IN
    41.         bmAttributes            3
    42.           Transfer Type            Interrupt
    43.           Synch Type               None
    44.           Usage Type               Data
    45.         wMaxPacketSize     0x0008  1x 8 bytes
    46.         bInterval               1
    47.     Interface Descriptor:
    48.       bLength                 9
    49.       bDescriptorType         4
    50.       bInterfaceNumber        1
    51.       bAlternateSetting       0
    52.       bNumEndpoints           2
    53.       bInterfaceClass        10 CDC Data
    54.       bInterfaceSubClass      0 Unused
    55.       bInterfaceProtocol      0
    56.       iInterface              0
    57.       Endpoint Descriptor:
    58.         bLength                 7
    59.         bDescriptorType         5
    60.         bEndpointAddress     0x82  EP 2 IN
    61.         bmAttributes            2
    62.           Transfer Type            Bulk
    63.           Synch Type               None
    64.           Usage Type               Data
    65.         wMaxPacketSize     0x0040  1x 64 bytes
    66.         bInterval               0
    67.       Endpoint Descriptor:
    68.         bLength                 7
    69.         bDescriptorType         5
    70.         bEndpointAddress     0x03  EP 3 OUT
    71.         bmAttributes            2
    72.           Transfer Type            Bulk
    73.           Synch Type               None
    74.           Usage Type               Data
    75.         wMaxPacketSize     0x0040  1x 64 bytes
    76.         bInterval               0



    它有两个接口,第一个接口的InterfaceClass和InterfaceSubClass表明它是一个特殊的RNDIS(即ActiveSync),第二个接口表明它是一个普通的CDC设备,也就是usbnet。我按这个配置修改了drivers/usb/gadget/ether.c。

    把rndis_control_intf的内容修改为:

    1. static const struct usb_interface_descriptor
    2. rndis_control_intf = {
    3.     .bLength =              sizeof rndis_control_intf,
    4.     .bDescriptorType =      USB_DT_INTERFACE,
    5.     .bInterfaceNumber =     0,
    6.     .bNumEndpoints =        1,
    7.     .bInterfaceClass =      USB_CLASS_MISC,
    8.     .bInterfaceSubClass =   1,
    9.     .bInterfaceProtocol =   1,
    10.     .iInterface =           STRING_RNDIS_CONTROL,
    11. };



    当启用RNDIS时,ether.c中USB设备有两个配置,第一个RNDIS,第二个是标准CDC,不知道为何Linux PC总是优先匹配到CDC驱动,最后我只好把它修改为一个配置了:

    先把配置的个数定义成一个宏,如果有问题,改回来比较容易。

    1. #define RNDIS_CONF_NR 1


    用RNDIS_CONF_NR替换配置的个数,修改的代码有:

    1. device_desc.bNumConfigurations=RNDIS_CONF_NR
    2. if (rndis)
    3.         device_desc.bNumConfigurations = RNDIS_CONF_NR;
    4. if (rndis)
    5.         dev_qualifier.bNumConfigurations = RNDIS_CONF_NR;



    重新把broncho手机插入到Linux PC上,Linux PC可以正确加载RNDIS_HOST驱动,然而总是告诉我RNDIS初始化失败。失败的原因居然是pipe broken,这让我百思不得其解,RNDIS是通过ep0发送的,这是任何USB设备都会支持的,怎么是pipe broken呢,读了半天USB驱动的代码确认没有什么问题,然后在broncho的UDC的中断打出调试信息,确认收到了初始化的消息,进入一步跟踪到手机RNDIS驱动程序中,也确定收到了初始化消息。失败的原因是rndis没有被激活,让rndis_active函数始终返回TRUE,一切OK了。

    把broncho手机插入装有activesync的windows,windows把broncho识别为windows mobile device,activesync也能识别broncho了,用telnet连接到broncho手机中,能够进入终端状态。

    呵,一切OK了,因为被pipe broken这个错误所迷惑,我读了两天代码才找到原因,结果只需要修改几行代码就行了。

    展开全文
  • linux usbnet驱动

    2019-03-23 16:03:10
    工作中接触了USB转网口设备,通过USB口连接到电视盒子上,会被识别成一个网卡,遇到USB转网口无法获取IP的问题,学习和调试了这部分usb host端的usbnet驱动,进行一下总结。 USB host端的驱动,包括usb host ...

    工作中接触了USB转网口设备,通过USB口连接到电视盒子上,会被识别成一个网卡,遇到USB转网口无法获取IP的问题,学习和调试了这部分usb host端的usbnet驱动,进行一下总结。


    USB host端的驱动,包括usb host controller(如xhci, ehci), usb core(负责usb设备插入识别,枚举,设备与驱动匹配), usb driver (具体某种USB设备的驱动,如鼠标,USB网卡,U盘)
    本篇文章主要介绍USB网卡驱动,属于usb driver。
    USB网卡驱动的代码目录在:/kernel/drivers/net/usb/
    主要文件包括usbnet.c: 通用核心代码,每个usb网卡驱动都会用到
    不同的USB网卡设备会有各自的.c驱动文件,如ax88179_178a.c,rtl8150.c等
    每一个这种.c文件中,都会有一个usb_driver结构体,初始化了一些回调函数,如:
    static struct usb_driver ax88179_178a_driver = {
    .name = "ax88179_178a",
    .id_table = products,
    .probe = usbnet_probe,
    ……………..
    }
    当usb设备插入usb口时,通过id_table,使设备与具体的usb driver匹配上。然后会调用到usb_driver结构体中赋值的probe函数,会调用到usbnet.c中的代码。


    usbnet_probe:
    net = alloc_etherdev(sizeof(*dev));  // 申请网卡结构体
    init_waitqueue_head(&dev->wait);
    skb_queue_head_init (&dev->rxq);
     skb_queue_head_init (&dev->txq);
    skb_queue_head_init (&dev->done);

    ------------------------------------------------------------------------------------------------------------------------------------------------------------

    skb的相关函数:

         skb_queue_head_init: init one list for skb  初始化skb的双向链表

        skb_queue_head : 加一个skb到链表头

        skb_queue_tail: 加一个skb到链表尾

        skb_dequeue : 将一个skb queue 从链表头去掉

        skb_dequeue_tail : 将一个skb queue 从链表尾部去掉。

       skb_queue_purge : 将某个链表清空

       skb_queue_walk : 遍历链表

    ------------------------------------------------------------------------------------------------------------------------------------------------------------
    dev->bh.func = usbnet_bh;
    net->netdev_ops = &usbnet_netdev_ops;
    driver_info->bind() // 调用不同USB网卡各自注册的bind函数,主要作用是,获取in, out, status(接收,发送,状态查询)的endpoint,注册特定设备特有的netdev_ops,启动配置网卡phy
    init_status (dev, udev); //根据之前bind()获取到的interrupt ep,配置用于传输网卡状态(如link up/down)的 interrupt pipe, alloc_urb, fill_int_urb。
    status = register_netdev (net);  //网卡设备初始化的最重要一步,向上层注册这个网卡设备,协议层就可以通过这个设备的tx rx接口发送接收数据。


    usbnet_open
    usbnet_probe之后,kernel已经知道了这个net_device, 会调用之前注册的net_device_ops.ndo_open函数,也就是调用usbnet_open (struct net_device *net):
    usbnet_status_start(dev, GFP_KERNEL); //submit之前准备好的interrupt urb, 开始查询网卡状态。

    netif_start_queue (net); // Allow upper layers to call the device hard_start_xmit routine.

     

    bulk in  ep: 通过rx_submit函数提交接收数据的urb,urb完成之后调用rx_complete回调函数,取出urb中的数据,把skb(网络专用数据结构)往业务层传递

    bulk out ep: usbnet_probe和usbnet_open之后,业务层会调用usbnet_start_xmit (struct sk_buff *skb,struct net_device *net), 把skb数据转换成urb,提交给usb,通过USB网卡向外发送网络包。urb完成之后调用tx_complete,启动tasklet_schedule(&dev->bh); 处理完成的skb。

    interrutp ep: 网络状态发生改变时,如link down/up, interrupt urb完成,调用intr_complete, 更新网络状态。


     

    展开全文
  • usbnet.c add proc

    2012-09-30 17:25:33
    usbnet.c,the driver of usb2net,add proc.
  • USB linux NCM usbnet驱动详解

    万次阅读 2016-11-23 19:48:42
    enum流程,cdc_ncm的probe中直接调用usbnet_probe,usbnet_probe中会分配network_device和usbnet,并调用cdc_ncm的bind回调进行cdc_ncm的附加descriptor的解析,之后调用init_status对NCM的 第一个
    cdc_ncm -> usbnet device -> net_device


    enum流程,cdc_ncm的probe中直接调用usbnet_probe,usbnet_probe中会分配network_device和usbnet,并调用cdc_ncm的bind回调进行cdc_ncm的附加descriptor的解析,之后调用init_status对NCM的
    第一个interface的interrupt ep进行urb的分配和注册。这个urb的complete的callback会调用cdc_ncm的status回调进行相应处理,主要是两种event, USB_CDC_NOTIFY_NETWORK_CONNECTION和USB_CDC_NOTIFY_SPEED_CHANGE.
    USB_CDC_NOTIFY_NETWORK_CONNECTION:根据传来的wValue判断出是disconnect和connect,然后调用netif_carrier_on/netif_carrier_off来通知上层。
    USB_CDC_NOTIFY_SPEED_CHANGE:简单的打印一句log而已。
    最后注册network_device(register_netdev和netif_device_attach)。
    cdc_ncm_bind主要就是根据NCM的descriptor来初始化一个cdc_ncm_ctx对象。

    cdc_ncm_check_connect是在ifconfig时调用到了network_device的open函数时候被调用,主要来判断ctx是否为空,因为disconnect的时候,它就会被设置为NULL。

    cdc_ncm_manage_power的实现主要就是用来开启/关闭remote wakeup功能的。


    接受流程:
    rx_submit, 会alloc_skb, 然后usb_fill_bulk_urb,最后usb_submit_urb。
    usb_submit_urb如果submit成功,则将skb提交到rxq上。
    urb的rx_complete里首先会设置state为rx_done,然后会判断urb->status, 如果是0说明接受成功,state = rx_cleanup。然后调用defer_bh。defer_bh会把skb从rxq上移除,然后将其
    加入到done的list中。如果done中的qlen等于1, 则tasklet_schedule(&dev->bh),即usbnet_bh被调用。
    usbnet_bh会首先从done中dequeue一个skb,然后判断如果state状态是rx_done,则设置为rx_cleanup,然后调用rx_process去处理。如果是rx_cleanup则free_urb,free_skb。
    rx_process会调用driver_info->rx_fixup去让cdc_ncm驱动进行处理,处理完成后,因为cdc_ncm设置了FLAG_MULTI_PACKET,所以直接调用dev_kfree_skb_any去释放掉了skb。如果没有设置,则调用usbnet_skb_return。

    cdc_ncm_rx_fixup处理:主要就是将skb中的data,按照NTB格式解析:
    1,在NTH中取得NTB length,如果大于cdc_ncm驱动支持的最大size,则返回错误。
    2,解析NTH中的wNdpIndex取得第一个NDP的索引。
    3,memcpy,将第一个ndp拷贝到rx_ncm.ndp16中
    4,接下来解析ndp,首先ndp会包含一个或多个dpe,每个dpe包含一个frame的网络数据。
    1019     nframes = ((le16_to_cpu(ctx->rx_ncm.ndp16.wLength) -
    1020                     sizeof(struct usb_cdc_ncm_ndp16)) /
    1021                     sizeof(struct usb_cdc_ncm_dpe16));
    计算出有多少个frames
    5,判断nframes是否大于CDC_NCM_DPT_DATAGRAMS_MAX,如果大于则 nframes = CDC_NCM_DPT_DATAGRAMS_MAX;
    6,将所有的npe都拷贝到rx_ncm.dpe16中
    7,一个for循环,开始解析每一个dpe,对每一个dpe都调用skb_clone创建一个skb备份,然后调用usbnet_skb_return,通过netif_rx将dataparam中的数据,提交给network subsystem。

    发送流程:
    network_device的ndo_start_xmit:
    1,首先调用cdc_ncm的tx_fixup函数。 cdc_ncm_tx_fixup会调用cdc_ncm_fill_tx_frame函数将上层传下来的skb转换为NTB,linux的cdc_ncm的NTB格式为: NTH + NDP + datapayload。其中NDP会包含n个datagram(index+len)。
    2,创建urb,并在skb->cb创建skb_data。并处理发送ZLP,就是有些device要求发送一个zero packet来作为结束请求。
    3,提交urb,成功返回后,将对应的skb加到txq中,如果txq中的skb大于maxSegmentSize,那么调用netif_stop_queue来告诉上层不要再发数据了,快爆了。
    在urb的tx_complete中,最后会调用usbnet_bh,usbnet_bh中最后判断出txq中的skb小于maxSegmentSize后,会调用netif_wake_queue来恢复上层的数据传送。

    展开全文
  • USB NCM usbnet 枚举流程代码分析一、cdc_ncm.c1.1 struct usb_device_id结构体1.1.1 match_flags 设备类型1.1.2 bInterfaceClass 接口类 一、cdc_ncm.c 在linux 驱动中,CDC NCM的驱动位于: kernel\drivers\...
  • 三星I8320_H1_USBNET_驱动

    2011-02-24 16:39:54
    三星I8320的USBNET驱动。 下载后定位到这里就行了。
  • 手机探索者开发实录—rndis/usbnet
  • ubuntu12.04 e680 usbnet

    2012-10-23 09:34:19
    ubuntu的usb3.0 不支持 e680的usbnet了。 要改驱动了 主要如下: 在类似下面的结构体中,改成e680的标识: 22b8:600c { /* Motorola MOTOMAGX phones */ USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6424, USB...
  • 在Gentoo上设置usbnet

    2014-02-28 23:45:53
    在Gentoo上设置usbnet Linux的无线网卡是个大问题,在无线网卡不好用的时候,我用手机作为无线网卡使用。 手机连上wifi后,用usb和电脑连接,选择usb共享,这时候dhcpcd usb0一下,就可以上网了。 不过在...
  • 让Broncho A1支持usbnet

    千次阅读 2010-01-27 08:41:00
    转载时请注明出处和作者联系方式文章出处:http://www.limodev.cn/blog作者联系方式:李先静 下载支持usbnet的内核:http://limodev.cn/download/broncho/kernel.bin-usbnet关于A1通过usbnet访问...
  • rndis/usbnet

    千次阅读 2014-09-18 18:17:36
    手机探索者(mobile explorer)先实现基于rndis/usbnet的传输方式,在linux PC上支持usbnet是一件非常自然的事情,然而windows似乎并不认识我们的broncho手机:找不到相应驱动的程序,按网上的介绍去做也不凑效。...
  • usbnet的模块如何用?

    千次阅读 2008-08-07 22:10:00
    导读: usbnet的模块如何用? 通用串行总线(USB)是一种快速而灵活地连接配件与计算机工作站的接口,其应用非常广泛。Linux中除了包含对USB主机控制器的驱动,还含有USB设备控制器,尤其是集成在StrongARM SA1110...
  • ubuntu 8.04中使用USBNET连接ROKR E6

    千次阅读 2008-07-03 15:12:00
    E6在ubuntu 8.04中使用USBNET连接 ubuntu 8.04 中 zaurus 模块没有被编译入2.6.24内核,所以导致MOTO 以linux为内核的手机无法以USBNET方式连接电脑。上网查了下,找到了方法我的内核版本: 2.6.24-16-generic 1.前提...
  • usbnet驱动结构

    千次阅读 2012-11-02 17:48:07
    usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) {  struct usbnet *dev; /* 私有数据结构,作为net设备与usb设备之间的关联表*/  struct net_device *net; /* 网络设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 971
精华内容 388
关键字:

usbnet