cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gadget_configfs.rst (10711B)


      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.