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