找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-12-22 12:17 | 显示全部楼层 |阅读模式
本帖最后由 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可以指定波特率
  








本帖子中包含更多资源

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

×

评分

参与人数 1恩山币 +1 收起 理由
Arnie97 + 1 教程很清晰,调试过程中需检查的点都列出来 ...

查看全部评分

只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
发表于 2019-12-27 13:25 | 显示全部楼层
如果用3.0的接口是不是就变成千兆网的速度了?

点评

理论是将近5G。 RK3328只有一个usb3.0,我家云使用了usb3.0的hub,估计会导致设置为peripheral模式后无法使用。  详情 回复 发表于 2019-12-28 10:42
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2019-12-27 14:11 | 显示全部楼层
专业,只有看看。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2019-12-27 15:31 | 显示全部楼层
顶起来,支持大神折腾,我等小白只能看看。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2019-12-28 10:42 | 显示全部楼层
唯涂涂不可辜负 发表于 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
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2019-12-28 11:43 | 显示全部楼层
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
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

 楼主| 发表于 2019-12-28 11:47 | 显示全部楼层
唯涂涂不可辜负 发表于 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
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2019-12-28 14:37 | 显示全部楼层
这么用usb的很小众吧,感谢搂主的付出,好庞大工程
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2020-1-13 17:34 | 显示全部楼层
强帖留名,备用
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2020-1-13 18:03 | 显示全部楼层
我家云usb2.0插上无线网卡就可以使用对吗?
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2023-12-13 15:48 | 显示全部楼层
感谢分享,特别有用
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

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

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

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

GMT+8, 2026-8-23 21:59

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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

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