本文翻译Documentation/usb/gadget_configfs.txt文档。主要是讲述如何通过configfs
来配置USB Gadget的functions
。注意:这里使用的是配置,也就是要求内核必须存在对应的functions
。与ffs
的差别是,ffs
可以创建一个新的functions
,内核并不要求事先存在。
简介
Linux USB Gadget是一个拥有UDC(USB Device Controller)的设备,该设备可以用于连接到USB Host用于扩展额外的功能,比如串口或者大容量存储(MTP)。Android就是一个支持MTP的USB Gadget。当Android手机插入到电脑中(USB Host),电脑可以识别出一个多媒体设备出来。
USB Host可以通过一些configurations
来识别gadget,configuration
包括多个interfaces
(这里可以理解为USB描述符直接的层级关系)。从gadget的角度来看是functions
,每个fcunction
代表一种功能,比如串口或者SCSI磁盘。
Linux为gadget提供一系列的functions
,在drivers/usb/gadget/function/
目录中定义。
创建gadget意味着决定将使用哪些configurations
,以及每种configurations
将提供的functions
,在这之前是以hardcode的方式在代码中设定的,比如drivers/usb/gadget/legacy/
的gadget都是。
configfs
(请参阅Documentation/filesystems/configfs/*
)非常适合告诉内核有关上述决定的内容。为啥是configfs
呢?因为configfs
支持从用户空间配置内核空间的驱动。反之,sysfs
支持同内核空间export一些对象供用户空间查看。本文档是讲关于如何做到的,以及描述了如何设计将configfs
与usb gadget集成在一起。