利用USB OTG把ARM板(瑞芯微RK3399+Linux)模拟为U盘

本文介绍如何在Linux系统下利用OTG接口模拟U盘。通过配置内核支持并编译生成相关模块,可以将ARM板卡如RK3399配置成虚拟U盘,实现与PC间的数据交换。文中还提供了速度测试信息。

        现在大量的ARM CPU芯片都可以支持USB OTG2.0/3.0接口,该接口往往工作为USB Host,用于连接USB设备,同时用该OTG接口用于烧写镜像和固件。不过该接口也可以在Linux下作为USB设备工作,此时ARM板卡可以通过该OTG,将ARM板本身配置为键盘、鼠标,甚至是U盘,将OTG口通过USB线与PC机相连,直接在ARM板和PC机之间进行数据传送。下面以RK3399板为例,看看如何将RK3399板的Linux系统上配置为U盘工作。

一、Linux配置和编译

1.1 内核驱动配置

通过make menuconfig将OTG口配置为DRD(Dual Role Mode),同时使能Gadget和Mass Storage。详细如下描述。

  Device Drivers  ---> 
    [*] USB support  ---> 
        <*>   DesignWare USB2 DRD Core Support
                DWC2 Mode Selection (Dual Role mode)  --->

        <*>   USB Gadget Support  ---> 
                 --- USB Gadget Support
                  (500) Maximum VBUS Power usage (2-500 mA)
                  (2)   Number of storage pipeline buffers
                  <M>   USB Gadget Drivers
                  <M>   USB functions configurable through configfs
                  [*]   Mass storage
                  <M>   Gadget Filesyste
                  < >   Function Filesystem
                  <M>     Mass Storage Gadget 

1.2 编译和生成模块

以上配置保存后,make kernel编译执行后,会生成以下几个关键的内核模块。

        drivers/usb/gadget/libcomposite.ko
        drivers/usb/gadget/legacy/gadgetfs.ko
        drivers/usb/gadget/legacy/g_mass_storage.ko
        drivers/usb/gadget/function/usb_f_mass_storage.ko

二、ARM板Linux系统上U盘模拟

2.1 建立镜像模拟U盘

dd if=/dev/zero of=udisk.img bs=1M count=1600

// 建立一个1.6GB的镜像文件,用于模拟U盘

mkfs.vfat udisk.img

// 将镜像只作为vfat的文件系统,PC可以访问。此处如果不格式化,PC找到U盘后会提示格式化

mkdir /opt/udisk

// 建立U盘镜像文件的挂载点

2.2 Linux下模拟U盘的建立

//将U盘镜像与loop7建立连接,udisk.img放的位置会决定速度
sudo losetup /dev/loop7 udisk.img

//加载gadget和mass storage的模块,并将udisk.img镜像文件模拟为U盘

sudo insmod gadgetfs.ko
sudo insmod libcomposite.ko
sudo insmod usb_f_mass_storage.ko
sudo mount /dev/loop7 /opt/udisk     //挂载U盘
sudo insmod g_mass_storage.ko  file=/dev/loop7 removable=1

如果插着USB线,随着“sudo insmod g_mass_storage.ko  file=/dev/loop7 removable=1”的执行,就可以听到PC电脑“叮咚”的声音,PC机找到了U盘,表示U盘创建成功!

2.3 测试

接下来就可以在PC机上像操作正常U盘一样读写数据了,同时可以在RK3399板的Linux系统下/opt/udisk看到PC机上拷贝到U盘中的内容。

如果镜像文件udisk.img是放在eMMC上,采用USB2.0的线,U盘的写速度大概有3MB左右,稍微有些慢。如果RK3399板卡的内存比较大,可以将udisk.img部署在内存文件系统上,测试速度约32MB左右。

sudo mount -t tmpfs tmpfs /mnt/tmp

上面命令可以建立内存文件系统,只需要将上面的命令序列中的文件udisk.img放到/mnt/tmp下就可以。采用USB 3.0的线的速度,后续测试后在评论中再更新。

注:如果PC机拷贝到U盘中的文件,在ARM的Linux下看不见内容,重新mount一下就可以看到了。如果ARM的Linux下拷贝到udisk里面的内容在PC机上看不到,需要插拔一下USB线就可以看到了。

有什么疑问或者建议,欢迎大家一起探讨。

特别是U盘的速度和性能方面的,如通过速度如何通过OTG口测试USB口是2.0还是3.0等等。

也可以通过USB OTG同时模拟键盘和鼠标,通过一根网线实现远程控制对方的主机。也可以一起探讨更多的USB应用。

<think>好的,我现在要解决的问题是关于RK3399ARM系统下如何启用OTG功能的方法。用户需要具体的配置教程,我需要根据提供的引用内容和相关知识来构建一个清晰的步骤指南。 首先,我需要回忆一下RK3399OTG功能相关配置。OTG(On-The-Go)允许设备作为主机或从设备工作,通常涉及USB控制器的配置。RK3399USB控制器包括USB 3.0和USB 2.0,其中OTG功能可能涉及其中一个控制器的驱动配置。 查看用户提供的引用内容,虽然引用[1]和[2]主要涉及u-boot移植和SD卡系统制作,但可能涉及到内核配置部分,因为启用OTG功能通常需要内核支持。引用[3]提到ADB调试,这可能与USB功能相关,但需要进一步确认。 首先,我需要确定在Linux内核中如何配置OTG。通常,这涉及到设备树的配置和内核驱动的选择。Rockchip的官方Wiki(引用[2]中的链接)可能有相关的文档说明。例如,在设备树中启用相应的USB节点,并设置正确的dr_mode属性为“otg”。 接下来,可能需要配置内核选项,确保USB相关的驱动被正确编译,特别是DWC2或DWC3驱动,具体取决于RK3399使用的USB控制器版本。此外,可能需要配置PHY设置,确保USB物理层正常工作。 另外,uboot的配置也可能影响OTG功能,比如是否在启动时正确初始化USB控制器。引用[1]提到移植u-boot 2017.09,可能需要检查uboot中是否有关于USB初始化的配置,确保OTG控制器在启动阶段被正确设置。 另外,根文件系统的配置(如引用[2]提到的buildroot)可能需要包含相关的USB工具和服务,比如usbmount或udhcpc,以便在OTG模式下正确挂载设备或分配IP地址。 可能还需要检查电源管理配置,确保OTG端口有足够的电源供应,以及在设备作为主机时能够提供电源。 现在,我需要将这些步骤结构化,确保用户能够按照清晰的步骤操作。可能需要分阶段:内核配置、设备树修改、驱动加载、用户空间工具配置等。同时,需要参考Rockchip的官方文档,确保步骤的准确性。 在编写过程中,要确保所有行内数学表达式使用$...$格式,独立公式用$$...$$,并且正确使用LaTeX语法。同时,生成相关问题,帮助用户进一步了解相关主题。 最后,检查引用是否正确,确保引用标识与提供的参考内容对应,并自然地插入到回答中。</think>在RK3399 ARM系统中启用OTG功能需进行内核配置、设备树修改及驱动加载,以下是具体步骤: ### 一、内核配置 1. **启用USB驱动支持** 在内核源码目录执行`make menuconfig`,确保以下选项启用: ``` Device Drivers → USB support → USB Dual Role Support Device Drivers → USB support → DesignWare USB2 DRD Core Support Device Drivers → USB support → Rockchip INNO USB2 PHY Driver ``` 这些选项对应Rockchip的USB控制器和PHY驱动[^2]。 2. **配置OTG模式** 修改设备树文件(如`arch/arm64/boot/dts/rockchip/rk3399.dtsi`),找到USB节点(如`usb0`或`usb1`),设置`dr_mode`属性为`otg`: ```dts &usbdrd3_0 { status = "okay"; dr_mode = "otg"; }; ``` ### 二、设备树调整 1. **PHY配置** 确保USB PHY的电源和时钟配置正确,例如: ```dts &usb_host0_ehci { phys = <&u2phy0_otg>; }; ``` ### 三、用户空间工具 1. **加载内核模块** 确认内核模块`dwc2`或`dwc3`已加载,并检查OTG模式切换: ```bash echo peripheral > /sys/devices/platform/fe800000.usb/dwc3.0.auto/usb_role ``` 2. **ADB调试支持** 若需通过OTG使用ADB,需在buildroot中启用`android-tools`包,并在`/etc/udev/rules.d/`添加ADB规则[^3]。 ### 四、验证OTG功能 1. **硬件连接** 将Type-C接口连接到PC,执行`dmesg | grep usb`查看设备识别日志。 2. **模式切换测试** 使用`usb_role_switch`工具切换主机/从机模式: ```bash usb_role_switch -s host # 切换到主机模式 usb_role_switch -s peripheral # 切换到从机模式 ```
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值