现在大量的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应用。
————————————————
版权声明:本文为CSDN博主「鸣睿家多宝」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/stevenqian/article/details/127224086