• orangepi-4-LTS g_mass_storage 模拟 U盘


    内核版本:官方提供的 linux 5.10.43
    实现功能:通过 gadget 配置,将开发板模拟成U盘,通过板子上的Type-C接口与PC传输数据

    前言:在网上找了好多教程都大同小异,大都没有提到要修改设备树,然而这个板子,官方的设备树默认没有绑定,还是在QQ群大神的指导下完成了配置,感谢!

    进入正题

    1. 关闭源码更新功能
      orangepi-bulid 编译系统编译 linux 内核源码时首先会将 linux 内核源码和 github服务器的 linux 内核源码进行同步, 所以如果想修改 linux 内核的源码, 首先需要关闭源码的更新功能(需要完整编译过一次 linux 内核源码后才能关闭这个功能, 否则会提示找不到 linux 内核的源码)
      在 orangepi-build/userpatches/config-default.conf 中,修改
     IGNORE_UPDATES="yes"
    
    • 1
    1. 修改设备树
      路径:orangepi-build/kernel/orange-pi-5.10-rk3399/arch/arm64/boot/dts/rockchip/rk3399-orangepi-4-lts.dts
      在这里插入图片描述
      注意,不要改到 &usbdrd_dwc3_1,3_1 对应的是开发板上的 usb3.0 host 接口

    2. 编译镜像文件
      进入 menuconfig
      在这里插入图片描述在这里插入图片描述

    3. 配置 gadget
      参考以下配置
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      USB Type-C Support 里面我勾了这几个,不过还没试过不够行不行
      在这里插入图片描述

    4. 启动,以下所有操作均在开发板上执行
      编译好之后用 Orangepi-build/output/images/Orangepi4-lts_3.0.8_ubuntu_focal_server_linux5.10.43下的
      Orangepi4-lts_3.0.8_ubuntu_focal_server_linux5.10.43.img
      启动

    5. 验证设备树
      先看下修改的设备树有没有生效,执行

    cat /sys/firmware/devicetree/base/usb@fe800000/usb@fe800000/dr_mode
    
    • 1

    在这里插入图片描述
    可以看到 usb@fe800000 的 dr_mode 已经是 peripheral 了,注意如果是 usb@fe900000 的 dr_mode 变成 peripheral,那就是设备树中修改到了 &usbdrd_dwc3_1,一定要改到 &usbdrd_dwc3_0

    1. 查看模块
      在开发板的 /lib/modules/5.10.43/kernel/drivers/usb/gadget 目录下可以看到这几个模块
      在这里插入图片描述
      一切准备就绪。

    2. 切换到 otg 模式
      先看看 /sys/devices/platform/ff770000.syscon/ff770000.syscon:usb2-phy@e450/otg_mode

    cat /sys/devices/platform/ff770000.syscon/ff770000.syscon:usb2-phy@e450/otg_mode
    
    • 1

    在这里插入图片描述
    如果不是 otg 或者 peripheral 的话,修改为 otg 或者 peripheral

    echo peripheral > /sys/devices/platform/ff770000.syscon/ff770000.syscon\:usb2-phy@e450/otg_mode
    
    • 1

    在这里插入图片描述

    1. 建立镜像模拟U盘
     dd if=/dev/zero of=udisk.img bs=1M count=1024
     mkfs.vfat udisk.img
     losetup /dev/loop0 udisk.img
     mkdir udisk_mount_point
     mount /dev/loop0 udisk_mount_point
    
    • 1
    • 2
    • 3
    • 4
    • 5

    建立一个1GB的镜像文件,用于模拟U盘
    将镜像只作为vfat的文件系统,PC可以访问
    将镜像与 loop0 连接
    建立U盘镜像文件的挂载点,相当于 udisk_mount_point 这个文件夹就是 U 盘的存储路径
    挂载 udisk_mount_point

    1. 加载 gadget 模块
    modprobe gadgetfs.ko
    modprobe libcomposite.ko
    modprobe usb_f_mass_storage.ko
    modprobe g_mass_storage.ko file=/dev/loop0 stall=0 removable=1
    
    • 1
    • 2
    • 3
    • 4

    一顿操作之后,通过开发板的 Typec 接口连接到 PC,在 PC 上会看到新的可移动设备,试着在里边新建一个文件,可以在 udisk_mount_point 目录下看到这个文件。
    可以将以上挂载命令以及加载模块命令写到一个脚本里面,开机的时候自动执行,会方便很多,明天再整吧,洗洗睡了。

  • 相关阅读:
    JdbcTemplate操作数据库
    C#WPF数字大屏项目实战09--机器产量统计
    回溯法求解n个元素的集合的幂集
    人工智能安全国际标准化进展研究
    力扣刷题day52|84. 柱状图中最大的矩形
    JS基础知识总结(四)
    java插入百万级别的数据解决方案
    前车之鉴,后车之师
    delphi 3层源码
    python自动化测试中装饰器@unpack、@json_file和@yaml_file源码解析和使用
  • 原文地址:https://blog.csdn.net/weixin_42255916/article/details/127698224