内核打开对应的宏

1、必须打开CONFIG_CONFIGFS_FSCONFIG_USB_LIBCOMPOSITE的宏,前者为用户空间提供访问配置内核驱动的configfs文件系统,后者提供usb gadget composite框架;
2、必须打开UDC(USB Device Controller)的配置,这个是配置硬件控制器。我这里使用CONFIG_USB_CHIPIDEACONFIG_USB_CHIPIDEA_UDC
3、如果使用mass storage功能,需要打开USB_CONFIGFS_MASS_STORAGEUSB_F_MASS_STORAGE,对应于usb_f_mass_storage.ko驱动。

配置步骤

  • 挂载configfs:mount -t configfs none /config/,在这之后,/configfs/目录下就会生成usb_gadget/目录;
  • 创建gadget:mkdir usb_gadget/g1,创建g1/目录之后,该目录下会生成很多配置目录,这里的g1表示gadget 1,一个UDC对应一个gadget,如果你的SOC上有多个gadget,可以创建多个gx目录。
# ll usb_gadget/g1/
total 0
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 UDC
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 bDeviceClass
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 bDeviceProtocol
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 bDeviceSubClass
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 bMaxPacketSize0
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 bcdDevice
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 bcdUSB
drwxr-xr-x 2 root root    0 1999-11-30 00:02 configs
drwxr-xr-x 2 root root    0 1999-11-30 00:02 functions
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 idProduct
-rw-r--r-- 1 root root 4096 1999-11-30 00:02 idVendor
drwxr-xr-x 2 root root    0 1999-11-30 00:02 os_desc
drwxr-xr-x 2 root root    0 1999-11-30 00:02 strings
  • 配置PID和VID
# echo 0x18d1 > usb_gadget/g1/idVendor
# echo 0x4ee2 > usb_gadget/g1/idProduct
  • 创建并配置string字目录
# mkdir usb_gadget/g1/strings/0x409
# echo "123456789" > usb_gadget/g1/strings/0x409/serialnumber
# echo "xxx" > usb_gadget/g1/strings/0x409/manufacturer
# echo "xxx_product" > usb_gadget/g1/strings/0x409/product
  • 创建configuration和字符串
# mkdir usb_gadget/g1/configs/c.1
# mkdir usb_gadget/g1/configs/c.1/strings/0x409
# echo "mass_storage" > usb_gadget/g1/configs/c.1/strings/0x409/configuration
  • 创建functions
# mkdir usb_gadget/g1/functions/mass_storage.0
[  108.582976]  [1:          mkdir: 1976] Mass Storage Function, version: 2009/09/11
[  108.592679]  [1:          mkdir: 1976] LUN: removable file: (no medium)

这里的mass_storage的名字不能随便起,需要根据insmod的function驱动usb_f_mass_storage.ko来决定。否则会出现如下错误:

1|@android:/config # mkdir usb_gadget/g1/functions/msg.0
mkdir: 'usb_gadget/g1/functions/msg.0': No such file or directory
  • 将functions和configuration关联起来
# ln -s usb_gadget/g1/functions/mass_storage.0 usb_gadget/g1/configs/c.1

上述配置之后,得到的结果为:

127|@android:/config # find .
.
./usb_gadget
./usb_gadget/g1
./usb_gadget/g1/os_desc
./usb_gadget/g1/os_desc/qw_sign
./usb_gadget/g1/os_desc/b_vendor_code
./usb_gadget/g1/os_desc/use
./usb_gadget/g1/strings
./usb_gadget/g1/strings/0x409
./usb_gadget/g1/strings/0x409/serialnumber
./usb_gadget/g1/strings/0x409/product
./usb_gadget/g1/strings/0x409/manufacturer
./usb_gadget/g1/configs
./usb_gadget/g1/configs/c.1
./usb_gadget/g1/configs/c.1/mass_storage.0
./usb_gadget/g1/configs/c.1/strings
./usb_gadget/g1/configs/c.1/strings/0x409
./usb_gadget/g1/configs/c.1/strings/0x409/configuration
./usb_gadget/g1/configs/c.1/bmAttributes
./usb_gadget/g1/configs/c.1/MaxPower
./usb_gadget/g1/functions
./usb_gadget/g1/functions/mass_storage.0
./usb_gadget/g1/functions/mass_storage.0/lun.0
./usb_gadget/g1/functions/mass_storage.0/lun.0/inquiry_string
./usb_gadget/g1/functions/mass_storage.0/lun.0/nofua
./usb_gadget/g1/functions/mass_storage.0/lun.0/cdrom
./usb_gadget/g1/functions/mass_storage.0/lun.0/removable
./usb_gadget/g1/functions/mass_storage.0/lun.0/ro
./usb_gadget/g1/functions/mass_storage.0/lun.0/file
./usb_gadget/g1/functions/mass_storage.0/stall
./usb_gadget/g1/UDC
./usb_gadget/g1/bcdUSB
./usb_gadget/g1/bcdDevice
./usb_gadget/g1/idProduct
./usb_gadget/g1/idVendor
./usb_gadget/g1/bMaxPacketSize0
./usb_gadget/g1/bDeviceProtocol
./usb_gadget/g1/bDeviceSubClass
./usb_gadget/g1/bDeviceClass
  • 查看当前的UDC
    可见当前的板子上有两个UDC,ci_hdrc.0和gadget-cdns3。
130|@android:/config # ll /sys/class/udc/
total 0
lrwxrwxrwx 1 root root 0 1999-11-30 00:09 ci_hdrc.0 -> ../../devices/platform/5b0d0000.usb/ci_hdrc.0/udc/ci_hdrc.0
lrwxrwxrwx 1 root root 0 1999-11-30 00:09 gadget-cdns3 -> ../../devices/platform/5b110000.usb3/gadget-cdns3/udc/gadget-cdns3
  • 绑定到UDC,使能gadget
    将UDC切换至device模式,这里使用OTG ID pin来实现切换。
# echo ci_hdrc.0 > usb_gadget/g1/UDC
# echo 1 > /sys/class/gpio/gpio358/value

验证结果

将配置好的开发板与ubuntu连接,从ubuntu上的串口可以看到如下信息,表示已将开发板配置成一个mass storage的设备了。

[95705.390004] usb 1-11: USB disconnect, device number 28
[95708.606717] usb 1-11: new high-speed USB device number 29 using xhci_hcd
[95708.756934] usb 1-11: New USB device found, idVendor=18d1, idProduct=4ee2
[95708.756941] usb 1-11: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[95708.756946] usb 1-11: Product: xxx_product
[95708.756950] usb 1-11: Manufacturer: xxx
[95708.756953] usb 1-11: SerialNumber: 123456789
[95708.766595] usb-storage 1-11:1.0: USB Mass Storage device detected
[95708.766798] scsi host6: usb-storage 1-11:1.0

当然,上述的结果是ubuntu只识别到一个mass storage的设备,但是没有识别看分区表,所以没有看到相应的磁盘信息。想要看到磁盘信息,可以更进一步的设置mass_storage的backen file属性。

定制分区

在上面创建functions步骤之后,执行以下的命令,为mass storage创建2个分区,分区的backing file是开发板上的/dev/block/mmcblk0p1/dev/block/mmcblk0p2,也就是开发板上的system分区和data分区。

mkdir usb_gadget/g1/functions/mass_storage.0/partition.2
mkdir usb_gadget/g1/functions/mass_storage.0/lun.1
echo /dev/block/mmcblk0p1 > usb_gadget/g1/functions/mass_storage.0/lun.0/file
echo /dev/block/mmcblk0p2 > usb_gadget/g1/functions/mass_storage.0/lun.1/file

所有配置完成之后,插入到ubuntu后,可以看到能识别去新的分区信息:

130 victor@victor-HP:/mnt⟫ sudo dmesg -c
[40873.009026] EXT4-fs (sdc): mounted filesystem with ordered data mode. Opts: (null)
[41094.127318] usb 1-11: USB disconnect, device number 23
[41094.128072] print_req_error: I/O error, dev sdc, sector 0
[41094.131049] sd 6:0:0:0: [sdc] Synchronizing SCSI cache
[41094.131118] sd 6:0:0:0: [sdc] Synchronize Cache(10) failed: Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
[41466.480635] usb 1-11: new high-speed USB device number 24 using xhci_hcd
[41466.630904] usb 1-11: New USB device found, idVendor=18d1, idProduct=4ee2
[41466.630911] usb 1-11: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[41466.630915] usb 1-11: Product: xxx_product
[41466.630919] usb 1-11: Manufacturer: xxx
[41466.630923] usb 1-11: SerialNumber: 123456789
[41466.640789] usb-storage 1-11:1.0: USB Mass Storage device detected
[41466.641062] scsi host7: usb-storage 1-11:1.0
[41467.645699] scsi 7:0:0:0: Direct-Access     Linux    File-Stor Gadget 0414 PQ: 0 ANSI: 2
[41467.646291] scsi 7:0:0:1: Direct-Access     Linux    File-Stor Gadget 0414 PQ: 0 ANSI: 2
[41467.646826] scsi 7:0:0:2: Direct-Access     Linux    File-Stor Gadget 0414 PQ: 0 ANSI: 2
[41467.647387] sd 7:0:0:0: Attached scsi generic sg2 type 0
[41467.647764] sd 7:0:0:1: Attached scsi generic sg3 type 0
[41467.648144] sd 7:0:0:0: Power-on or device reset occurred
[41467.648173] sd 7:0:0:2: Attached scsi generic sg4 type 0
[41467.649026] sd 7:0:0:1: Power-on or device reset occurred
[41467.649555] sd 7:0:0:2: Power-on or device reset occurred
[41467.650006] sd 7:0:0:0: [sdd] 1048576 512-byte logical blocks: (537 MB/512 MiB)
[41467.650766] sd 7:0:0:1: [sde] 524288 512-byte logical blocks: (268 MB/256 MiB)
[41467.651726] sd 7:0:0:0: [sdd] Write Protect is off
[41467.651731] sd 7:0:0:0: [sdd] Mode Sense: 0f 00 00 00
[41467.651929] sd 7:0:0:1: [sde] Write Protect is off
[41467.651933] sd 7:0:0:1: [sde] Mode Sense: 0f 00 00 00
[41467.652327] sd 7:0:0:2: [sdf] Attached SCSI removable disk
[41467.652581] sd 7:0:0:0: [sdd] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[41467.652837] sd 7:0:0:1: [sde] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[41467.673305] sd 7:0:0:1: [sde] Attached SCSI removable disk
[41467.674915] sd 7:0:0:0: [sdd] Attached SCSI removable disk

参考

上述的配置过程太繁琐了,在Android上,基于configfs有专门的init.rc在启动过程中去配置对应的configurationfunction,比如说init.usb.rc,里面包含了一系列gadget的配置方法。在后面的文章中,将详细讲述每条命令背后的实现原理。

on bootwrite /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}setprop sys.usb.configfs 1# OS DESCRIPTORS#===============# OS STRING#----------write /config/usb_gadget/g1/os_desc/b_vendor_code 1write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"# use os desc or not is up to each usb functions respectively# write /config/usb_gadget/g1/os_desc/use 1# MAKE b.1 THE ONE ASSOCIATED WITH OS DESCRIPTORS#------------------------------------------------symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b1# ci_hdrc.0 is the fixed UDC namesetprop sys.usb.controller ci_hdrc.0on fsmkdir /dev/usb-ffs 0770 shell shellmkdir /dev/usb-ffs/adb 0770 shell shell# mount the configfs on /configmount configfs none /config mode=0755mkdir /config/usb_gadget/g1mkdir /config/usb_gadget/g1/configs/b.1# mkdir for functions needed# this will call each gadget's alloc_inst()mkdir /config/usb_gadget/g1/functions/ffs.adbmkdir /config/usb_gadget/g1/functions/mtp.gs0mkdir /config/usb_gadget/g1/functions/ptp.gs1mkdir /config/usb_gadget/g1/functions/accessory.gs2mkdir /config/usb_gadget/g1/functions/audio_source.gs3mkdir /config/usb_gadget/g1/functions/rndis.gs4mkdir /config/usb_gadget/g1/functions/midi.gs5mkdir /config/usb_gadget/g1/strings/0x409mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409# The mount of functionfs for adb must be put AFTER the mkdir for functions in configfson property:sys.usb.config=none && property:sys.usb.configfs=1write /config/usb_gadget/g1/os_desc/use 0on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1write /config/usb_gadget/g1/idProduct 0x4ee7write /config/usb_gadget/g1/idVendor 0x18d1on property:sys.usb.config=mtp && property:sys.usb.configfs=1write /config/usb_gadget/g1/functions/mtp.gs0/os_desc/interface.MTP/compatible_id "MTP"write /config/usb_gadget/g1/os_desc/use 1write /config/usb_gadget/g1/idProduct 0x4ee1write /config/usb_gadget/g1/idVendor 0x18d1

usb gadget configfs 验证相关推荐

  1. linux/android系统的USB gadget configfs用户空间配置USB HID U盘 adb dcd等模式的使用

    USB gadget configfs模式的使用: 即可android或linux在用户空间配置实现设备终端为HID,U盘.Adb以及cdc等功能 1.创建gadgets 每个gadget都必须创建自 ...

  2. USB总线-Linux内核USB3.0设备控制器复合设备之USB gadget configfs分析(七)

    1.简介 configfs是基于ram的文件系统,与sysfs的功能有所不同.sysfs是基于文件系统的kernel对象视图,虽然某些属性允许用户读写,但对象是在kernel中创建.注册.销毁,由ke ...

  3. android usb_disk2,Android USB gadget configfs学习笔记总结

    1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁.属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件.与sysfs一样,read ...

  4. linux usb gadget u盘,LINUX USB gadget

    Linux 3.0新的USB gadget configfs.c驱动的用法如下所示: 挂载configfs文件系统: # mount -t configfs none /sys/kernel/conf ...

  5. 【OpenHarmony】usb gadget 配置hdc功能cfg文件解读

    文章目录 一.创建设备 二.创建配置 三.创建功能 四.将功能和对应的配置关联起来 挂载functionfs文件系统 五.使能该设备 六.去使能该设备 七.清除 实现设计 参考资料 cfg文件所在路径 ...

  6. USB Gadget iMX6U LL开发板模拟U盘

    IMX6ULL开发板模拟U盘 Linux版本:4.1.15 使用开发板:IMX6ULL 编译环境:Ubuntu 14.04 步骤如下: 1. 首先配置内核 进入 Device Drivers ---& ...

  7. linux 开发板模拟u盘,linux 开发板(Linux USB Gadget) 模拟u盘

    前几天,搞了 hid设备,通过usb hid设备和windows进行通信.现在开始搞这个 mass storge 首先说明 环境:linux版本:3.15        使用开发板:SAMa5d3   ...

  8. linux 开发板模拟u盘,ARM-Linux开发 - USB Gadget Storage 制作模拟U盘

    -------------转载-------------- 作者:yimiyangguang1314 来源:CSDN 原文:https://blog.csdn.net/yimiyangguang131 ...

  9. linux usb gadget驱动详解(一)

    由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...

最新文章

  1. 你的声音作为一种“武器”:人类战争中声学活动
  2. 时间:2014年3月27日文件和目录操作函数
  3. 鸟哥的Linux私房菜(基础篇)- 第六章、Linux 的文件权限与目录配置
  4. CapsLock Enhancement via AutoHotKey
  5. eshop.sql(复制的时候注意路径!!!)
  6. intel编译器_试试吧!用 Go 写一个即时编译器(JIT)
  7. 【区块链】区块链技术指南
  8. mysql 个版本区别_MySQL各个版本区别
  9. ctfmon是什么启动项_win7启动项没有ctfmon.exe的解决方法
  10. python3分解质因数_python3 分解质因数
  11. 期货市场十赌九输,钱都去哪里了?
  12. python判断一个字符串在数组中的位置
  13. matlab2010 notebook,Matlab在Win10 64位下用notebook的问题
  14. 使用EasyExcel下载,文件名乱码问题处理
  15. 出现身份验证错误,要求的函数不受支持(这可能是由于CredSSP加密Oracle修正)
  16. Java航班预订统计leetcode_1109
  17. uniapp Android11及以上系统的手机需要使用FileProvider方式分享
  18. [TextMatch框架] 简介
  19. [Python]HTML转换为TXT的脚本
  20. 因为锁的问题,我们被扣了1万

热门文章

  1. 关于centos vi 和 vim
  2. 从零开始建设Discuz论坛
  3. Kinect V2 + PCL 实现地方体目标的体积测量(附代码)
  4. 【数字视频技术介绍】| 编码中的时间冗余和空间冗余
  5. 有孚专有云如何助力高校数智化转型
  6. MySQL面试题(总结最全面的面试题)
  7. HTTP的Referrer Policy
  8. FA-DDP叶酸磁性纳米颗粒载顺铂/E100-DDP 姜黄素修饰顺铂
  9. flink部署yarn错误:Couldn‘t deploy Yarn session cluster
  10. MySQL燕十八老师课程笔记:第十九课:事务