• OTG 配置为U盘


    目录

    硬件环境及目标

    配置脚本

       问题1 ,创建g1 目录失败

        问题1 的解决

    问题2 ,目录不存在

    访问存储卡

    综述


       

    网上很多资料介绍通过configfs将OTG 口配置为U盘的资料,本文记录实际操作及遇到的问题。

       

    硬件环境及目标

     硬件基本结构如下图。

    期望PC可以访问 存储卡。

     

    配置脚本

    1. #!/bin/sh
    2. mount -t configfs none /sys/kernel/config
    3. cd /sys/kernel/config/usb_gadget
    4. mkdir g1
    5. cd g1
    6. echo 0x18d1 > idVendor
    7. echo 0x4ee2 > idProduct
    8. mkdir strings/0x409
    9. #echo "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" > strings/0x409/serialnumber
    10. echo "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" > strings/0x409/serialnumber
    11. echo "shoniba" > strings/0x409/manufacturer
    12. echo "Mass Storage" > strings/0x409/product
    13. mkdir configs/c.1
    14. mkdir configs/c.1/strings/0x409
    15. echo "mass_storage" > configs/c.1/strings/0x409/configuration
    16. mkdir functions/mass_storage.0
    17. echo "/dev/mmcblk2p7" > functions/mass_storage.0/lun.0/file
    18. #echo "/oem/vfat.img" > functions/mass_storage.0/lun.0/file
    19. ln -s functions/mass_storage.0 configs/c.1
    20. ls /sys/class/udc > UDC

       第一行 mount configfs,即通过configfs完成对OTG功能的配置,挂载此文件系统后,在/sys/kernel/config目录下就会出现 usb_gadget目录。

       问题1 ,创建g1 目录失败

          在运行 上述脚本,创建目录g1时,报如下错误,根据信息提示,我们猜测,在usb_gadget目录下已经存在一个目录的情况下,不能再次创建目录

    1. [root@rk1808:/sys/kernel/config/usb_gadget]# mkdir -m 0770 g1 (报错,抛栈异常)
    2. [ 1193.993072] sysfs: cannot create duplicate filename '/devices/virtual/android_usb/android0'
    3. [ 1193.993166] ------------[ cut here ]------------
    4. [ 1193.993200] WARNING: at fs/sysfs/dir.c:31
    5. [ 1193.993218] Modmkdir: cannot create directory 'g1': Cannot allocate memory
    6. ules link[root@rk1808:/sys/kernel/config/usb_gadget]# ed in: bcmdhd galcore(O)
    7. [ 1193.993262]
    8. [ 1193.993295] CPU: 0 PID: 696 Comm: mkdir Tainted: G W O 4.4.194 #19
    9. [ 1193.993315] Hardware name: Rockchip RK1808 EVB V10 Board (DT)
    10. [ 1193.993341] task: ffffffc075afe0c0 task.stack: ffffffc07c034000
    11. [ 1193.993376] PC is at sysfs_warn_dup+0x58/0x7c
    12. [ 1193.993412] LR is at sysfs_warn_dup+0x58/0x7c
    13. [ 1193.993436] pc : [<ffffff800819f10c>] lr : [<ffffff800819f10c>] pstate: 00000145
    14. [ 1193.993455] sp : ffffffc07c037ac0
    15. [ 1193.993474] x29: ffffffc07c037ac0 x28: 0000000000000000

      而我们的确看到在 usb_gadget目录下存在一个目录: rockchip

        问题1 的解决

           在/etc/init.d目录下存在 USB configfs的配置文件,分别为: 

          .usb_config和S50usbdevices

    •      其中第一个文件控制OTG接口作为什么功能,例如UMS,即U盘,ADB、UVC等等。
    •     第二个文件 功能类似本节开始处的脚本,即通过configfs配置各种具体的功能。各个功能是互斥的。

        对于问题1的解决,由于前期我们猜测是由于 usb_gadget已经存在一个目录,因而我们将.usb_config中的usb_adb_en改成一个不存在的功能,例如usb_xxx_en。然后重启。

         此时再查看 mount信息,configfs已经没有被挂载。于是手动挂载后,通过  mkdir g1可以创建目录了。

           由此实验证实了我们的猜想: 即在usb_gadget目录下不能创建多个目录。

    问题2 ,目录不存在

    当脚本运行到  mkdir functions/mass_storage.0 时,一直提示:

    mkdir: cannot create directory 'mass_massage.0': No such file or directory

    重新编译内核,增加内核选项

     

     

        

    cat .config |grep -i mass

    CONFIG_USB_F_MASS_STORAGE=y

    CONFIG_USB_CONFIGFS_MASS_STORAGE=y

    CONFIG_USB_MASS_STORAGE is not set

    采用新内核后,可以正常创建mass_storage.0目录了。

    此时脚本全部运行完毕,我们在PC上可以看到一个盘符了!

    访问存储卡

    1. lsscsi
    2. [3:0:0:0] disk ATA 2.5" SATA SSD 3M 225 /dev/sda
    3. [4:0:0:0] disk Linux File-Stor Gadget 0404 /dev/sdb

        运行完第二章的脚本后,在PC上通过lsscsi命令可以看到多了一个盘符/dev/sdb,类型是file-stor gadget。这个就是我们要访问的存储卡。

       但是此/dev/sdb设备即不能被mount 也不能发disk分区,导致不能使用。

        究其原因,因为我们脚本中 对于/dev/sdb的分区   mmcblk2p7,文件系统格式为ext2导致,将此分区重新格式化成ext4 或者vfat,则可以被PC正常访问了。

        

    1. mkfs.ext3 /dev/mmcblk2p7
    2. mke2fs 1.43.9 (8-Feb-2018)
    3. /dev/mmcblk2p7 contains a ext2 file system labelled 'oem'
    4. last mounted on /oem on Sat Aug 5 12:25:21 2017
    5. Proceed anyway? (y,N) y
    6. Discarding device blocks: done
    7. Creating filesystem with 65536 1k blocks and 16384 inodes
    8. Filesystem UUID: 2a1152f9-4ffe-4040-abf5-49aca7b9fe7c
    9. Superblock backups stored on blocks:
    10. 8193, 24577, 40961, 57345
    11. Allocating group tables: done
    12. Writing inode tables: done
    13. Creating journal (4096 blocks): done
    14. Writing superblocks and filesystem accounting information: done

    格式化成vfat

    1. mkfs.vfat /dev/mmcblk2p7
    2. mkfs.fat 4.1 (2017-01-24)

    综述

       configfs的强大及灵活显而易见,而在应用过程中遇到的问题,需要对内核进一步了解才更容易解决。

  • 相关阅读:
    修改a-rate评分颜色;a-rate评分十分制
    实用!Python大型Excel文件处理:快速导入、导出与批量处理
    硬盘分哪几种类型及主要参数详解
    [附源码]计算机毕业设计JAVA小超市进销存管理系统
    RPA机器人维护的3个注意点
    Ghostscript 在 Linux 和 Windows 系统的应用与问题解决
    云原生服务无状态(Stateless)特性的实现
    Pod的调度机制
    STP介绍
    线性回归实现
  • 原文地址:https://blog.csdn.net/proware/article/details/127971909