博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用configfs配置usb gadget设备
阅读量:3559 次
发布时间:2019-05-20

本文共 5361 字,大约阅读时间需要 17 分钟。

Linux支持usb主机驱动,  同时也支持从设备驱动。

其主要使用gadget api框架实现。 软件一般分为三个层次, 

1. gadget function 对应于usb function, 即按照协议, usb设备需要实现的功能。(如HID, MSC, UVC等)

2. gadget api(framework) 即linux提供的usb gadget驱动框架

3. UDC Driver (即usb设备控制器驱动), 实现控制器相关驱动


关于usb gadget设备function驱动,  最新Linux提供了多种方式。

1. 使用usb_compositor_driver, 注册/实现该驱动即可。

2. 使用configfs进行配置, 用户态可以利用配置文件系统创建相应configuration, interface, endpoint等, 配合内核态的驱动, 即可实现某种功能的usb设备。

3. 使用functionfs进行配置, 最新的安卓相关usb驱动, 如adb, mtp, ptp就是采用这种方式实现。 即内核态提供功能文件系统,  内部可关联多种标准功能,  具体协议由应用层实现, 即所谓的用户态驱动。


此处暂且只讨论configfs配置相关.

1. 配置cdc ecm虚拟网卡驱动

1. make menuconfig 确保支持usb gadget驱动,  configfs, 及libcomposite.ko等请加载相关驱动模块,  我这里大部分为buildin的驱动。2. 故操作如下:   insmod usb_f_ecm.ko    // 加载cdc ecm function驱动      mount -t configfs none /sys/kernel/config    // 挂载configfs      cd /sys/kernel/config/usb_gadget   // 目前里面是空的,  即没有 gadget设备   mkdir g_ecm   // 创建ecm gadget设备   root@xxx:/sys/kernel/config/usb_gadget/g_ecm# ls -alltotal 0drwxr-xr-x    6 root     root             0 Jun 10 14:46 .drwxr-xr-x    3 root     root             0 Jun 10 14:46 ..-rw-r--r--    1 root     root          4096 Jun 10 14:46 UDC-rw-r--r--    1 root     root          4096 Jun 10 14:46 bDeviceClass-rw-r--r--    1 root     root          4096 Jun 10 14:46 bDeviceProtocol-rw-r--r--    1 root     root          4096 Jun 10 14:46 bDeviceSubClass-rw-r--r--    1 root     root          4096 Jun 10 14:46 bMaxPacketSize0-rw-r--r--    1 root     root          4096 Jun 10 14:46 bcdDevice-rw-r--r--    1 root     root          4096 Jun 10 14:46 bcdUSBdrwxr-xr-x    2 root     root             0 Jun 10 14:46 configsdrwxr-xr-x    2 root     root             0 Jun 10 14:46 functions-rw-r--r--    1 root     root          4096 Jun 10 14:46 idProduct-rw-r--r--    1 root     root          4096 Jun 10 14:46 idVendor-rw-r--r--    1 root     root          4096 Jun 10 14:46 max_speeddrwxr-xr-x    2 root     root             0 Jun 10 14:46 os_descdrwxr-xr-x    2 root     root             0 Jun 10 14:46 strings此时,  内部会自动创建很多文件及文件夹, 从名称看, 基本就是对usb设备的一种抽象。如 UDC - 设备控制器   bDeviceClass - 设备类型   bDeviceProtocol - 协议   bMaxPacketSize0 - 包的最大的size   bcdUSB - usb规范版本号   bcdDevice - 设备版本号   idProduct - 产品id   idVendor - 供应商id   strings - 字符串信息   max_speed - 最大速度   configs - 配置项   functions - 功能/接口   继续,    echo "64" > bMaxPacketSize0    echo "0x200" > bcdUSB      // usb2.0    echo "0x100" > bcdDevice    echo "0x03FD" > idVendor    echo "0x0502" > idProduct        // 以上设置gadget设备一些基本信息    mkdir config/config1.1       // 创建配置项1, 有一定的命名规则    mkdir functions/ecm.0        // 创建一种ecm功能    ln -s functions/ecm.0 configs/config1.1    // 将ecm.0 功能放入配置项    ls config/config1.1/ecm.0/root@xxx:/sys/kernel/config/usb_gadget/g_ecm/configs/config1.1/ecm.0# ls -alltotal 0drwxr-xr-x    2 root     root             0 Jun 10 14:57 .drwxr-xr-x    3 root     root             0 Jun 10 14:56 ..-rw-r--r--    1 root     root          4096 Jun 10 14:57 dev_addr-rw-r--r--    1 root     root          4096 Jun 10 14:57 host_addr-r--r--r--    1 root     root          4096 Jun 10 14:57 ifname-rw-r--r--    1 root     root          4096 Jun 10 14:57 qmult    ok, usb ecm设备就通过gadget文件系统配置好了, 包含一些必要的描述信息(pid, vid, config, function等)最后, 通过UDC控制器 启动该usb设备echo "fe200000.dwc3" > UDC"fe200000.dwc3" 为dwc3 控制器, 通过AMBA总线于cpu, ddr等相连接, 通过sysfs文件系统可以查看:ls /sys/devices/platform/amba/ff9d0000.usb0/fe200000.dwc3root@xxx:/sys/kernel/config/usb_gadget/g_ecm# echo "fe200000.dwc3" > UDC [ 1172.683653] driver->udc_name: fe200000.dwc3[ 1172.687848] begin to find udc(fe200000.dwc3)[ 1172.692119] ret = 0[ 1172.694209] udc_bind_to_driver...[ 1172.697514] registering UDC driver [g_ecm][ 1172.701602] dwc3_gadget_set_speed[ 1172.704926] dwc3_gadget_set_selfpowered[ 1172.709167] usb0: HOST MAC ea:df:fe:4e:7e:10[ 1172.713514] usb0: MAC c6:01:94:6e:04:4f[ 1172.717379] dwc3_gadget_start[ 1172.720847] dwc3_gadget_pullupifconfig后, usb0虚拟网卡出现!!usb0      Link encap:Ethernet  HWaddr C6:01:94:6E:04:4F            BROADCAST MULTICAST  MTU:1500  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)后面就是配置ip地址, 网络掩码, 网关等操作。

 

2. 配置网卡

Linux主机端:

river@river-VirtualBox:~/linux_workspace/kernel/linux-source-5.0.0$ lsusb -t/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M    |__ Port 1: Dev 3, If 0, Class=Communications, Driver=cdc_ether, 5000M    |__ Port 1: Dev 3, If 1, Class=CDC Data, Driver=cdc_ether, 5000M/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 480M    |__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=, 12M可以看到cdc_ether驱动已加载[23783.203140] cdc_ether 2-1:1.0 enp0s12u1: renamed from usb0river@river-VirtualBox:~/linux_workspace/kernel/linux-source-5.0.0$ ifconfig -aenp0s12u1: flags=4099
mtu 1500 ether ea:df:fe:4e:7e:10 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enp0s12u1即为usb0网卡, 已重命名。ifconfig enp0s12u1 192.168.1.111 netmask 255.255.255.0即可===========================================================================================设备端同理,ifconfig usb0 192.168.1.222 netmask 255.255.255.0之后就可以互相ping通

 

 

ECM USB虚拟网卡驱动配置完成。

转载地址:http://aicrj.baihongyu.com/

你可能感兴趣的文章
[LeetCode javaScript] 292. Nim游戏
查看>>
[LeetCode javaScript] 896. 单调数列
查看>>
[LeetCode javaScript] 804. 唯一摩尔斯密码词
查看>>
[LeetCode javaScript] 476. 数字的补数
查看>>
[LeetCode javaScript] 811. 子域名访问计数
查看>>
[LeetCode javaScript] 414. 第三大的数
查看>>
[LeetCode javaScript] 242. 有效的字母异位词
查看>>
[LeetCode javaScript] 75. 颜色分类
查看>>
[LeetCode javaScript] 179. 最大数
查看>>
[LeetCode javaScript] 56. 合并区间
查看>>
[LeetCode javaScript] 190. 颠倒二进制位
查看>>
[LeetCode javaScript] 521. 最长特殊序列 Ⅰ
查看>>
[LeetCode javaScript] 806. 写字符串需要的行数
查看>>
[LeetCode javaScript] 868. 二进制间距
查看>>
[LeetCode javaScript] 824. 山羊拉丁文
查看>>
[LeetCode javaScript] 463. 岛屿的周长
查看>>
[LeetCode javaScript] 107. 二叉树的层次遍历 II
查看>>
[LeetCode javaScript] 637. 二叉树的层平均值
查看>>
[LeetCode javaScript] 1. 两数之和
查看>>
[LeetCode javaScript] 14. 最长公共前缀
查看>>