使用USB OTG将瑞芯微RK3399 Linux板模拟为U盘

        现在大量的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应用。

物联沃分享整理
物联沃-IOTWORD物联网 » 使用USB OTG将瑞芯微RK3399 Linux板模拟为U盘

发表评论