找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 6417|回复: 10

【教程】我家云配置USB2.0接口为RNDIS+Mass_Storage+串口

[复制链接]
本帖最后由 zhouruixi 于 2020-1-12 17:11 编辑

我家云的usb2.0接口支持OTG,我想在开机后把usb2.0接口设置为gadget网卡,然后使用双公头的usb线连接到台式机上,实现台式机和我家云之间通过usb实现网络互联。即达到跟手机的USB网络共享一样效果。

20200112更新:自己整理修改了一下脚本,加了中文注释,使之更好用。利用systemd开机自动创建gadget,并启用串口控制台(debian 10默认不允许root登录)。

######################################################################################################################################
基础知识
USB的三种模式(dr_mode)
  • peripheral
  • otg(默认为device
  • host
内核要求
修改DeviceTree中USB接口的模式
1、将dtb转为dts,修改usb@ff580000下面的dr_mode为peripheral或者otg
  1. dtc -I dtb rk3328-rock64.dtb -O dts -o rk3328-rock64.dts
复制代码
  1. usb@ff580000 {

  2.                 compatible = "rockchip,rk3328-usb\0rockchip,rk3066-usb\0snps,dwc2";

  3.                 reg = < 0x00 0xff580000 0x00 0x40000 >;

  4.                 interrupts = < 0x00 0x17 0x04 >;

  5.                 clocks = < 0x02 0x14d >;

  6.                 clock-names = "otg";

  7.                 dr_mode = "peripheral";

  8.                 g-np-tx-fifo-size = < 0x10 >;

  9.                 g-rx-fifo-size = < 0x118 >;

  10.                 g-tx-fifo-size = < 0x100 0x80 0x80 0x40 0x20 0x10 >;

  11.                 g-use-dma;

  12.                 phys = < 0x53 >;

  13.                 phy-names = "usb2-phy";

  14.                 status = "okay";

  15.                 phandle = < 0x9a >;

  16.         };
复制代码
2、重新将dts编译为dtb
  1. dtc -I dts rk3328-rock64.dts -O dtb -o rk3328-rock64.dtb
复制代码
3、开机后检查是否存在/sys/class/udc/ff580000.usb
  1. # ls /sys/class/udc/ff580000.usb -l

  2. /sys/class/udc/ff580000.usb -> ../../devices/platform/ff580000.usb/udc/ff580000.usb
复制代码
方法一:使用g_ether等模块(将对应的module名称加入/etc/modules中即可实现开机自动启动)1、Win10自动安装驱动,但是显示只有百兆
  1. modprobe g_ether idVendor=0x15ec idProduct=0xd041
复制代码
2、默认win10识别为串口,需手动安装驱动。
访问http://www.catalog.update.micros ... SB%20RNDIS%20Gadget,下载AcerIncorporated. - Other hardware - USB Ethernet/RNDIS Gadget | Windows 7,Windows8,Windows 8.1 and later drivers | Drivers (Other Hardware) | 13.01.2010 |1.0.0.0 | 21 KB
  1. modprobe g_ether
复制代码
3、大容量存储
  1. modprobe g_mass_storage file=/piusb.bin stall=0
复制代码
4、串口
  1. modprobe g_serial
复制代码
Modulesincluded

  • Serial     (g_serial)
  • Ethernet     (g_ether)
  • Mass     storage (g_mass_storage)
  • MIDI     (g_midi)
  • Audio     (g_audio)
  • Keyboard/Mouse     (g_hid)
  • Mass     storage and Serial (g_acm_ms)
  • Ethernet     and Serial (g_cdc)
  • Multi     (g_multi) - Allows you to configure 2 from Ethernet, Mass storage and     Serial
              In addition to the above modules, a few other (less useful) modules     are included.
  • Webcam     (g_webcam)
  • Printer     (g_printer)
  • Gadget     tester (g_zero)

来自 <https://gist.github.com/gbaman/50b6cca61dd1c3f88f41>

方法二:使用libcomposite和configfs
执行modprobe libcomposite,查看是否出现/sys/kernel/config/usb_gadget/

开启串口+USB网卡+大容量存储(U盘模式)
  1. #!/bin/bash
  2. # 加载 libcomposite 模块
  3. if [ ! -d /sys/kernel/config/usb_gadget ]; then
  4.     modprobe libcomposite
  5. fi
  6. # 若存在 gadget g1 则先删除
  7. if [ -d /sys/kernel/config/usb_gadget/g1 ]; then
  8.     echo ">>>>>>>>>>>>g1 is exist! delete it!"
  9.     systemctl stop getty@ttyGS0.service
  10.     cd /sys/kernel/config/usb_gadget/g1
  11.     echo '' > UDC
  12.     #remove all links
  13.     find . -type l -exec rm -v {} \;
  14.     #rmdir configs/c.1/strings/0x409
  15.     find configs -name 'strings' -exec rmdir -v {}/0x409 \;
  16.     #rmdir configs/c.1
  17.     ls -d configs/* | xargs rmdir -v
  18.     #rmdir strings/0x409
  19.     ls -d strings/* | xargs rmdir -v
  20.     #rmdir functions/hid.usb0
  21.     ls -d functions/* | xargs rmdir -v
  22.     cd ..
  23.     rmdir -v g1
  24.     modprobe -r libcomposite > /dev/null 2>&1
  25.     echo ">>>>>>>>>>>>>Delete success, Run script again to create the gadget!!"
  26.     exit 0
  27. fi

  28. # 定义一些变量
  29. HOST="48:6f:73:74:50:43"
  30. RNDIS="42:61:64:55:53:42"
  31. # 若指定块设备不存在则创建一个测试用镜像
  32. MASS_FILE=/root/usbdisk.img #用户直接修改为要使用的块设备路径即可
  33. if [ ! -e $MASS_FILE ] ; then
  34.     echo "Create $MASS_FILE format with vfat for Mass Storage......"
  35.     dd if=/dev/zero of=$MASS_FILE bs=1M count=8
  36.     mkfs.vfat $MASS_FILE
  37. fi

  38. ###############开始创建gadget################
  39. echo ">>>>>>>>>>>>>Starting create gadget......"
  40. cd /sys/kernel/config/usb_gadget/
  41. mkdir g1
  42. cd g1
  43. # 可以让Windows 10 自动安装RNDIS驱动
  44. #ID_VENDOR="0x1d6b"
  45. #ID_PRODUCT="0x0104"
  46. echo 0x1d6b > idVendor
  47. echo 0x0104 > idProduct
  48. echo 0x3066 > bcdDevice
  49. echo 0x0200 > bcdUSB
  50. # echo 0x02 > bDeviceClass
  51. echo 0x00 > bDeviceClass
  52. echo 0x00 > bDeviceSubClass
  53. mkdir -p strings/0x409
  54. echo `cat /proc/device-tree/serial-number` > strings/0x409/serialnumber
  55. echo `uname -r` > strings/0x409/manufacturer
  56. echo `hostname -s` > strings/0x409/product
  57. #-----------------------------------
  58. # 创建RNDIS functions
  59. echo ">>>>>>>>Create RNDIS ......"
  60. mkdir -p functions/rndis.usb0
  61. echo $RNDIS > functions/rndis.usb0/dev_addr
  62. echo $HOST > functions/rndis.usb0/host_addr
  63. echo "RNDIS" > functions/rndis.usb0/os_desc/interface.rndis/compatible_id
  64. echo "5162001" > functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id
  65. # 创建串口function
  66. echo ">>>>>>>>Create serial ......"
  67. mkdir -p functions/acm.gs0
  68. # 创建mass_storage function
  69. echo ">>>>>>>>Create Mass_Storage ......"
  70. mkdir -p functions/mass_storage.usb0
  71. echo 1 > functions/mass_storage.usb0/stall
  72. echo 0 > functions/mass_storage.usb0/lun.0/cdrom
  73. echo 0 > functions/mass_storage.usb0/lun.0/ro
  74. echo 0 > functions/mass_storage.usb0/lun.0/nofua
  75. echo 1 > functions/mass_storage.usb0/lun.0/removable
  76. echo $MASS_FILE > functions/mass_storage.usb0/lun.0/file
  77. # 创建config1
  78. echo ">>>>>>>>>>>Create config1: ACM + Mass_Storage + RNDIS ......"
  79. mkdir -p configs/c.1/strings/0x409
  80. echo "0x80" > configs/c.1/bmAttributes
  81. echo 250 > configs/c.1/MaxPower
  82. echo "config1: ACM + Mass_Storage + RNDIS" > configs/c.1/strings/0x409/configuration
  83. # 将对应function软连到c.1下面, 即应用该function
  84. ln -s functions/rndis.usb0 configs/c.1/
  85. ln -s functions/acm.gs0 configs/c.1/
  86. ln -s functions/mass_storage.usb0 configs/c.1/
  87. ## 开启os_desc // 有必要吗?
  88. echo "1" > os_desc/use
  89. echo "0xcd" > os_desc/b_vendor_code
  90. echo "MSFT100" > os_desc/qw_sign
  91. # 将对应的config软连到os_desc下即可
  92. ln -s configs/c.1 os_desc/
  93. # 将gadget绑定到USB接
  94. echo ">>>>>>>>>>>Bind config1 to $(ls /sys/class/udc)"
  95. ls /sys/class/udc > UDC
  96. echo "All is done, Run script again to delete the gadget!"
复制代码

参考:
https://gist.github.com/Gadgetoid/c52ee2e04f1cd1c0854c3e77360011e2
https://github.com/ckuethe/usbarmory/wiki/USB-Gadgets
https://github.com/dpavlin/linux-usb-otg


  
利用systemd让其开机自动启动
  
  
# cat  /etc/systemd/system/usb-gadget.service
  
[Unit]
  
Description=USB  gadeget
  
After=sys-kernel-config.mount
  
Before=network-pre.target
  
  
[Service]
  
Type=oneshot
  
RemainAfterExit=yes
  
ExecStart=/usr/local/sbin/gadget_start.sh
  
ExecStop=/usr/local/sbin/gadget_stop.sh
  
  
[Install]
  
WantedBy=multi-user.target
  
  
# systemctl enable  usb-gadget
  
Created symlink  /etc/systemd/system/multi-user.target.wants/usb-gadget.service →  /etc/systemd/system/usb-gadget.service.
  
  #启用串口控制台
# systemctl enable  getty@ttyGS0.service
  
Created symlink  /etc/systemd/system/getty.target.wants/getty@ttyGS0.service →  /lib/systemd/system/getty@.service.
  
  
ExecStart=-/sbin/agetty -o '-p -- \\u' --noclear %I 115200 $TERM   //编辑getty@ttyGS0.service可以指定波特率
  








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
如果用3.0的接口是不是就变成千兆网的速度了?

点评

理论是将近5G。 RK3328只有一个usb3.0,我家云使用了usb3.0的hub,估计会导致设置为peripheral模式后无法使用。  详情 回复 发表于 2019-12-28 10:42
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

专业,只有看看。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

顶起来,支持大神折腾,我等小白只能看看。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
唯涂涂不可辜负 发表于 2019-12-27 13:25
如果用3.0的接口是不是就变成千兆网的速度了?

理论是将近5G。
RK3328只有一个usb3.0,我家云使用了usb3.0的hub,估计会导致设置为peripheral模式后无法使用。

点评

RK3328只有一个USB3.0吗,那是不是意味着它是一个USB3.0然后HUB变成两个,其中一个接USB转SATA线变成内置的,剩下那个就是外面的USB3.0了  详情 回复 发表于 2019-12-28 11:43
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

zhouruixi 发表于 2019-12-28 10:42
理论是将近5G。
RK3328只有一个usb3.0,我家云使用了usb3.0的hub,估计会导致设置为peripheral模式后无 ...

RK3328只有一个USB3.0吗,那是不是意味着它是一个USB3.0然后HUB变成两个,其中一个接USB转SATA线变成内置的,剩下那个就是外面的USB3.0了

点评

应该是的, http://opensource.rock-chips.com/wiki_RK3328中提到External interface:USB 2.0 x2 and USB 3.0 x1  详情 回复 发表于 2019-12-28 11:47
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
唯涂涂不可辜负 发表于 2019-12-28 11:43
RK3328只有一个USB3.0吗,那是不是意味着它是一个USB3.0然后HUB变成两个,其中一个接USB转SATA线变成内置 ...

应该是的,
http://opensource.rock-chips.com/wiki_RK3328中提到External interface:USB 2.0 x2 and USB 3.0 x1
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

这么用usb的很小众吧,感谢搂主的付出,好庞大工程
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

强帖留名,备用
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

我家云usb2.0插上无线网卡就可以使用对吗?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

感谢分享,特别有用
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-28 03:47

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表