Linux 4.11-rc5
[linux/fpc-iii.git] / Documentation / usb / gadget-testing.txt
blobfb0cc4df17655b6d224341b3915afbf4acdd1a89
1 This file summarizes information on basic testing of USB functions
2 provided by gadgets.
4 1. ACM function
5 2. ECM function
6 3. ECM subset function
7 4. EEM function
8 5. FFS function
9 6. HID function
10 7. LOOPBACK function
11 8. MASS STORAGE function
12 9. MIDI function
13 10. NCM function
14 11. OBEX function
15 12. PHONET function
16 13. RNDIS function
17 14. SERIAL function
18 15. SOURCESINK function
19 16. UAC1 function
20 17. UAC2 function
21 18. UVC function
22 19. PRINTER function
25 1. ACM function
26 ===============
28 The function is provided by usb_f_acm.ko module.
30 Function-specific configfs interface
31 ------------------------------------
33 The function name to use when creating the function directory is "acm".
34 The ACM function provides just one attribute in its function directory:
36         port_num
38 The attribute is read-only.
40 There can be at most 4 ACM/generic serial/OBEX ports in the system.
43 Testing the ACM function
44 ------------------------
46 On the host: cat > /dev/ttyACM<X>
47 On the device : cat /dev/ttyGS<Y>
49 then the other way round
51 On the device: cat > /dev/ttyGS<Y>
52 On the host: cat /dev/ttyACM<X>
54 2. ECM function
55 ===============
57 The function is provided by usb_f_ecm.ko module.
59 Function-specific configfs interface
60 ------------------------------------
62 The function name to use when creating the function directory is "ecm".
63 The ECM function provides these attributes in its function directory:
65         ifname          - network device interface name associated with this
66                         function instance
67         qmult           - queue length multiplier for high and super speed
68         host_addr       - MAC address of host's end of this
69                         Ethernet over USB link
70         dev_addr        - MAC address of device's end of this
71                         Ethernet over USB link
73 and after creating the functions/ecm.<instance name> they contain default
74 values: qmult is 5, dev_addr and host_addr are randomly selected.
75 Except for ifname they can be written to until the function is linked to a
76 configuration. The ifname is read-only and contains the name of the interface
77 which was assigned by the net core, e. g. usb0.
79 Testing the ECM function
80 ------------------------
82 Configure IP addresses of the device and the host. Then:
84 On the device: ping <host's IP>
85 On the host: ping <device's IP>
87 3. ECM subset function
88 ======================
90 The function is provided by usb_f_ecm_subset.ko module.
92 Function-specific configfs interface
93 ------------------------------------
95 The function name to use when creating the function directory is "geth".
96 The ECM subset function provides these attributes in its function directory:
98         ifname          - network device interface name associated with this
99                         function instance
100         qmult           - queue length multiplier for high and super speed
101         host_addr       - MAC address of host's end of this
102                         Ethernet over USB link
103         dev_addr        - MAC address of device's end of this
104                         Ethernet over USB link
106 and after creating the functions/ecm.<instance name> they contain default
107 values: qmult is 5, dev_addr and host_addr are randomly selected.
108 Except for ifname they can be written to until the function is linked to a
109 configuration. The ifname is read-only and contains the name of the interface
110 which was assigned by the net core, e. g. usb0.
112 Testing the ECM subset function
113 -------------------------------
115 Configure IP addresses of the device and the host. Then:
117 On the device: ping <host's IP>
118 On the host: ping <device's IP>
120 4. EEM function
121 ===============
123 The function is provided by usb_f_eem.ko module.
125 Function-specific configfs interface
126 ------------------------------------
128 The function name to use when creating the function directory is "eem".
129 The EEM function provides these attributes in its function directory:
131         ifname          - network device interface name associated with this
132                         function instance
133         qmult           - queue length multiplier for high and super speed
134         host_addr       - MAC address of host's end of this
135                         Ethernet over USB link
136         dev_addr        - MAC address of device's end of this
137                         Ethernet over USB link
139 and after creating the functions/eem.<instance name> they contain default
140 values: qmult is 5, dev_addr and host_addr are randomly selected.
141 Except for ifname they can be written to until the function is linked to a
142 configuration. The ifname is read-only and contains the name of the interface
143 which was assigned by the net core, e. g. usb0.
145 Testing the EEM function
146 ------------------------
148 Configure IP addresses of the device and the host. Then:
150 On the device: ping <host's IP>
151 On the host: ping <device's IP>
153 5. FFS function
154 ===============
156 The function is provided by usb_f_fs.ko module.
158 Function-specific configfs interface
159 ------------------------------------
161 The function name to use when creating the function directory is "ffs".
162 The function directory is intentionally empty and not modifiable.
164 After creating the directory there is a new instance (a "device") of FunctionFS
165 available in the system. Once a "device" is available, the user should follow
166 the standard procedure for using FunctionFS (mount it, run the userspace
167 process which implements the function proper). The gadget should be enabled
168 by writing a suitable string to usb_gadget/<gadget>/UDC.
170 Testing the FFS function
171 ------------------------
173 On the device: start the function's userspace daemon, enable the gadget
174 On the host: use the USB function provided by the device
176 6. HID function
177 ===============
179 The function is provided by usb_f_hid.ko module.
181 Function-specific configfs interface
182 ------------------------------------
184 The function name to use when creating the function directory is "hid".
185 The HID function provides these attributes in its function directory:
187         protocol        - HID protocol to use
188         report_desc     - data to be used in HID reports, except data
189                         passed with /dev/hidg<X>
190         report_length   - HID report length
191         subclass        - HID subclass to use
193 For a keyboard the protocol and the subclass are 1, the report_length is 8,
194 while the report_desc is:
196 $ hd my_report_desc
197 00000000  05 01 09 06 a1 01 05 07  19 e0 29 e7 15 00 25 01  |..........)...%.|
198 00000010  75 01 95 08 81 02 95 01  75 08 81 03 95 05 75 01  |u.......u.....u.|
199 00000020  05 08 19 01 29 05 91 02  95 01 75 03 91 03 95 06  |....).....u.....|
200 00000030  75 08 15 00 25 65 05 07  19 00 29 65 81 00 c0     |u...%e....)e...|
201 0000003f
203 Such a sequence of bytes can be stored to the attribute with echo:
205 $ echo -ne \\x05\\x01\\x09\\x06\\xa1.....
207 Testing the HID function
208 ------------------------
210 Device:
211 - create the gadget
212 - connect the gadget to a host, preferably not the one used
213 to control the gadget
214 - run a program which writes to /dev/hidg<N>, e.g.
215 a userspace program found in Documentation/usb/gadget_hid.txt:
217 $ ./hid_gadget_test /dev/hidg0 keyboard
219 Host:
220 - observe the keystrokes from the gadget
222 7. LOOPBACK function
223 ====================
225 The function is provided by usb_f_ss_lb.ko module.
227 Function-specific configfs interface
228 ------------------------------------
230 The function name to use when creating the function directory is "Loopback".
231 The LOOPBACK function provides these attributes in its function directory:
233         qlen            - depth of loopback queue
234         bulk_buflen     - buffer length
236 Testing the LOOPBACK function
237 -----------------------------
239 device: run the gadget
240 host: test-usb (tools/usb/testusb.c)
242 8. MASS STORAGE function
243 ========================
245 The function is provided by usb_f_mass_storage.ko module.
247 Function-specific configfs interface
248 ------------------------------------
250 The function name to use when creating the function directory is "mass_storage".
251 The MASS STORAGE function provides these attributes in its directory:
252 files:
254         stall           - Set to permit function to halt bulk endpoints.
255                         Disabled on some USB devices known not to work
256                         correctly. You should set it to true.
257         num_buffers     - Number of pipeline buffers. Valid numbers
258                         are 2..4. Available only if
259                         CONFIG_USB_GADGET_DEBUG_FILES is set.
261 and a default lun.0 directory corresponding to SCSI LUN #0.
263 A new lun can be added with mkdir:
265 $ mkdir functions/mass_storage.0/partition.5
267 Lun numbering does not have to be continuous, except for lun #0 which is
268 created by default. A maximum of 8 luns can be specified and they all must be
269 named following the <name>.<number> scheme. The numbers can be 0..8.
270 Probably a good convention is to name the luns "lun.<number>",
271 although it is not mandatory.
273 In each lun directory there are the following attribute files:
275         file            - The path to the backing file for the LUN.
276                         Required if LUN is not marked as removable.
277         ro              - Flag specifying access to the LUN shall be
278                         read-only. This is implied if CD-ROM emulation
279                         is enabled as well as when it was impossible
280                         to open "filename" in R/W mode.
281         removable       - Flag specifying that LUN shall be indicated as
282                         being removable.
283         cdrom           - Flag specifying that LUN shall be reported as
284                         being a CD-ROM.
285         nofua           - Flag specifying that FUA flag
286                         in SCSI WRITE(10,12)
288 Testing the MASS STORAGE function
289 ---------------------------------
291 device: connect the gadget, enable it
292 host: dmesg, see the USB drives appear (if system configured to automatically
293 mount)
295 9. MIDI function
296 ================
298 The function is provided by usb_f_midi.ko module.
300 Function-specific configfs interface
301 ------------------------------------
303 The function name to use when creating the function directory is "midi".
304 The MIDI function provides these attributes in its function directory:
306         buflen          - MIDI buffer length
307         id              - ID string for the USB MIDI adapter
308         in_ports        - number of MIDI input ports
309         index           - index value for the USB MIDI adapter
310         out_ports       - number of MIDI output ports
311         qlen            - USB read request queue length
313 Testing the MIDI function
314 -------------------------
316 There are two cases: playing a mid from the gadget to
317 the host and playing a mid from the host to the gadget.
319 1) Playing a mid from the gadget to the host
320 host)
322 $ arecordmidi -l
323  Port    Client name                      Port name
324  14:0    Midi Through                     Midi Through Port-0
325  24:0    MIDI Gadget                      MIDI Gadget MIDI 1
326 $ arecordmidi -p 24:0 from_gadget.mid
328 gadget)
330 $ aplaymidi -l
331  Port    Client name                      Port name
332  20:0    f_midi                           f_midi
334 $ aplaymidi -p 20:0 to_host.mid
336 2) Playing a mid from the host to the gadget
337 gadget)
339 $ arecordmidi -l
340  Port    Client name                      Port name
341  20:0    f_midi                           f_midi
343 $ arecordmidi -p 20:0 from_host.mid
345 host)
347 $ aplaymidi -l
348  Port    Client name                      Port name
349  14:0    Midi Through                     Midi Through Port-0
350  24:0    MIDI Gadget                      MIDI Gadget MIDI 1
352 $ aplaymidi -p24:0 to_gadget.mid
354 The from_gadget.mid should sound identical to the to_host.mid.
355 The from_host.id should sound identical to the to_gadget.mid.
357 MIDI files can be played to speakers/headphones with e.g. timidity installed
359 $ aplaymidi -l
360  Port    Client name                      Port name
361  14:0    Midi Through                     Midi Through Port-0
362  24:0    MIDI Gadget                      MIDI Gadget MIDI 1
363 128:0    TiMidity                         TiMidity port 0
364 128:1    TiMidity                         TiMidity port 1
365 128:2    TiMidity                         TiMidity port 2
366 128:3    TiMidity                         TiMidity port 3
368 $ aplaymidi -p 128:0 file.mid
370 MIDI ports can be logically connected using the aconnect utility, e.g.:
372 $ aconnect 24:0 128:0 # try it on the host
374 After the gadget's MIDI port is connected to timidity's MIDI port,
375 whatever is played at the gadget side with aplaymidi -l is audible
376 in host's speakers/headphones.
378 10. NCM function
379 ================
381 The function is provided by usb_f_ncm.ko module.
383 Function-specific configfs interface
384 ------------------------------------
386 The function name to use when creating the function directory is "ncm".
387 The NCM function provides these attributes in its function directory:
389         ifname          - network device interface name associated with this
390                         function instance
391         qmult           - queue length multiplier for high and super speed
392         host_addr       - MAC address of host's end of this
393                         Ethernet over USB link
394         dev_addr        - MAC address of device's end of this
395                         Ethernet over USB link
397 and after creating the functions/ncm.<instance name> they contain default
398 values: qmult is 5, dev_addr and host_addr are randomly selected.
399 Except for ifname they can be written to until the function is linked to a
400 configuration. The ifname is read-only and contains the name of the interface
401 which was assigned by the net core, e. g. usb0.
403 Testing the NCM function
404 ------------------------
406 Configure IP addresses of the device and the host. Then:
408 On the device: ping <host's IP>
409 On the host: ping <device's IP>
411 11. OBEX function
412 =================
414 The function is provided by usb_f_obex.ko module.
416 Function-specific configfs interface
417 ------------------------------------
419 The function name to use when creating the function directory is "obex".
420 The OBEX function provides just one attribute in its function directory:
422         port_num
424 The attribute is read-only.
426 There can be at most 4 ACM/generic serial/OBEX ports in the system.
428 Testing the OBEX function
429 -------------------------
431 On device: seriald -f /dev/ttyGS<Y> -s 1024
432 On host: serialc -v <vendorID> -p <productID> -i<interface#> -a1 -s1024 \
433              -t<out endpoint addr> -r<in endpoint addr>
435 where seriald and serialc are Felipe's utilities found here:
437 https://github.com/felipebalbi/usb-tools.git master
439 12. PHONET function
440 ===================
442 The function is provided by usb_f_phonet.ko module.
444 Function-specific configfs interface
445 ------------------------------------
447 The function name to use when creating the function directory is "phonet".
448 The PHONET function provides just one attribute in its function directory:
450         ifname          - network device interface name associated with this
451                         function instance
453 Testing the PHONET function
454 ---------------------------
456 It is not possible to test the SOCK_STREAM protocol without a specific piece
457 of hardware, so only SOCK_DGRAM has been tested. For the latter to work,
458 in the past I had to apply the patch mentioned here:
460 http://www.spinics.net/lists/linux-usb/msg85689.html
462 These tools are required:
464 git://git.gitorious.org/meego-cellular/phonet-utils.git
466 On the host:
468 $ ./phonet -a 0x10 -i usbpn0
469 $ ./pnroute add 0x6c usbpn0
470 $./pnroute add 0x10 usbpn0
471 $ ifconfig usbpn0 up
473 On the device:
475 $ ./phonet -a 0x6c -i upnlink0
476 $ ./pnroute add 0x10 upnlink0
477 $ ifconfig upnlink0 up
479 Then a test program can be used:
481 http://www.spinics.net/lists/linux-usb/msg85690.html
483 On the device:
485 $ ./pnxmit -a 0x6c -r
487 On the host:
489 $ ./pnxmit -a 0x10 -s 0x6c
491 As a result some data should be sent from host to device.
492 Then the other way round:
494 On the host:
496 $ ./pnxmit -a 0x10 -r
498 On the device:
500 $ ./pnxmit -a 0x6c -s 0x10
502 13. RNDIS function
503 ==================
505 The function is provided by usb_f_rndis.ko module.
507 Function-specific configfs interface
508 ------------------------------------
510 The function name to use when creating the function directory is "rndis".
511 The RNDIS function provides these attributes in its function directory:
513         ifname          - network device interface name associated with this
514                         function instance
515         qmult           - queue length multiplier for high and super speed
516         host_addr       - MAC address of host's end of this
517                         Ethernet over USB link
518         dev_addr        - MAC address of device's end of this
519                         Ethernet over USB link
521 and after creating the functions/rndis.<instance name> they contain default
522 values: qmult is 5, dev_addr and host_addr are randomly selected.
523 Except for ifname they can be written to until the function is linked to a
524 configuration. The ifname is read-only and contains the name of the interface
525 which was assigned by the net core, e. g. usb0.
527 Testing the RNDIS function
528 --------------------------
530 Configure IP addresses of the device and the host. Then:
532 On the device: ping <host's IP>
533 On the host: ping <device's IP>
535 14. SERIAL function
536 ===================
538 The function is provided by usb_f_gser.ko module.
540 Function-specific configfs interface
541 ------------------------------------
543 The function name to use when creating the function directory is "gser".
544 The SERIAL function provides just one attribute in its function directory:
546         port_num
548 The attribute is read-only.
550 There can be at most 4 ACM/generic serial/OBEX ports in the system.
552 Testing the SERIAL function
553 ---------------------------
555 On host: insmod usbserial
556          echo VID PID >/sys/bus/usb-serial/drivers/generic/new_id
557 On host: cat > /dev/ttyUSB<X>
558 On target: cat /dev/ttyGS<Y>
560 then the other way round
562 On target: cat > /dev/ttyGS<Y>
563 On host: cat /dev/ttyUSB<X>
565 15. SOURCESINK function
566 =======================
568 The function is provided by usb_f_ss_lb.ko module.
570 Function-specific configfs interface
571 ------------------------------------
573 The function name to use when creating the function directory is "SourceSink".
574 The SOURCESINK function provides these attributes in its function directory:
576         pattern         - 0 (all zeros), 1 (mod63), 2 (none)
577         isoc_interval   - 1..16
578         isoc_maxpacket  - 0 - 1023 (fs), 0 - 1024 (hs/ss)
579         isoc_mult       - 0..2 (hs/ss only)
580         isoc_maxburst   - 0..15 (ss only)
581         bulk_buflen     - buffer length
582         bulk_qlen       - depth of queue for bulk
583         iso_qlen        - depth of queue for iso
585 Testing the SOURCESINK function
586 -------------------------------
588 device: run the gadget
589 host: test-usb (tools/usb/testusb.c)
592 16. UAC1 function
593 =================
595 The function is provided by usb_f_uac1.ko module.
597 Function-specific configfs interface
598 ------------------------------------
600 The function name to use when creating the function directory is "uac1".
601 The uac1 function provides these attributes in its function directory:
603         audio_buf_size - audio buffer size
604         fn_cap - capture pcm device file name
605         fn_cntl - control device file name
606         fn_play - playback pcm device file name
607         req_buf_size - ISO OUT endpoint request buffer size
608         req_count - ISO OUT endpoint request count
610 The attributes have sane default values.
612 Testing the UAC1 function
613 -------------------------
615 device: run the gadget
616 host: aplay -l # should list our USB Audio Gadget
618 17. UAC2 function
619 =================
621 The function is provided by usb_f_uac2.ko module.
623 Function-specific configfs interface
624 ------------------------------------
626 The function name to use when creating the function directory is "uac2".
627 The uac2 function provides these attributes in its function directory:
629         c_chmask - capture channel mask
630         c_srate - capture sampling rate
631         c_ssize - capture sample size (bytes)
632         p_chmask - playback channel mask
633         p_srate - playback sampling rate
634         p_ssize - playback sample size (bytes)
635         req_number - the number of pre-allocated request for both capture
636                      and playback
638 The attributes have sane default values.
640 Testing the UAC2 function
641 -------------------------
643 device: run the gadget
644 host: aplay -l # should list our USB Audio Gadget
646 This function does not require real hardware support, it just
647 sends a stream of audio data to/from the host. In order to
648 actually hear something at the device side, a command similar
649 to this must be used at the device side:
651 $ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
653 e.g.:
655 $ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \
656 aplay -D default:CARD=OdroidU3
658 18. UVC function
659 ================
661 The function is provided by usb_f_uvc.ko module.
663 Function-specific configfs interface
664 ------------------------------------
666 The function name to use when creating the function directory is "uvc".
667 The uvc function provides these attributes in its function directory:
669         streaming_interval - interval for polling endpoint for data transfers
670         streaming_maxburst - bMaxBurst for super speed companion descriptor
671         streaming_maxpacket - maximum packet size this endpoint is capable of
672                               sending or receiving when this configuration is
673                               selected
675 There are also "control" and "streaming" subdirectories, each of which contain
676 a number of their subdirectories. There are some sane defaults provided, but
677 the user must provide the following:
679         control header - create in control/header, link from control/class/fs
680                         and/or control/class/ss
681         streaming header - create in streaming/header, link from
682                         streaming/class/fs and/or streaming/class/hs and/or
683                         streaming/class/ss
684         format description - create in streaming/mjpeg and/or
685                         streaming/uncompressed
686         frame description - create in streaming/mjpeg/<format> and/or in
687                         streaming/uncompressed/<format>
689 Each frame description contains frame interval specification, and each
690 such specification consists of a number of lines with an inverval value
691 in each line. The rules stated above are best illustrated with an example:
693 # mkdir functions/uvc.usb0/control/header/h
694 # cd functions/uvc.usb0/control/header/h
695 # ln -s header/h class/fs
696 # ln -s header/h class/ss
697 # mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p
698 # cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval
699 666666
700 1000000
701 5000000
703 # cd $GADGET_CONFIGFS_ROOT
704 # mkdir functions/uvc.usb0/streaming/header/h
705 # cd functions/uvc.usb0/streaming/header/h
706 # ln -s ../../uncompressed/u
707 # cd ../../class/fs
708 # ln -s ../../header/h
709 # cd ../../class/hs
710 # ln -s ../../header/h
711 # cd ../../class/ss
712 # ln -s ../../header/h
715 Testing the UVC function
716 ------------------------
718 device: run the gadget, modprobe vivid
720 # uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
722 where uvc-gadget is this program:
723 http://git.ideasonboard.org/uvc-gadget.git
725 with these patches:
726 http://www.spinics.net/lists/linux-usb/msg99220.html
728 host: luvcview -f yuv
730 19. PRINTER function
731 ====================
733 The function is provided by usb_f_printer.ko module.
735 Function-specific configfs interface
736 ------------------------------------
738 The function name to use when creating the function directory is "printer".
739 The printer function provides these attributes in its function directory:
741         pnp_string      - Data to be passed to the host in pnp string
742         q_len           - Number of requests per endpoint
744 Testing the PRINTER function
745 ----------------------------
747 The most basic testing:
749 device: run the gadget
750 # ls -l /devices/virtual/usb_printer_gadget/
752 should show g_printer<number>.
754 If udev is active, then /dev/g_printer<number> should appear automatically.
756 host:
758 If udev is active, then e.g. /dev/usb/lp0 should appear.
760 host->device transmission:
762 device:
763 # cat /dev/g_printer<number>
764 host:
765 # cat > /dev/usb/lp0
767 device->host transmission:
769 # cat > /dev/g_printer<number>
770 host:
771 # cat /dev/usb/lp0
773 More advanced testing can be done with the prn_example
774 described in Documentation/usb/gadget-printer.txt.