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-testing.rst (28503B)


      1==============
      2Gadget Testing
      3==============
      4
      5This file summarizes information on basic testing of USB functions
      6provided by gadgets.
      7
      8.. contents
      9
     10   1. ACM function
     11   2. ECM function
     12   3. ECM subset function
     13   4. EEM function
     14   5. FFS function
     15   6. HID function
     16   7. LOOPBACK function
     17   8. MASS STORAGE function
     18   9. MIDI function
     19   10. NCM function
     20   11. OBEX function
     21   12. PHONET function
     22   13. RNDIS function
     23   14. SERIAL function
     24   15. SOURCESINK function
     25   16. UAC1 function (legacy implementation)
     26   17. UAC2 function
     27   18. UVC function
     28   19. PRINTER function
     29   20. UAC1 function (new API)
     30
     31
     321. ACM function
     33===============
     34
     35The function is provided by usb_f_acm.ko module.
     36
     37Function-specific configfs interface
     38------------------------------------
     39
     40The function name to use when creating the function directory is "acm".
     41The ACM function provides just one attribute in its function directory:
     42
     43	port_num
     44
     45The attribute is read-only.
     46
     47There can be at most 4 ACM/generic serial/OBEX ports in the system.
     48
     49
     50Testing the ACM function
     51------------------------
     52
     53On the host::
     54
     55	cat > /dev/ttyACM<X>
     56
     57On the device::
     58
     59	cat /dev/ttyGS<Y>
     60
     61then the other way round
     62
     63On the device::
     64
     65	cat > /dev/ttyGS<Y>
     66
     67On the host::
     68
     69	cat /dev/ttyACM<X>
     70
     712. ECM function
     72===============
     73
     74The function is provided by usb_f_ecm.ko module.
     75
     76Function-specific configfs interface
     77------------------------------------
     78
     79The function name to use when creating the function directory is "ecm".
     80The ECM function provides these attributes in its function directory:
     81
     82	=============== ==================================================
     83	ifname		network device interface name associated with this
     84			function instance
     85	qmult		queue length multiplier for high and super speed
     86	host_addr	MAC address of host's end of this
     87			Ethernet over USB link
     88	dev_addr	MAC address of device's end of this
     89			Ethernet over USB link
     90	=============== ==================================================
     91
     92and after creating the functions/ecm.<instance name> they contain default
     93values: qmult is 5, dev_addr and host_addr are randomly selected.
     94The ifname can be written to if the function is not bound. A write must be an
     95interface pattern such as "usb%d", which will cause the net core to choose the
     96next free usbX interface. By default, it is set to "usb%d".
     97
     98Testing the ECM function
     99------------------------
    100
    101Configure IP addresses of the device and the host. Then:
    102
    103On the device::
    104
    105	ping <host's IP>
    106
    107On the host::
    108
    109	ping <device's IP>
    110
    1113. ECM subset function
    112======================
    113
    114The function is provided by usb_f_ecm_subset.ko module.
    115
    116Function-specific configfs interface
    117------------------------------------
    118
    119The function name to use when creating the function directory is "geth".
    120The ECM subset function provides these attributes in its function directory:
    121
    122	=============== ==================================================
    123	ifname		network device interface name associated with this
    124			function instance
    125	qmult		queue length multiplier for high and super speed
    126	host_addr	MAC address of host's end of this
    127			Ethernet over USB link
    128	dev_addr	MAC address of device's end of this
    129			Ethernet over USB link
    130	=============== ==================================================
    131
    132and after creating the functions/ecm.<instance name> they contain default
    133values: qmult is 5, dev_addr and host_addr are randomly selected.
    134The ifname can be written to if the function is not bound. A write must be an
    135interface pattern such as "usb%d", which will cause the net core to choose the
    136next free usbX interface. By default, it is set to "usb%d".
    137
    138Testing the ECM subset function
    139-------------------------------
    140
    141Configure IP addresses of the device and the host. Then:
    142
    143On the device::
    144
    145	ping <host's IP>
    146
    147On the host::
    148
    149	ping <device's IP>
    150
    1514. EEM function
    152===============
    153
    154The function is provided by usb_f_eem.ko module.
    155
    156Function-specific configfs interface
    157------------------------------------
    158
    159The function name to use when creating the function directory is "eem".
    160The EEM function provides these attributes in its function directory:
    161
    162	=============== ==================================================
    163	ifname		network device interface name associated with this
    164			function instance
    165	qmult		queue length multiplier for high and super speed
    166	host_addr	MAC address of host's end of this
    167			Ethernet over USB link
    168	dev_addr	MAC address of device's end of this
    169			Ethernet over USB link
    170	=============== ==================================================
    171
    172and after creating the functions/eem.<instance name> they contain default
    173values: qmult is 5, dev_addr and host_addr are randomly selected.
    174The ifname can be written to if the function is not bound. A write must be an
    175interface pattern such as "usb%d", which will cause the net core to choose the
    176next free usbX interface. By default, it is set to "usb%d".
    177
    178Testing the EEM function
    179------------------------
    180
    181Configure IP addresses of the device and the host. Then:
    182
    183On the device::
    184
    185	ping <host's IP>
    186
    187On the host::
    188
    189	ping <device's IP>
    190
    1915. FFS function
    192===============
    193
    194The function is provided by usb_f_fs.ko module.
    195
    196Function-specific configfs interface
    197------------------------------------
    198
    199The function name to use when creating the function directory is "ffs".
    200The function directory is intentionally empty and not modifiable.
    201
    202After creating the directory there is a new instance (a "device") of FunctionFS
    203available in the system. Once a "device" is available, the user should follow
    204the standard procedure for using FunctionFS (mount it, run the userspace
    205process which implements the function proper). The gadget should be enabled
    206by writing a suitable string to usb_gadget/<gadget>/UDC.
    207
    208Testing the FFS function
    209------------------------
    210
    211On the device: start the function's userspace daemon, enable the gadget
    212
    213On the host: use the USB function provided by the device
    214
    2156. HID function
    216===============
    217
    218The function is provided by usb_f_hid.ko module.
    219
    220Function-specific configfs interface
    221------------------------------------
    222
    223The function name to use when creating the function directory is "hid".
    224The HID function provides these attributes in its function directory:
    225
    226	=============== ===========================================
    227	protocol	HID protocol to use
    228	report_desc	data to be used in HID reports, except data
    229			passed with /dev/hidg<X>
    230	report_length	HID report length
    231	subclass	HID subclass to use
    232	=============== ===========================================
    233
    234For a keyboard the protocol and the subclass are 1, the report_length is 8,
    235while the report_desc is::
    236
    237  $ hd my_report_desc
    238  00000000  05 01 09 06 a1 01 05 07  19 e0 29 e7 15 00 25 01  |..........)...%.|
    239  00000010  75 01 95 08 81 02 95 01  75 08 81 03 95 05 75 01  |u.......u.....u.|
    240  00000020  05 08 19 01 29 05 91 02  95 01 75 03 91 03 95 06  |....).....u.....|
    241  00000030  75 08 15 00 25 65 05 07  19 00 29 65 81 00 c0     |u...%e....)e...|
    242  0000003f
    243
    244Such a sequence of bytes can be stored to the attribute with echo::
    245
    246  $ echo -ne \\x05\\x01\\x09\\x06\\xa1.....
    247
    248Testing the HID function
    249------------------------
    250
    251Device:
    252
    253- create the gadget
    254- connect the gadget to a host, preferably not the one used
    255  to control the gadget
    256- run a program which writes to /dev/hidg<N>, e.g.
    257  a userspace program found in Documentation/usb/gadget_hid.rst::
    258
    259	$ ./hid_gadget_test /dev/hidg0 keyboard
    260
    261Host:
    262
    263- observe the keystrokes from the gadget
    264
    2657. LOOPBACK function
    266====================
    267
    268The function is provided by usb_f_ss_lb.ko module.
    269
    270Function-specific configfs interface
    271------------------------------------
    272
    273The function name to use when creating the function directory is "Loopback".
    274The LOOPBACK function provides these attributes in its function directory:
    275
    276	=============== =======================
    277	qlen		depth of loopback queue
    278	bulk_buflen	buffer length
    279	=============== =======================
    280
    281Testing the LOOPBACK function
    282-----------------------------
    283
    284device: run the gadget
    285
    286host: test-usb (tools/usb/testusb.c)
    287
    2888. MASS STORAGE function
    289========================
    290
    291The function is provided by usb_f_mass_storage.ko module.
    292
    293Function-specific configfs interface
    294------------------------------------
    295
    296The function name to use when creating the function directory is "mass_storage".
    297The MASS STORAGE function provides these attributes in its directory:
    298files:
    299
    300	=============== ==============================================
    301	stall		Set to permit function to halt bulk endpoints.
    302			Disabled on some USB devices known not to work
    303			correctly. You should set it to true.
    304	num_buffers	Number of pipeline buffers. Valid numbers
    305			are 2..4. Available only if
    306			CONFIG_USB_GADGET_DEBUG_FILES is set.
    307	=============== ==============================================
    308
    309and a default lun.0 directory corresponding to SCSI LUN #0.
    310
    311A new lun can be added with mkdir::
    312
    313	$ mkdir functions/mass_storage.0/partition.5
    314
    315Lun numbering does not have to be continuous, except for lun #0 which is
    316created by default. A maximum of 8 luns can be specified and they all must be
    317named following the <name>.<number> scheme. The numbers can be 0..8.
    318Probably a good convention is to name the luns "lun.<number>",
    319although it is not mandatory.
    320
    321In each lun directory there are the following attribute files:
    322
    323	=============== ==============================================
    324	file		The path to the backing file for the LUN.
    325			Required if LUN is not marked as removable.
    326	ro		Flag specifying access to the LUN shall be
    327			read-only. This is implied if CD-ROM emulation
    328			is enabled as well as when it was impossible
    329			to open "filename" in R/W mode.
    330	removable	Flag specifying that LUN shall be indicated as
    331			being removable.
    332	cdrom		Flag specifying that LUN shall be reported as
    333			being a CD-ROM.
    334	nofua		Flag specifying that FUA flag
    335			in SCSI WRITE(10,12)
    336	=============== ==============================================
    337
    338Testing the MASS STORAGE function
    339---------------------------------
    340
    341device: connect the gadget, enable it
    342host: dmesg, see the USB drives appear (if system configured to automatically
    343mount)
    344
    3459. MIDI function
    346================
    347
    348The function is provided by usb_f_midi.ko module.
    349
    350Function-specific configfs interface
    351------------------------------------
    352
    353The function name to use when creating the function directory is "midi".
    354The MIDI function provides these attributes in its function directory:
    355
    356	=============== ====================================
    357	buflen		MIDI buffer length
    358	id		ID string for the USB MIDI adapter
    359	in_ports	number of MIDI input ports
    360	index		index value for the USB MIDI adapter
    361	out_ports	number of MIDI output ports
    362	qlen		USB read request queue length
    363	=============== ====================================
    364
    365Testing the MIDI function
    366-------------------------
    367
    368There are two cases: playing a mid from the gadget to
    369the host and playing a mid from the host to the gadget.
    370
    3711) Playing a mid from the gadget to the host:
    372
    373host::
    374
    375  $ arecordmidi -l
    376   Port    Client name                      Port name
    377   14:0    Midi Through                     Midi Through Port-0
    378   24:0    MIDI Gadget                      MIDI Gadget MIDI 1
    379  $ arecordmidi -p 24:0 from_gadget.mid
    380
    381gadget::
    382
    383  $ aplaymidi -l
    384   Port    Client name                      Port name
    385   20:0    f_midi                           f_midi
    386
    387  $ aplaymidi -p 20:0 to_host.mid
    388
    3892) Playing a mid from the host to the gadget
    390
    391gadget::
    392
    393  $ arecordmidi -l
    394   Port    Client name                      Port name
    395   20:0    f_midi                           f_midi
    396
    397  $ arecordmidi -p 20:0 from_host.mid
    398
    399host::
    400
    401  $ aplaymidi -l
    402   Port    Client name                      Port name
    403   14:0    Midi Through                     Midi Through Port-0
    404   24:0    MIDI Gadget                      MIDI Gadget MIDI 1
    405
    406  $ aplaymidi -p24:0 to_gadget.mid
    407
    408The from_gadget.mid should sound identical to the to_host.mid.
    409
    410The from_host.id should sound identical to the to_gadget.mid.
    411
    412MIDI files can be played to speakers/headphones with e.g. timidity installed::
    413
    414  $ aplaymidi -l
    415   Port    Client name                      Port name
    416   14:0    Midi Through                     Midi Through Port-0
    417   24:0    MIDI Gadget                      MIDI Gadget MIDI 1
    418  128:0    TiMidity                         TiMidity port 0
    419  128:1    TiMidity                         TiMidity port 1
    420  128:2    TiMidity                         TiMidity port 2
    421  128:3    TiMidity                         TiMidity port 3
    422
    423  $ aplaymidi -p 128:0 file.mid
    424
    425MIDI ports can be logically connected using the aconnect utility, e.g.::
    426
    427  $ aconnect 24:0 128:0 # try it on the host
    428
    429After the gadget's MIDI port is connected to timidity's MIDI port,
    430whatever is played at the gadget side with aplaymidi -l is audible
    431in host's speakers/headphones.
    432
    43310. NCM function
    434================
    435
    436The function is provided by usb_f_ncm.ko module.
    437
    438Function-specific configfs interface
    439------------------------------------
    440
    441The function name to use when creating the function directory is "ncm".
    442The NCM function provides these attributes in its function directory:
    443
    444	=============== ==================================================
    445	ifname		network device interface name associated with this
    446			function instance
    447	qmult		queue length multiplier for high and super speed
    448	host_addr	MAC address of host's end of this
    449			Ethernet over USB link
    450	dev_addr	MAC address of device's end of this
    451			Ethernet over USB link
    452	=============== ==================================================
    453
    454and after creating the functions/ncm.<instance name> they contain default
    455values: qmult is 5, dev_addr and host_addr are randomly selected.
    456The ifname can be written to if the function is not bound. A write must be an
    457interface pattern such as "usb%d", which will cause the net core to choose the
    458next free usbX interface. By default, it is set to "usb%d".
    459
    460Testing the NCM function
    461------------------------
    462
    463Configure IP addresses of the device and the host. Then:
    464
    465On the device::
    466
    467	ping <host's IP>
    468
    469On the host::
    470
    471	ping <device's IP>
    472
    47311. OBEX function
    474=================
    475
    476The function is provided by usb_f_obex.ko module.
    477
    478Function-specific configfs interface
    479------------------------------------
    480
    481The function name to use when creating the function directory is "obex".
    482The OBEX function provides just one attribute in its function directory:
    483
    484	port_num
    485
    486The attribute is read-only.
    487
    488There can be at most 4 ACM/generic serial/OBEX ports in the system.
    489
    490Testing the OBEX function
    491-------------------------
    492
    493On device::
    494
    495	seriald -f /dev/ttyGS<Y> -s 1024
    496
    497On host::
    498
    499	serialc -v <vendorID> -p <productID> -i<interface#> -a1 -s1024 \
    500                -t<out endpoint addr> -r<in endpoint addr>
    501
    502where seriald and serialc are Felipe's utilities found here:
    503
    504	https://github.com/felipebalbi/usb-tools.git master
    505
    50612. PHONET function
    507===================
    508
    509The function is provided by usb_f_phonet.ko module.
    510
    511Function-specific configfs interface
    512------------------------------------
    513
    514The function name to use when creating the function directory is "phonet".
    515The PHONET function provides just one attribute in its function directory:
    516
    517	=============== ==================================================
    518	ifname		network device interface name associated with this
    519			function instance
    520	=============== ==================================================
    521
    522Testing the PHONET function
    523---------------------------
    524
    525It is not possible to test the SOCK_STREAM protocol without a specific piece
    526of hardware, so only SOCK_DGRAM has been tested. For the latter to work,
    527in the past I had to apply the patch mentioned here:
    528
    529http://www.spinics.net/lists/linux-usb/msg85689.html
    530
    531These tools are required:
    532
    533git://git.gitorious.org/meego-cellular/phonet-utils.git
    534
    535On the host::
    536
    537	$ ./phonet -a 0x10 -i usbpn0
    538	$ ./pnroute add 0x6c usbpn0
    539	$./pnroute add 0x10 usbpn0
    540	$ ifconfig usbpn0 up
    541
    542On the device::
    543
    544	$ ./phonet -a 0x6c -i upnlink0
    545	$ ./pnroute add 0x10 upnlink0
    546	$ ifconfig upnlink0 up
    547
    548Then a test program can be used::
    549
    550	http://www.spinics.net/lists/linux-usb/msg85690.html
    551
    552On the device::
    553
    554	$ ./pnxmit -a 0x6c -r
    555
    556On the host::
    557
    558	$ ./pnxmit -a 0x10 -s 0x6c
    559
    560As a result some data should be sent from host to device.
    561Then the other way round:
    562
    563On the host::
    564
    565	$ ./pnxmit -a 0x10 -r
    566
    567On the device::
    568
    569	$ ./pnxmit -a 0x6c -s 0x10
    570
    57113. RNDIS function
    572==================
    573
    574The function is provided by usb_f_rndis.ko module.
    575
    576Function-specific configfs interface
    577------------------------------------
    578
    579The function name to use when creating the function directory is "rndis".
    580The RNDIS function provides these attributes in its function directory:
    581
    582	=============== ==================================================
    583	ifname		network device interface name associated with this
    584			function instance
    585	qmult		queue length multiplier for high and super speed
    586	host_addr	MAC address of host's end of this
    587			Ethernet over USB link
    588	dev_addr	MAC address of device's end of this
    589			Ethernet over USB link
    590	=============== ==================================================
    591
    592and after creating the functions/rndis.<instance name> they contain default
    593values: qmult is 5, dev_addr and host_addr are randomly selected.
    594The ifname can be written to if the function is not bound. A write must be an
    595interface pattern such as "usb%d", which will cause the net core to choose the
    596next free usbX interface. By default, it is set to "usb%d".
    597
    598Testing the RNDIS function
    599--------------------------
    600
    601Configure IP addresses of the device and the host. Then:
    602
    603On the device::
    604
    605	ping <host's IP>
    606
    607On the host::
    608
    609	ping <device's IP>
    610
    61114. SERIAL function
    612===================
    613
    614The function is provided by usb_f_gser.ko module.
    615
    616Function-specific configfs interface
    617------------------------------------
    618
    619The function name to use when creating the function directory is "gser".
    620The SERIAL function provides just one attribute in its function directory:
    621
    622	port_num
    623
    624The attribute is read-only.
    625
    626There can be at most 4 ACM/generic serial/OBEX ports in the system.
    627
    628Testing the SERIAL function
    629---------------------------
    630
    631On host::
    632
    633	insmod usbserial
    634	echo VID PID >/sys/bus/usb-serial/drivers/generic/new_id
    635
    636On host::
    637
    638	cat > /dev/ttyUSB<X>
    639
    640On target::
    641
    642	cat /dev/ttyGS<Y>
    643
    644then the other way round
    645
    646On target::
    647
    648	cat > /dev/ttyGS<Y>
    649
    650On host::
    651
    652	cat /dev/ttyUSB<X>
    653
    65415. SOURCESINK function
    655=======================
    656
    657The function is provided by usb_f_ss_lb.ko module.
    658
    659Function-specific configfs interface
    660------------------------------------
    661
    662The function name to use when creating the function directory is "SourceSink".
    663The SOURCESINK function provides these attributes in its function directory:
    664
    665	=============== ==================================
    666	pattern		0 (all zeros), 1 (mod63), 2 (none)
    667	isoc_interval	1..16
    668	isoc_maxpacket	0 - 1023 (fs), 0 - 1024 (hs/ss)
    669	isoc_mult	0..2 (hs/ss only)
    670	isoc_maxburst	0..15 (ss only)
    671	bulk_buflen	buffer length
    672	bulk_qlen	depth of queue for bulk
    673	iso_qlen	depth of queue for iso
    674	=============== ==================================
    675
    676Testing the SOURCESINK function
    677-------------------------------
    678
    679device: run the gadget
    680
    681host: test-usb (tools/usb/testusb.c)
    682
    683
    68416. UAC1 function (legacy implementation)
    685=========================================
    686
    687The function is provided by usb_f_uac1_legacy.ko module.
    688
    689Function-specific configfs interface
    690------------------------------------
    691
    692The function name to use when creating the function directory
    693is "uac1_legacy".
    694The uac1 function provides these attributes in its function directory:
    695
    696	=============== ====================================
    697	audio_buf_size	audio buffer size
    698	fn_cap		capture pcm device file name
    699	fn_cntl		control device file name
    700	fn_play		playback pcm device file name
    701	req_buf_size	ISO OUT endpoint request buffer size
    702	req_count	ISO OUT endpoint request count
    703	=============== ====================================
    704
    705The attributes have sane default values.
    706
    707Testing the UAC1 function
    708-------------------------
    709
    710device: run the gadget
    711
    712host::
    713
    714	aplay -l # should list our USB Audio Gadget
    715
    71617. UAC2 function
    717=================
    718
    719The function is provided by usb_f_uac2.ko module.
    720
    721Function-specific configfs interface
    722------------------------------------
    723
    724The function name to use when creating the function directory is "uac2".
    725The uac2 function provides these attributes in its function directory:
    726
    727	================ ====================================================
    728	c_chmask         capture channel mask
    729	c_srate          list of capture sampling rates (comma-separated)
    730	c_ssize          capture sample size (bytes)
    731	c_sync           capture synchronization type (async/adaptive)
    732	c_mute_present   capture mute control enable
    733	c_volume_present capture volume control enable
    734	c_volume_min     capture volume control min value (in 1/256 dB)
    735	c_volume_max     capture volume control max value (in 1/256 dB)
    736	c_volume_res     capture volume control resolution (in 1/256 dB)
    737	c_hs_bint        capture bInterval for HS/SS (1-4: fixed, 0: auto)
    738	fb_max           maximum extra bandwidth in async mode
    739	p_chmask         playback channel mask
    740	p_srate          list of playback sampling rates (comma-separated)
    741	p_ssize          playback sample size (bytes)
    742	p_mute_present   playback mute control enable
    743	p_volume_present playback volume control enable
    744	p_volume_min     playback volume control min value (in 1/256 dB)
    745	p_volume_max     playback volume control max value (in 1/256 dB)
    746	p_volume_res     playback volume control resolution (in 1/256 dB)
    747	p_hs_bint        playback bInterval for HS/SS (1-4: fixed, 0: auto)
    748	req_number       the number of pre-allocated request for both capture
    749	                 and playback
    750	function_name    name of the interface
    751	================ ====================================================
    752
    753The attributes have sane default values.
    754
    755Testing the UAC2 function
    756-------------------------
    757
    758device: run the gadget
    759host: aplay -l # should list our USB Audio Gadget
    760
    761This function does not require real hardware support, it just
    762sends a stream of audio data to/from the host. In order to
    763actually hear something at the device side, a command similar
    764to this must be used at the device side::
    765
    766	$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
    767
    768e.g.::
    769
    770	$ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \
    771	  aplay -D default:CARD=OdroidU3
    772
    77318. UVC function
    774================
    775
    776The function is provided by usb_f_uvc.ko module.
    777
    778Function-specific configfs interface
    779------------------------------------
    780
    781The function name to use when creating the function directory is "uvc".
    782The uvc function provides these attributes in its function directory:
    783
    784	=================== ================================================
    785	streaming_interval  interval for polling endpoint for data transfers
    786	streaming_maxburst  bMaxBurst for super speed companion descriptor
    787	streaming_maxpacket maximum packet size this endpoint is capable of
    788			    sending or receiving when this configuration is
    789			    selected
    790	function_name       name of the interface
    791	=================== ================================================
    792
    793There are also "control" and "streaming" subdirectories, each of which contain
    794a number of their subdirectories. There are some sane defaults provided, but
    795the user must provide the following:
    796
    797	================== ====================================================
    798	control header     create in control/header, link from control/class/fs
    799			   and/or control/class/ss
    800	streaming header   create in streaming/header, link from
    801			   streaming/class/fs and/or streaming/class/hs and/or
    802			   streaming/class/ss
    803	format description create in streaming/mjpeg and/or
    804			   streaming/uncompressed
    805	frame description  create in streaming/mjpeg/<format> and/or in
    806			   streaming/uncompressed/<format>
    807	================== ====================================================
    808
    809Each frame description contains frame interval specification, and each
    810such specification consists of a number of lines with an inverval value
    811in each line. The rules stated above are best illustrated with an example::
    812
    813  # mkdir functions/uvc.usb0/control/header/h
    814  # cd functions/uvc.usb0/control/
    815  # ln -s header/h class/fs
    816  # ln -s header/h class/ss
    817  # mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p
    818  # cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval
    819  666666
    820  1000000
    821  5000000
    822  EOF
    823  # cd $GADGET_CONFIGFS_ROOT
    824  # mkdir functions/uvc.usb0/streaming/header/h
    825  # cd functions/uvc.usb0/streaming/header/h
    826  # ln -s ../../uncompressed/u
    827  # cd ../../class/fs
    828  # ln -s ../../header/h
    829  # cd ../../class/hs
    830  # ln -s ../../header/h
    831  # cd ../../class/ss
    832  # ln -s ../../header/h
    833
    834
    835Testing the UVC function
    836------------------------
    837
    838device: run the gadget, modprobe vivid::
    839
    840  # uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
    841
    842where uvc-gadget is this program:
    843	http://git.ideasonboard.org/uvc-gadget.git
    844
    845with these patches:
    846
    847	http://www.spinics.net/lists/linux-usb/msg99220.html
    848
    849host::
    850
    851	luvcview -f yuv
    852
    85319. PRINTER function
    854====================
    855
    856The function is provided by usb_f_printer.ko module.
    857
    858Function-specific configfs interface
    859------------------------------------
    860
    861The function name to use when creating the function directory is "printer".
    862The printer function provides these attributes in its function directory:
    863
    864	==========	===========================================
    865	pnp_string	Data to be passed to the host in pnp string
    866	q_len		Number of requests per endpoint
    867	==========	===========================================
    868
    869Testing the PRINTER function
    870----------------------------
    871
    872The most basic testing:
    873
    874device: run the gadget::
    875
    876	# ls -l /devices/virtual/usb_printer_gadget/
    877
    878should show g_printer<number>.
    879
    880If udev is active, then /dev/g_printer<number> should appear automatically.
    881
    882host:
    883
    884If udev is active, then e.g. /dev/usb/lp0 should appear.
    885
    886host->device transmission:
    887
    888device::
    889
    890	# cat /dev/g_printer<number>
    891
    892host::
    893
    894	# cat > /dev/usb/lp0
    895
    896device->host transmission::
    897
    898	# cat > /dev/g_printer<number>
    899
    900host::
    901
    902	# cat /dev/usb/lp0
    903
    904More advanced testing can be done with the prn_example
    905described in Documentation/usb/gadget_printer.rst.
    906
    907
    90820. UAC1 function (virtual ALSA card, using u_audio API)
    909========================================================
    910
    911The function is provided by usb_f_uac1.ko module.
    912It will create a virtual ALSA card and the audio streams are simply
    913sinked to and sourced from it.
    914
    915Function-specific configfs interface
    916------------------------------------
    917
    918The function name to use when creating the function directory is "uac1".
    919The uac1 function provides these attributes in its function directory:
    920
    921	================ ====================================================
    922	c_chmask         capture channel mask
    923	c_srate          list of capture sampling rates (comma-separated)
    924	c_ssize          capture sample size (bytes)
    925	c_mute_present   capture mute control enable
    926	c_volume_present capture volume control enable
    927	c_volume_min     capture volume control min value (in 1/256 dB)
    928	c_volume_max     capture volume control max value (in 1/256 dB)
    929	c_volume_res     capture volume control resolution (in 1/256 dB)
    930	p_chmask         playback channel mask
    931	p_srate          list of playback sampling rates (comma-separated)
    932	p_ssize          playback sample size (bytes)
    933	p_mute_present   playback mute control enable
    934	p_volume_present playback volume control enable
    935	p_volume_min     playback volume control min value (in 1/256 dB)
    936	p_volume_max     playback volume control max value (in 1/256 dB)
    937	p_volume_res     playback volume control resolution (in 1/256 dB)
    938	req_number       the number of pre-allocated requests for both capture
    939	                 and playback
    940	function_name    name of the interface
    941	================ ====================================================
    942
    943The attributes have sane default values.
    944
    945Testing the UAC1 function
    946-------------------------
    947
    948device: run the gadget
    949host: aplay -l # should list our USB Audio Gadget
    950
    951This function does not require real hardware support, it just
    952sends a stream of audio data to/from the host. In order to
    953actually hear something at the device side, a command similar
    954to this must be used at the device side::
    955
    956	$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
    957
    958e.g.::
    959
    960	$ arecord -f dat -t wav -D hw:CARD=UAC1Gadget,DEV=0 | \
    961	  aplay -D default:CARD=OdroidU3