1ecefae6dSMauro Carvalho Chehab============================================ 2ecefae6dSMauro Carvalho ChehabLinux USB gadget configured through configfs 3ecefae6dSMauro Carvalho Chehab============================================ 4ecefae6dSMauro Carvalho Chehab 5ecefae6dSMauro Carvalho Chehab 6ecefae6dSMauro Carvalho Chehab25th April 2013 7ecefae6dSMauro Carvalho Chehab 8ecefae6dSMauro Carvalho Chehab 9ecefae6dSMauro Carvalho Chehab 10ecefae6dSMauro Carvalho Chehab 11ecefae6dSMauro Carvalho ChehabOverview 12ecefae6dSMauro Carvalho Chehab======== 13ecefae6dSMauro Carvalho Chehab 14ecefae6dSMauro Carvalho ChehabA USB Linux Gadget is a device which has a UDC (USB Device Controller) and can 15ecefae6dSMauro Carvalho Chehabbe connected to a USB Host to extend it with additional functions like a serial 16ecefae6dSMauro Carvalho Chehabport or a mass storage capability. 17ecefae6dSMauro Carvalho Chehab 18ecefae6dSMauro Carvalho ChehabA gadget is seen by its host as a set of configurations, each of which contains 19ecefae6dSMauro Carvalho Chehaba number of interfaces which, from the gadget's perspective, are known as 20ecefae6dSMauro Carvalho Chehabfunctions, each function representing e.g. a serial connection or a SCSI disk. 21ecefae6dSMauro Carvalho Chehab 22ecefae6dSMauro Carvalho ChehabLinux provides a number of functions for gadgets to use. 23ecefae6dSMauro Carvalho Chehab 24ecefae6dSMauro Carvalho ChehabCreating a gadget means deciding what configurations there will be 25ecefae6dSMauro Carvalho Chehaband which functions each configuration will provide. 26ecefae6dSMauro Carvalho Chehab 2798264991SMauro Carvalho ChehabConfigfs (please see `Documentation/filesystems/configfs.rst`) lends itself nicely 28ecefae6dSMauro Carvalho Chehabfor the purpose of telling the kernel about the above mentioned decision. 29ecefae6dSMauro Carvalho ChehabThis document is about how to do it. 30ecefae6dSMauro Carvalho Chehab 31ecefae6dSMauro Carvalho ChehabIt also describes how configfs integration into gadget is designed. 32ecefae6dSMauro Carvalho Chehab 33ecefae6dSMauro Carvalho Chehab 34ecefae6dSMauro Carvalho Chehab 35ecefae6dSMauro Carvalho Chehab 36ecefae6dSMauro Carvalho ChehabRequirements 37ecefae6dSMauro Carvalho Chehab============ 38ecefae6dSMauro Carvalho Chehab 39ecefae6dSMauro Carvalho ChehabIn order for this to work configfs must be available, so CONFIGFS_FS must be 40ecefae6dSMauro Carvalho Chehab'y' or 'm' in .config. As of this writing USB_LIBCOMPOSITE selects CONFIGFS_FS. 41ecefae6dSMauro Carvalho Chehab 42ecefae6dSMauro Carvalho Chehab 43ecefae6dSMauro Carvalho Chehab 44ecefae6dSMauro Carvalho Chehab 45ecefae6dSMauro Carvalho ChehabUsage 46ecefae6dSMauro Carvalho Chehab===== 47ecefae6dSMauro Carvalho Chehab 48ecefae6dSMauro Carvalho Chehab(The original post describing the first function 49ecefae6dSMauro Carvalho Chehabmade available through configfs can be seen here: 50ecefae6dSMauro Carvalho Chehabhttp://www.spinics.net/lists/linux-usb/msg76388.html) 51ecefae6dSMauro Carvalho Chehab 52ecefae6dSMauro Carvalho Chehab:: 53ecefae6dSMauro Carvalho Chehab 54ecefae6dSMauro Carvalho Chehab $ modprobe libcomposite 55ecefae6dSMauro Carvalho Chehab $ mount none $CONFIGFS_HOME -t configfs 56ecefae6dSMauro Carvalho Chehab 57ecefae6dSMauro Carvalho Chehabwhere CONFIGFS_HOME is the mount point for configfs 58ecefae6dSMauro Carvalho Chehab 59ecefae6dSMauro Carvalho Chehab1. Creating the gadgets 60ecefae6dSMauro Carvalho Chehab----------------------- 61ecefae6dSMauro Carvalho Chehab 62ecefae6dSMauro Carvalho ChehabFor each gadget to be created its corresponding directory must be created:: 63ecefae6dSMauro Carvalho Chehab 64ecefae6dSMauro Carvalho Chehab $ mkdir $CONFIGFS_HOME/usb_gadget/<gadget name> 65ecefae6dSMauro Carvalho Chehab 66ecefae6dSMauro Carvalho Chehabe.g.:: 67ecefae6dSMauro Carvalho Chehab 68ecefae6dSMauro Carvalho Chehab $ mkdir $CONFIGFS_HOME/usb_gadget/g1 69ecefae6dSMauro Carvalho Chehab 70ecefae6dSMauro Carvalho Chehab ... 71ecefae6dSMauro Carvalho Chehab ... 72ecefae6dSMauro Carvalho Chehab ... 73ecefae6dSMauro Carvalho Chehab 74ecefae6dSMauro Carvalho Chehab $ cd $CONFIGFS_HOME/usb_gadget/g1 75ecefae6dSMauro Carvalho Chehab 76ecefae6dSMauro Carvalho ChehabEach gadget needs to have its vendor id <VID> and product id <PID> specified:: 77ecefae6dSMauro Carvalho Chehab 78ecefae6dSMauro Carvalho Chehab $ echo <VID> > idVendor 79ecefae6dSMauro Carvalho Chehab $ echo <PID> > idProduct 80ecefae6dSMauro Carvalho Chehab 81ecefae6dSMauro Carvalho ChehabA gadget also needs its serial number, manufacturer and product strings. 82ecefae6dSMauro Carvalho ChehabIn order to have a place to store them, a strings subdirectory must be created 83ecefae6dSMauro Carvalho Chehabfor each language, e.g.:: 84ecefae6dSMauro Carvalho Chehab 85ecefae6dSMauro Carvalho Chehab $ mkdir strings/0x409 86ecefae6dSMauro Carvalho Chehab 87ecefae6dSMauro Carvalho ChehabThen the strings can be specified:: 88ecefae6dSMauro Carvalho Chehab 89ecefae6dSMauro Carvalho Chehab $ echo <serial number> > strings/0x409/serialnumber 90ecefae6dSMauro Carvalho Chehab $ echo <manufacturer> > strings/0x409/manufacturer 91ecefae6dSMauro Carvalho Chehab $ echo <product> > strings/0x409/product 92ecefae6dSMauro Carvalho Chehab 93ecefae6dSMauro Carvalho Chehab2. Creating the configurations 94ecefae6dSMauro Carvalho Chehab------------------------------ 95ecefae6dSMauro Carvalho Chehab 96ecefae6dSMauro Carvalho ChehabEach gadget will consist of a number of configurations, their corresponding 97ecefae6dSMauro Carvalho Chehabdirectories must be created: 98ecefae6dSMauro Carvalho Chehab 99ecefae6dSMauro Carvalho Chehab$ mkdir configs/<name>.<number> 100ecefae6dSMauro Carvalho Chehab 101ecefae6dSMauro Carvalho Chehabwhere <name> can be any string which is legal in a filesystem and the 102ecefae6dSMauro Carvalho Chehab<number> is the configuration's number, e.g.:: 103ecefae6dSMauro Carvalho Chehab 104ecefae6dSMauro Carvalho Chehab $ mkdir configs/c.1 105ecefae6dSMauro Carvalho Chehab 106ecefae6dSMauro Carvalho Chehab ... 107ecefae6dSMauro Carvalho Chehab ... 108ecefae6dSMauro Carvalho Chehab ... 109ecefae6dSMauro Carvalho Chehab 110ecefae6dSMauro Carvalho ChehabEach configuration also needs its strings, so a subdirectory must be created 111ecefae6dSMauro Carvalho Chehabfor each language, e.g.:: 112ecefae6dSMauro Carvalho Chehab 113ecefae6dSMauro Carvalho Chehab $ mkdir configs/c.1/strings/0x409 114ecefae6dSMauro Carvalho Chehab 115ecefae6dSMauro Carvalho ChehabThen the configuration string can be specified:: 116ecefae6dSMauro Carvalho Chehab 117ecefae6dSMauro Carvalho Chehab $ echo <configuration> > configs/c.1/strings/0x409/configuration 118ecefae6dSMauro Carvalho Chehab 119ecefae6dSMauro Carvalho ChehabSome attributes can also be set for a configuration, e.g.:: 120ecefae6dSMauro Carvalho Chehab 121ecefae6dSMauro Carvalho Chehab $ echo 120 > configs/c.1/MaxPower 122ecefae6dSMauro Carvalho Chehab 123ecefae6dSMauro Carvalho Chehab3. Creating the functions 124ecefae6dSMauro Carvalho Chehab------------------------- 125ecefae6dSMauro Carvalho Chehab 126ecefae6dSMauro Carvalho ChehabThe gadget will provide some functions, for each function its corresponding 127ecefae6dSMauro Carvalho Chehabdirectory must be created:: 128ecefae6dSMauro Carvalho Chehab 129ecefae6dSMauro Carvalho Chehab $ mkdir functions/<name>.<instance name> 130ecefae6dSMauro Carvalho Chehab 131ecefae6dSMauro Carvalho Chehabwhere <name> corresponds to one of allowed function names and instance name 132ecefae6dSMauro Carvalho Chehabis an arbitrary string allowed in a filesystem, e.g.:: 133ecefae6dSMauro Carvalho Chehab 134ecefae6dSMauro Carvalho Chehab $ mkdir functions/ncm.usb0 # usb_f_ncm.ko gets loaded with request_module() 135ecefae6dSMauro Carvalho Chehab 136ecefae6dSMauro Carvalho Chehab ... 137ecefae6dSMauro Carvalho Chehab ... 138ecefae6dSMauro Carvalho Chehab ... 139ecefae6dSMauro Carvalho Chehab 140ecefae6dSMauro Carvalho ChehabEach function provides its specific set of attributes, with either read-only 141ecefae6dSMauro Carvalho Chehabor read-write access. Where applicable they need to be written to as 142ecefae6dSMauro Carvalho Chehabappropriate. 143*f7529785SWei Ming ChenPlease refer to Documentation/ABI/testing/configfs-usb-gadget for more information. 144ecefae6dSMauro Carvalho Chehab 145ecefae6dSMauro Carvalho Chehab4. Associating the functions with their configurations 146ecefae6dSMauro Carvalho Chehab------------------------------------------------------ 147ecefae6dSMauro Carvalho Chehab 148ecefae6dSMauro Carvalho ChehabAt this moment a number of gadgets is created, each of which has a number of 149ecefae6dSMauro Carvalho Chehabconfigurations specified and a number of functions available. What remains 150ecefae6dSMauro Carvalho Chehabis specifying which function is available in which configuration (the same 151ecefae6dSMauro Carvalho Chehabfunction can be used in multiple configurations). This is achieved with 152ecefae6dSMauro Carvalho Chehabcreating symbolic links:: 153ecefae6dSMauro Carvalho Chehab 154ecefae6dSMauro Carvalho Chehab $ ln -s functions/<name>.<instance name> configs/<name>.<number> 155ecefae6dSMauro Carvalho Chehab 156ecefae6dSMauro Carvalho Chehabe.g.:: 157ecefae6dSMauro Carvalho Chehab 158ecefae6dSMauro Carvalho Chehab $ ln -s functions/ncm.usb0 configs/c.1 159ecefae6dSMauro Carvalho Chehab 160ecefae6dSMauro Carvalho Chehab ... 161ecefae6dSMauro Carvalho Chehab ... 162ecefae6dSMauro Carvalho Chehab ... 163ecefae6dSMauro Carvalho Chehab 164ecefae6dSMauro Carvalho Chehab5. Enabling the gadget 165ecefae6dSMauro Carvalho Chehab---------------------- 166ecefae6dSMauro Carvalho Chehab 167ecefae6dSMauro Carvalho ChehabAll the above steps serve the purpose of composing the gadget of 168ecefae6dSMauro Carvalho Chehabconfigurations and functions. 169ecefae6dSMauro Carvalho Chehab 170ecefae6dSMauro Carvalho ChehabAn example directory structure might look like this:: 171ecefae6dSMauro Carvalho Chehab 172ecefae6dSMauro Carvalho Chehab . 173ecefae6dSMauro Carvalho Chehab ./strings 174ecefae6dSMauro Carvalho Chehab ./strings/0x409 175ecefae6dSMauro Carvalho Chehab ./strings/0x409/serialnumber 176ecefae6dSMauro Carvalho Chehab ./strings/0x409/product 177ecefae6dSMauro Carvalho Chehab ./strings/0x409/manufacturer 178ecefae6dSMauro Carvalho Chehab ./configs 179ecefae6dSMauro Carvalho Chehab ./configs/c.1 180ecefae6dSMauro Carvalho Chehab ./configs/c.1/ncm.usb0 -> ../../../../usb_gadget/g1/functions/ncm.usb0 181ecefae6dSMauro Carvalho Chehab ./configs/c.1/strings 182ecefae6dSMauro Carvalho Chehab ./configs/c.1/strings/0x409 183ecefae6dSMauro Carvalho Chehab ./configs/c.1/strings/0x409/configuration 184ecefae6dSMauro Carvalho Chehab ./configs/c.1/bmAttributes 185ecefae6dSMauro Carvalho Chehab ./configs/c.1/MaxPower 186ecefae6dSMauro Carvalho Chehab ./functions 187ecefae6dSMauro Carvalho Chehab ./functions/ncm.usb0 188ecefae6dSMauro Carvalho Chehab ./functions/ncm.usb0/ifname 189ecefae6dSMauro Carvalho Chehab ./functions/ncm.usb0/qmult 190ecefae6dSMauro Carvalho Chehab ./functions/ncm.usb0/host_addr 191ecefae6dSMauro Carvalho Chehab ./functions/ncm.usb0/dev_addr 192ecefae6dSMauro Carvalho Chehab ./UDC 193ecefae6dSMauro Carvalho Chehab ./bcdUSB 194ecefae6dSMauro Carvalho Chehab ./bcdDevice 195ecefae6dSMauro Carvalho Chehab ./idProduct 196ecefae6dSMauro Carvalho Chehab ./idVendor 197ecefae6dSMauro Carvalho Chehab ./bMaxPacketSize0 198ecefae6dSMauro Carvalho Chehab ./bDeviceProtocol 199ecefae6dSMauro Carvalho Chehab ./bDeviceSubClass 200ecefae6dSMauro Carvalho Chehab ./bDeviceClass 201ecefae6dSMauro Carvalho Chehab 202ecefae6dSMauro Carvalho Chehab 203ecefae6dSMauro Carvalho ChehabSuch a gadget must be finally enabled so that the USB host can enumerate it. 204ecefae6dSMauro Carvalho Chehab 205ecefae6dSMauro Carvalho ChehabIn order to enable the gadget it must be bound to a UDC (USB Device 206ecefae6dSMauro Carvalho ChehabController):: 207ecefae6dSMauro Carvalho Chehab 208ecefae6dSMauro Carvalho Chehab $ echo <udc name> > UDC 209ecefae6dSMauro Carvalho Chehab 210ecefae6dSMauro Carvalho Chehabwhere <udc name> is one of those found in /sys/class/udc/* 211ecefae6dSMauro Carvalho Chehabe.g.:: 212ecefae6dSMauro Carvalho Chehab 213ecefae6dSMauro Carvalho Chehab $ echo s3c-hsotg > UDC 214ecefae6dSMauro Carvalho Chehab 215ecefae6dSMauro Carvalho Chehab 216ecefae6dSMauro Carvalho Chehab6. Disabling the gadget 217ecefae6dSMauro Carvalho Chehab----------------------- 218ecefae6dSMauro Carvalho Chehab 219ecefae6dSMauro Carvalho Chehab:: 220ecefae6dSMauro Carvalho Chehab 221ecefae6dSMauro Carvalho Chehab $ echo "" > UDC 222ecefae6dSMauro Carvalho Chehab 223ecefae6dSMauro Carvalho Chehab7. Cleaning up 224ecefae6dSMauro Carvalho Chehab-------------- 225ecefae6dSMauro Carvalho Chehab 226ecefae6dSMauro Carvalho ChehabRemove functions from configurations:: 227ecefae6dSMauro Carvalho Chehab 228ecefae6dSMauro Carvalho Chehab $ rm configs/<config name>.<number>/<function> 229ecefae6dSMauro Carvalho Chehab 230ecefae6dSMauro Carvalho Chehabwhere <config name>.<number> specify the configuration and <function> is 231ecefae6dSMauro Carvalho Chehaba symlink to a function being removed from the configuration, e.g.:: 232ecefae6dSMauro Carvalho Chehab 233ecefae6dSMauro Carvalho Chehab $ rm configs/c.1/ncm.usb0 234ecefae6dSMauro Carvalho Chehab 235ecefae6dSMauro Carvalho Chehab ... 236ecefae6dSMauro Carvalho Chehab ... 237ecefae6dSMauro Carvalho Chehab ... 238ecefae6dSMauro Carvalho Chehab 239ecefae6dSMauro Carvalho ChehabRemove strings directories in configurations: 240ecefae6dSMauro Carvalho Chehab 241ecefae6dSMauro Carvalho Chehab $ rmdir configs/<config name>.<number>/strings/<lang> 242ecefae6dSMauro Carvalho Chehab 243ecefae6dSMauro Carvalho Chehabe.g.:: 244ecefae6dSMauro Carvalho Chehab 245ecefae6dSMauro Carvalho Chehab $ rmdir configs/c.1/strings/0x409 246ecefae6dSMauro Carvalho Chehab 247ecefae6dSMauro Carvalho Chehab ... 248ecefae6dSMauro Carvalho Chehab ... 249ecefae6dSMauro Carvalho Chehab ... 250ecefae6dSMauro Carvalho Chehab 251ecefae6dSMauro Carvalho Chehaband remove the configurations:: 252ecefae6dSMauro Carvalho Chehab 253ecefae6dSMauro Carvalho Chehab $ rmdir configs/<config name>.<number> 254ecefae6dSMauro Carvalho Chehab 255ecefae6dSMauro Carvalho Chehabe.g.:: 256ecefae6dSMauro Carvalho Chehab 257ecefae6dSMauro Carvalho Chehab rmdir configs/c.1 258ecefae6dSMauro Carvalho Chehab 259ecefae6dSMauro Carvalho Chehab ... 260ecefae6dSMauro Carvalho Chehab ... 261ecefae6dSMauro Carvalho Chehab ... 262ecefae6dSMauro Carvalho Chehab 263ecefae6dSMauro Carvalho ChehabRemove functions (function modules are not unloaded, though): 264ecefae6dSMauro Carvalho Chehab 265ecefae6dSMauro Carvalho Chehab $ rmdir functions/<name>.<instance name> 266ecefae6dSMauro Carvalho Chehab 267ecefae6dSMauro Carvalho Chehabe.g.:: 268ecefae6dSMauro Carvalho Chehab 269ecefae6dSMauro Carvalho Chehab $ rmdir functions/ncm.usb0 270ecefae6dSMauro Carvalho Chehab 271ecefae6dSMauro Carvalho Chehab ... 272ecefae6dSMauro Carvalho Chehab ... 273ecefae6dSMauro Carvalho Chehab ... 274ecefae6dSMauro Carvalho Chehab 275ecefae6dSMauro Carvalho ChehabRemove strings directories in the gadget:: 276ecefae6dSMauro Carvalho Chehab 277ecefae6dSMauro Carvalho Chehab $ rmdir strings/<lang> 278ecefae6dSMauro Carvalho Chehab 279ecefae6dSMauro Carvalho Chehabe.g.:: 280ecefae6dSMauro Carvalho Chehab 281ecefae6dSMauro Carvalho Chehab $ rmdir strings/0x409 282ecefae6dSMauro Carvalho Chehab 283ecefae6dSMauro Carvalho Chehaband finally remove the gadget:: 284ecefae6dSMauro Carvalho Chehab 285ecefae6dSMauro Carvalho Chehab $ cd .. 286ecefae6dSMauro Carvalho Chehab $ rmdir <gadget name> 287ecefae6dSMauro Carvalho Chehab 288ecefae6dSMauro Carvalho Chehabe.g.:: 289ecefae6dSMauro Carvalho Chehab 290ecefae6dSMauro Carvalho Chehab $ rmdir g1 291ecefae6dSMauro Carvalho Chehab 292ecefae6dSMauro Carvalho Chehab 293ecefae6dSMauro Carvalho Chehab 294ecefae6dSMauro Carvalho Chehab 295ecefae6dSMauro Carvalho ChehabImplementation design 296ecefae6dSMauro Carvalho Chehab===================== 297ecefae6dSMauro Carvalho Chehab 298ecefae6dSMauro Carvalho ChehabBelow the idea of how configfs works is presented. 299ecefae6dSMauro Carvalho ChehabIn configfs there are items and groups, both represented as directories. 300ecefae6dSMauro Carvalho ChehabThe difference between an item and a group is that a group can contain 301ecefae6dSMauro Carvalho Chehabother groups. In the picture below only an item is shown. 302ecefae6dSMauro Carvalho ChehabBoth items and groups can have attributes, which are represented as files. 303ecefae6dSMauro Carvalho ChehabThe user can create and remove directories, but cannot remove files, 304ecefae6dSMauro Carvalho Chehabwhich can be read-only or read-write, depending on what they represent. 305ecefae6dSMauro Carvalho Chehab 306ecefae6dSMauro Carvalho ChehabThe filesystem part of configfs operates on config_items/groups and 307ecefae6dSMauro Carvalho Chehabconfigfs_attributes which are generic and of the same type for all 308ecefae6dSMauro Carvalho Chehabconfigured elements. However, they are embedded in usage-specific 309ecefae6dSMauro Carvalho Chehablarger structures. In the picture below there is a "cs" which contains 310ecefae6dSMauro Carvalho Chehaba config_item and an "sa" which contains a configfs_attribute. 311ecefae6dSMauro Carvalho Chehab 312ecefae6dSMauro Carvalho ChehabThe filesystem view would be like this:: 313ecefae6dSMauro Carvalho Chehab 314ecefae6dSMauro Carvalho Chehab ./ 315ecefae6dSMauro Carvalho Chehab ./cs (directory) 316ecefae6dSMauro Carvalho Chehab | 317ecefae6dSMauro Carvalho Chehab +--sa (file) 318ecefae6dSMauro Carvalho Chehab | 319ecefae6dSMauro Carvalho Chehab . 320ecefae6dSMauro Carvalho Chehab . 321ecefae6dSMauro Carvalho Chehab . 322ecefae6dSMauro Carvalho Chehab 323ecefae6dSMauro Carvalho ChehabWhenever a user reads/writes the "sa" file, a function is called 324ecefae6dSMauro Carvalho Chehabwhich accepts a struct config_item and a struct configfs_attribute. 325ecefae6dSMauro Carvalho ChehabIn the said function the "cs" and "sa" are retrieved using the well 326ecefae6dSMauro Carvalho Chehabknown container_of technique and an appropriate sa's function (show or 327ecefae6dSMauro Carvalho Chehabstore) is called and passed the "cs" and a character buffer. The "show" 328ecefae6dSMauro Carvalho Chehabis for displaying the file's contents (copy data from the cs to the 329ecefae6dSMauro Carvalho Chehabbuffer), while the "store" is for modifying the file's contents (copy data 330ecefae6dSMauro Carvalho Chehabfrom the buffer to the cs), but it is up to the implementer of the 331ecefae6dSMauro Carvalho Chehabtwo functions to decide what they actually do. 332ecefae6dSMauro Carvalho Chehab 333ecefae6dSMauro Carvalho Chehab:: 334ecefae6dSMauro Carvalho Chehab 335ecefae6dSMauro Carvalho Chehab typedef struct configured_structure cs; 336ecefae6dSMauro Carvalho Chehab typedef struct specific_attribute sa; 337ecefae6dSMauro Carvalho Chehab 338ecefae6dSMauro Carvalho Chehab sa 339ecefae6dSMauro Carvalho Chehab +----------------------------------+ 340ecefae6dSMauro Carvalho Chehab cs | (*show)(cs *, buffer); | 341ecefae6dSMauro Carvalho Chehab +-----------------+ | (*store)(cs *, buffer, length); | 342ecefae6dSMauro Carvalho Chehab | | | | 343ecefae6dSMauro Carvalho Chehab | +-------------+ | | +------------------+ | 344ecefae6dSMauro Carvalho Chehab | | struct |-|----|------>|struct | | 345ecefae6dSMauro Carvalho Chehab | | config_item | | | |configfs_attribute| | 346ecefae6dSMauro Carvalho Chehab | +-------------+ | | +------------------+ | 347ecefae6dSMauro Carvalho Chehab | | +----------------------------------+ 348ecefae6dSMauro Carvalho Chehab | data to be set | . 349ecefae6dSMauro Carvalho Chehab | | . 350ecefae6dSMauro Carvalho Chehab +-----------------+ . 351ecefae6dSMauro Carvalho Chehab 352ecefae6dSMauro Carvalho ChehabThe file names are decided by the config item/group designer, while 353ecefae6dSMauro Carvalho Chehabthe directories in general can be named at will. A group can have 354ecefae6dSMauro Carvalho Chehaba number of its default sub-groups created automatically. 355ecefae6dSMauro Carvalho Chehab 356ecefae6dSMauro Carvalho ChehabFor more information on configfs please see 35798264991SMauro Carvalho Chehab`Documentation/filesystems/configfs.rst`. 358ecefae6dSMauro Carvalho Chehab 359ecefae6dSMauro Carvalho ChehabThe concepts described above translate to USB gadgets like this: 360ecefae6dSMauro Carvalho Chehab 361ecefae6dSMauro Carvalho Chehab1. A gadget has its config group, which has some attributes (idVendor, 362ecefae6dSMauro Carvalho ChehabidProduct etc) and default sub-groups (configs, functions, strings). 363ecefae6dSMauro Carvalho ChehabWriting to the attributes causes the information to be stored in 364ecefae6dSMauro Carvalho Chehabappropriate locations. In the configs, functions and strings sub-groups 365ecefae6dSMauro Carvalho Chehaba user can create their sub-groups to represent configurations, functions, 366ecefae6dSMauro Carvalho Chehaband groups of strings in a given language. 367ecefae6dSMauro Carvalho Chehab 368ecefae6dSMauro Carvalho Chehab2. The user creates configurations and functions, in the configurations 369ecefae6dSMauro Carvalho Chehabcreates symbolic links to functions. This information is used when the 370ecefae6dSMauro Carvalho Chehabgadget's UDC attribute is written to, which means binding the gadget 371ecefae6dSMauro Carvalho Chehabto the UDC. The code in drivers/usb/gadget/configfs.c iterates over 372ecefae6dSMauro Carvalho Chehaball configurations, and in each configuration it iterates over all 373ecefae6dSMauro Carvalho Chehabfunctions and binds them. This way the whole gadget is bound. 374ecefae6dSMauro Carvalho Chehab 375ecefae6dSMauro Carvalho Chehab3. The file drivers/usb/gadget/configfs.c contains code for 376ecefae6dSMauro Carvalho Chehab 377ecefae6dSMauro Carvalho Chehab - gadget's config_group 378ecefae6dSMauro Carvalho Chehab - gadget's default groups (configs, functions, strings) 379ecefae6dSMauro Carvalho Chehab - associating functions with configurations (symlinks) 380ecefae6dSMauro Carvalho Chehab 381ecefae6dSMauro Carvalho Chehab4. Each USB function naturally has its own view of what it wants 382ecefae6dSMauro Carvalho Chehabconfigured, so config_groups for particular functions are defined 383ecefae6dSMauro Carvalho Chehabin the functions implementation files drivers/usb/gadget/f_*.c. 384ecefae6dSMauro Carvalho Chehab 385ecefae6dSMauro Carvalho Chehab5. Function's code is written in such a way that it uses 386ecefae6dSMauro Carvalho Chehab 387ecefae6dSMauro Carvalho Chehabusb_get_function_instance(), which, in turn, calls request_module. 388ecefae6dSMauro Carvalho ChehabSo, provided that modprobe works, modules for particular functions 389ecefae6dSMauro Carvalho Chehabare loaded automatically. Please note that the converse is not true: 390ecefae6dSMauro Carvalho Chehabafter a gadget is disabled and torn down, the modules remain loaded. 391