gadget_configfs.rst 10.5 KB
Newer Older
1 2 3
============================================
Linux USB gadget configured through configfs
============================================
4 5


6
25th April 2013
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26




Overview
========

A USB Linux Gadget is a device which has a UDC (USB Device Controller) and can
be connected to a USB Host to extend it with additional functions like a serial
port or a mass storage capability.

A gadget is seen by its host as a set of configurations, each of which contains
a number of interfaces which, from the gadget's perspective, are known as
functions, each function representing e.g. a serial connection or a SCSI disk.

Linux provides a number of functions for gadgets to use.

Creating a gadget means deciding what configurations there will be
and which functions each configuration will provide.

27
Configfs (please see `Documentation/filesystems/configfs.rst`) lends itself nicely
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
for the purpose of telling the kernel about the above mentioned decision.
This document is about how to do it.

It also describes how configfs integration into gadget is designed.




Requirements
============

In order for this to work configfs must be available, so CONFIGFS_FS must be
'y' or 'm' in .config. As of this writing USB_LIBCOMPOSITE selects CONFIGFS_FS.




Usage
=====

(The original post describing the first function
made available through configfs can be seen here:
http://www.spinics.net/lists/linux-usb/msg76388.html)

52 53 54 55
::

	$ modprobe libcomposite
	$ mount none $CONFIGFS_HOME -t configfs
56 57 58 59 60 61

where CONFIGFS_HOME is the mount point for configfs

1. Creating the gadgets
-----------------------

62
For each gadget to be created its corresponding directory must be created::
63

64
	$ mkdir $CONFIGFS_HOME/usb_gadget/<gadget name>
65

66
e.g.::
67

68
	$ mkdir $CONFIGFS_HOME/usb_gadget/g1
69

70 71 72
	...
	...
	...
73

74
	$ cd $CONFIGFS_HOME/usb_gadget/g1
75

76
Each gadget needs to have its vendor id <VID> and product id <PID> specified::
77

78 79
	$ echo <VID> > idVendor
	$ echo <PID> > idProduct
80 81 82

A gadget also needs its serial number, manufacturer and product strings.
In order to have a place to store them, a strings subdirectory must be created
83
for each language, e.g.::
84

85
	$ mkdir strings/0x409
86

87
Then the strings can be specified::
88

89 90 91
	$ echo <serial number> > strings/0x409/serialnumber
	$ echo <manufacturer> > strings/0x409/manufacturer
	$ echo <product> > strings/0x409/product
92 93 94 95 96 97 98 99 100 101

2. Creating the configurations
------------------------------

Each gadget will consist of a number of configurations, their corresponding
directories must be created:

$ mkdir configs/<name>.<number>

where <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 110

Each configuration also needs its strings, so a subdirectory must be created
111
for each language, e.g.::
112

113
	$ mkdir configs/c.1/strings/0x409
114

115
Then the configuration string can be specified::
116

117
	$ echo <configuration> > configs/c.1/strings/0x409/configuration
118

119
Some attributes can also be set for a configuration, e.g.::
120

121
	$ echo 120 > configs/c.1/MaxPower
122 123 124 125 126

3. Creating the functions
-------------------------

The gadget will provide some functions, for each function its corresponding
127
directory must be created::
128

129
	$ mkdir functions/<name>.<instance name>
130 131

where <name> corresponds to one of allowed function names and instance name
132
is 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 140 141 142 143 144 145 146 147 148 149 150 151

Each function provides its specific set of attributes, with either read-only
or read-write access. Where applicable they need to be written to as
appropriate.
Please refer to Documentation/ABI/*/configfs-usb-gadget* for more information.

4. Associating the functions with their configurations
------------------------------------------------------

At this moment a number of gadgets is created, each of which has a number of
configurations specified and a number of functions available. What remains
is specifying which function is available in which configuration (the same
function can be used in multiple configurations). This is achieved with
152
creating symbolic links::
153

154
	$ ln -s functions/<name>.<instance name> configs/<name>.<number>
155

156
e.g.::
157

158
	$ ln -s functions/ncm.usb0 configs/c.1
159

160 161 162
	...
	...
	...
163 164 165 166 167 168 169

5. Enabling the gadget
----------------------

All the above steps serve the purpose of composing the gadget of
configurations and functions.

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
An example directory structure might look like this::

  .
  ./strings
  ./strings/0x409
  ./strings/0x409/serialnumber
  ./strings/0x409/product
  ./strings/0x409/manufacturer
  ./configs
  ./configs/c.1
  ./configs/c.1/ncm.usb0 -> ../../../../usb_gadget/g1/functions/ncm.usb0
  ./configs/c.1/strings
  ./configs/c.1/strings/0x409
  ./configs/c.1/strings/0x409/configuration
  ./configs/c.1/bmAttributes
  ./configs/c.1/MaxPower
  ./functions
  ./functions/ncm.usb0
  ./functions/ncm.usb0/ifname
  ./functions/ncm.usb0/qmult
  ./functions/ncm.usb0/host_addr
  ./functions/ncm.usb0/dev_addr
  ./UDC
  ./bcdUSB
  ./bcdDevice
  ./idProduct
  ./idVendor
  ./bMaxPacketSize0
  ./bDeviceProtocol
  ./bDeviceSubClass
  ./bDeviceClass
201 202 203 204


Such a gadget must be finally enabled so that the USB host can enumerate it.

205 206 207 208
In order to enable the gadget it must be bound to a UDC (USB Device
Controller)::

	$ echo <udc name> > UDC
209 210

where <udc name> is one of those found in /sys/class/udc/*
211
e.g.::
212

213
	$ echo s3c-hsotg > UDC
214 215 216 217 218


6. Disabling the gadget
-----------------------

219 220 221
::

	$ echo "" > UDC
222 223 224 225

7. Cleaning up
--------------

226
Remove functions from configurations::
227

228
	$ rm configs/<config name>.<number>/<function>
229 230

where <config name>.<number> specify the configuration and <function> is
231
a symlink to a function being removed from the configuration, e.g.::
232

233
	$ rm configs/c.1/ncm.usb0
234

235 236 237
	...
	...
	...
238

239
Remove strings directories in configurations:
240

241
	$ rmdir configs/<config name>.<number>/strings/<lang>
242

243
e.g.::
244

245
	$ rmdir configs/c.1/strings/0x409
246

247 248 249
	...
	...
	...
250

251
and remove the configurations::
252

253
	$ rmdir configs/<config name>.<number>
254

255
e.g.::
256

257
	rmdir configs/c.1
258

259 260 261
	...
	...
	...
262

263
Remove functions (function modules are not unloaded, though):
264

265
	$ rmdir functions/<name>.<instance name>
266

267
e.g.::
268

269
	$ rmdir functions/ncm.usb0
270

271 272 273
	...
	...
	...
274

275
Remove strings directories in the gadget::
276

277
	$ rmdir strings/<lang>
278

279
e.g.::
280

281
	$ rmdir strings/0x409
282

283
and finally remove the gadget::
284

285 286
	$ cd ..
	$ rmdir <gadget name>
287

288
e.g.::
289

290
	$ rmdir g1
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311




Implementation design
=====================

Below the idea of how configfs works is presented.
In configfs there are items and groups, both represented as directories.
The difference between an item and a group is that a group can contain
other groups. In the picture below only an item is shown.
Both items and groups can have attributes, which are represented as files.
The user can create and remove directories, but cannot remove files,
which can be read-only or read-write, depending on what they represent.

The filesystem part of configfs operates on config_items/groups and
configfs_attributes which are generic and of the same type for all
configured elements. However, they are embedded in usage-specific
larger structures. In the picture below there is a "cs" which contains
a config_item and an "sa" which contains a configfs_attribute.

312
The filesystem view would be like this::
313

314 315 316 317 318 319 320 321
  ./
  ./cs        (directory)
     |
     +--sa    (file)
     |
     .
     .
     .
322 323 324 325 326 327 328 329 330 331 332

Whenever a user reads/writes the "sa" file, a function is called
which accepts a struct config_item and a struct configfs_attribute.
In the said function the "cs" and "sa" are retrieved using the well
known container_of technique and an appropriate sa's function (show or
store) is called and passed the "cs" and a character buffer. The "show"
is for displaying the file's contents (copy data from the cs to the
buffer), while the "store" is for modifying the file's contents (copy data
from the buffer to the cs), but it is up to the implementer of the
two functions to decide what they actually do.

333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350
::

  typedef struct configured_structure cs;
  typedef struct specific_attribute sa;

                                         sa
                         +----------------------------------+
          cs             |  (*show)(cs *, buffer);          |
  +-----------------+    |  (*store)(cs *, buffer, length); |
  |                 |    |                                  |
  | +-------------+ |    |       +------------------+       |
  | | struct      |-|----|------>|struct            |       |
  | | config_item | |    |       |configfs_attribute|       |
  | +-------------+ |    |       +------------------+       |
  |                 |    +----------------------------------+
  | data to be set  |                .
  |                 |                .
  +-----------------+                .
351 352 353 354 355 356

The file names are decided by the config item/group designer, while
the directories in general can be named at will. A group can have
a number of its default sub-groups created automatically.

For more information on configfs please see
357
`Documentation/filesystems/configfs.rst`.
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384

The concepts described above translate to USB gadgets like this:

1. A gadget has its config group, which has some attributes (idVendor,
idProduct etc) and default sub-groups (configs, functions, strings).
Writing to the attributes causes the information to be stored in
appropriate locations. In the configs, functions and strings sub-groups
a user can create their sub-groups to represent configurations, functions,
and groups of strings in a given language.

2. The user creates configurations and functions, in the configurations
creates symbolic links to functions. This information is used when the
gadget's UDC attribute is written to, which means binding the gadget
to the UDC. The code in drivers/usb/gadget/configfs.c iterates over
all configurations, and in each configuration it iterates over all
functions and binds them. This way the whole gadget is bound.

3. The file drivers/usb/gadget/configfs.c contains code for

	- gadget's config_group
	- gadget's default groups (configs, functions, strings)
	- associating functions with configurations (symlinks)

4. Each USB function naturally has its own view of what it wants
configured, so config_groups for particular functions are defined
in the functions implementation files drivers/usb/gadget/f_*.c.

385
5. Function's code is written in such a way that it uses
386 387 388 389 390

usb_get_function_instance(), which, in turn, calls request_module.
So, provided that modprobe works, modules for particular functions
are loaded automatically. Please note that the converse is not true:
after a gadget is disabled and torn down, the modules remain loaded.