1 This file summarizes information on basic testing of USB functions
11 8. MASS STORAGE function
18 15. SOURCESINK function
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:
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>
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
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
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>
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
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>
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
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:
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...|
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 ------------------------
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
220 - observe the keystrokes from the gadget
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
242 http://www.linux-usb.org/usbtest/testusb.c
244 8. MASS STORAGE function
245 ========================
247 The function is provided by usb_f_mass_storage.ko module.
249 Function-specific configfs interface
250 ------------------------------------
252 The function name to use when creating the function directory is "mass_storage".
253 The MASS STORAGE function provides these attributes in its directory:
256 stall - Set to permit function to halt bulk endpoints.
257 Disabled on some USB devices known not to work
258 correctly. You should set it to true.
259 num_buffers - Number of pipeline buffers. Valid numbers
260 are 2..4. Available only if
261 CONFIG_USB_GADGET_DEBUG_FILES is set.
263 and a default lun.0 directory corresponding to SCSI LUN #0.
265 A new lun can be added with mkdir:
267 $ mkdir functions/mass_storage.0/partition.5
269 Lun numbering does not have to be continuous, except for lun #0 which is
270 created by default. A maximum of 8 luns can be specified and they all must be
271 named following the <name>.<number> scheme. The numbers can be 0..8.
272 Probably a good convention is to name the luns "lun.<number>",
273 although it is not mandatory.
275 In each lun directory there are the following attribute files:
277 file - The path to the backing file for the LUN.
278 Required if LUN is not marked as removable.
279 ro - Flag specifying access to the LUN shall be
280 read-only. This is implied if CD-ROM emulation
281 is enabled as well as when it was impossible
282 to open "filename" in R/W mode.
283 removable - Flag specifying that LUN shall be indicated as
285 cdrom - Flag specifying that LUN shall be reported as
287 nofua - Flag specifying that FUA flag
290 Testing the MASS STORAGE function
291 ---------------------------------
293 device: connect the gadget, enable it
294 host: dmesg, see the USB drives appear (if system configured to automatically
300 The function is provided by usb_f_midi.ko module.
302 Function-specific configfs interface
303 ------------------------------------
305 The function name to use when creating the function directory is "midi".
306 The MIDI function provides these attributes in its function directory:
308 buflen - MIDI buffer length
309 id - ID string for the USB MIDI adapter
310 in_ports - number of MIDI input ports
311 index - index value for the USB MIDI adapter
312 out_ports - number of MIDI output ports
313 qlen - USB read request queue length
315 Testing the MIDI function
316 -------------------------
318 There are two cases: playing a mid from the gadget to
319 the host and playing a mid from the host to the gadget.
321 1) Playing a mid from the gadget to the host
325 Port Client name Port name
326 14:0 Midi Through Midi Through Port-0
327 24:0 MIDI Gadget MIDI Gadget MIDI 1
328 $ arecordmidi -p 24:0 from_gadget.mid
333 Port Client name Port name
336 $ aplaymidi -p 20:0 to_host.mid
338 2) Playing a mid from the host to the gadget
342 Port Client name Port name
345 $ arecordmidi -p 20:0 from_host.mid
350 Port Client name Port name
351 14:0 Midi Through Midi Through Port-0
352 24:0 MIDI Gadget MIDI Gadget MIDI 1
354 $ aplaymidi -p24:0 to_gadget.mid
356 The from_gadget.mid should sound identical to the to_host.mid.
357 The from_host.id should sound identical to the to_gadget.mid.
359 MIDI files can be played to speakers/headphones with e.g. timidity installed
362 Port Client name Port name
363 14:0 Midi Through Midi Through Port-0
364 24:0 MIDI Gadget MIDI Gadget MIDI 1
365 128:0 TiMidity TiMidity port 0
366 128:1 TiMidity TiMidity port 1
367 128:2 TiMidity TiMidity port 2
368 128:3 TiMidity TiMidity port 3
370 $ aplaymidi -p 128:0 file.mid
372 MIDI ports can be logically connected using the aconnect utility, e.g.:
374 $ aconnect 24:0 128:0 # try it on the host
376 After the gadget's MIDI port is connected to timidity's MIDI port,
377 whatever is played at the gadget side with aplaymidi -l is audible
378 in host's speakers/headphones.
383 The function is provided by usb_f_ncm.ko module.
385 Function-specific configfs interface
386 ------------------------------------
388 The function name to use when creating the function directory is "ncm".
389 The NCM function provides these attributes in its function directory:
391 ifname - network device interface name associated with this
393 qmult - queue length multiplier for high and super speed
394 host_addr - MAC address of host's end of this
395 Ethernet over USB link
396 dev_addr - MAC address of device's end of this
397 Ethernet over USB link
399 and after creating the functions/ncm.<instance name> they contain default
400 values: qmult is 5, dev_addr and host_addr are randomly selected.
401 Except for ifname they can be written to until the function is linked to a
402 configuration. The ifname is read-only and contains the name of the interface
403 which was assigned by the net core, e. g. usb0.
405 Testing the NCM function
406 ------------------------
408 Configure IP addresses of the device and the host. Then:
410 On the device: ping <host's IP>
411 On the host: ping <device's IP>
416 The function is provided by usb_f_obex.ko module.
418 Function-specific configfs interface
419 ------------------------------------
421 The function name to use when creating the function directory is "obex".
422 The OBEX function provides just one attribute in its function directory:
426 The attribute is read-only.
428 There can be at most 4 ACM/generic serial/OBEX ports in the system.
430 Testing the OBEX function
431 -------------------------
433 On device: seriald -f /dev/ttyGS<Y> -s 1024
434 On host: serialc -v <vendorID> -p <productID> -i<interface#> -a1 -s1024 \
435 -t<out endpoint addr> -r<in endpoint addr>
437 where seriald and serialc are Felipe's utilities found here:
439 https://git.gitorious.org/usb/usb-tools.git master
444 The function is provided by usb_f_phonet.ko module.
446 Function-specific configfs interface
447 ------------------------------------
449 The function name to use when creating the function directory is "phonet".
450 The PHONET function provides just one attribute in its function directory:
452 ifname - network device interface name associated with this
455 Testing the PHONET function
456 ---------------------------
458 It is not possible to test the SOCK_STREAM protocol without a specific piece
459 of hardware, so only SOCK_DGRAM has been tested. For the latter to work,
460 in the past I had to apply the patch mentioned here:
462 http://www.spinics.net/lists/linux-usb/msg85689.html
464 These tools are required:
466 git://git.gitorious.org/meego-cellular/phonet-utils.git
470 $ ./phonet -a 0x10 -i usbpn0
471 $ ./pnroute add 0x6c usbpn0
472 $./pnroute add 0x10 usbpn0
477 $ ./phonet -a 0x6c -i upnlink0
478 $ ./pnroute add 0x10 upnlink0
479 $ ifconfig upnlink0 up
481 Then a test program can be used:
483 http://www.spinics.net/lists/linux-usb/msg85690.html
487 $ ./pnxmit -a 0x6c -r
491 $ ./pnxmit -a 0x10 -s 0x6c
493 As a result some data should be sent from host to device.
494 Then the other way round:
498 $ ./pnxmit -a 0x10 -r
502 $ ./pnxmit -a 0x6c -s 0x10
507 The function is provided by usb_f_rndis.ko module.
509 Function-specific configfs interface
510 ------------------------------------
512 The function name to use when creating the function directory is "rndis".
513 The RNDIS function provides these attributes in its function directory:
515 ifname - network device interface name associated with this
517 qmult - queue length multiplier for high and super speed
518 host_addr - MAC address of host's end of this
519 Ethernet over USB link
520 dev_addr - MAC address of device's end of this
521 Ethernet over USB link
523 and after creating the functions/rndis.<instance name> they contain default
524 values: qmult is 5, dev_addr and host_addr are randomly selected.
525 Except for ifname they can be written to until the function is linked to a
526 configuration. The ifname is read-only and contains the name of the interface
527 which was assigned by the net core, e. g. usb0.
529 By default there can be only 1 RNDIS interface in the system.
531 Testing the RNDIS function
532 --------------------------
534 Configure IP addresses of the device and the host. Then:
536 On the device: ping <host's IP>
537 On the host: ping <device's IP>
542 The function is provided by usb_f_gser.ko module.
544 Function-specific configfs interface
545 ------------------------------------
547 The function name to use when creating the function directory is "gser".
548 The SERIAL function provides just one attribute in its function directory:
552 The attribute is read-only.
554 There can be at most 4 ACM/generic serial/OBEX ports in the system.
556 Testing the SERIAL function
557 ---------------------------
559 On host: insmod usbserial
560 echo VID PID >/sys/bus/usb-serial/drivers/generic/new_id
561 On host: cat > /dev/ttyUSB<X>
562 On target: cat /dev/ttyGS<Y>
564 then the other way round
566 On target: cat > /dev/ttyGS<Y>
567 On host: cat /dev/ttyUSB<X>
569 15. SOURCESINK function
570 =======================
572 The function is provided by usb_f_ss_lb.ko module.
574 Function-specific configfs interface
575 ------------------------------------
577 The function name to use when creating the function directory is "SourceSink".
578 The SOURCESINK function provides these attributes in its function directory:
580 pattern - 0 (all zeros), 1 (mod63), 2 (none)
581 isoc_interval - 1..16
582 isoc_maxpacket - 0 - 1023 (fs), 0 - 1024 (hs/ss)
583 isoc_mult - 0..2 (hs/ss only)
584 isoc_maxburst - 0..15 (ss only)
585 bulk_buflen - buffer length
587 Testing the SOURCESINK function
588 -------------------------------
590 device: run the gadget
593 http://www.linux-usb.org/usbtest/testusb.c
598 The function is provided by usb_f_uac1.ko module.
600 Function-specific configfs interface
601 ------------------------------------
603 The function name to use when creating the function directory is "uac1".
604 The uac1 function provides these attributes in its function directory:
606 audio_buf_size - audio buffer size
607 fn_cap - capture pcm device file name
608 fn_cntl - control device file name
609 fn_play - playback pcm device file name
610 req_buf_size - ISO OUT endpoint request buffer size
611 req_count - ISO OUT endpoint request count
613 The attributes have sane default values.
615 Testing the UAC1 function
616 -------------------------
618 device: run the gadget
619 host: aplay -l # should list our USB Audio Gadget
624 The function is provided by usb_f_uac2.ko module.
626 Function-specific configfs interface
627 ------------------------------------
629 The function name to use when creating the function directory is "uac2".
630 The uac2 function provides these attributes in its function directory:
632 chmask - capture channel mask
633 c_srate - capture sampling rate
634 c_ssize - capture sample size (bytes)
635 p_chmask - playback channel mask
636 p_srate - playback sampling rate
637 p_ssize - playback sample size (bytes)
639 The attributes have sane default values.
641 Testing the UAC2 function
642 -------------------------
644 device: run the gadget
645 host: aplay -l # should list our USB Audio Gadget
647 This function does not require real hardware support, it just
648 sends a stream of audio data to/from the host. In order to
649 actually hear something at the device side, a command similar
650 to this must be used at the device side:
652 $ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
656 $ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \
657 aplay -D default:CARD=OdroidU3
662 The function is provided by usb_f_uvc.ko module.
664 Function-specific configfs interface
665 ------------------------------------
667 The function name to use when creating the function directory is "uvc".
668 The uvc function provides these attributes in its function directory:
670 streaming_interval - interval for polling endpoint for data transfers
671 streaming_maxburst - bMaxBurst for super speed companion descriptor
672 streaming_maxpacket - maximum packet size this endpoint is capable of
673 sending or receiving when this configuration is
676 There are also "control" and "streaming" subdirectories, each of which contain
677 a number of their subdirectories. There are some sane defaults provided, but
678 the user must provide the following:
680 control header - create in control/header, link from control/class/fs
681 and/or control/class/ss
682 streaming header - create in streaming/header, link from
683 streaming/class/fs and/or streaming/class/hs and/or
685 format description - create in streaming/mjpeg and/or
686 streaming/uncompressed
687 frame description - create in streaming/mjpeg/<format> and/or in
688 streaming/uncompressed/<format>
690 Each frame description contains frame interval specification, and each
691 such specification consists of a number of lines with an inverval value
692 in each line. The rules stated above are best illustrated with an example:
694 # mkdir functions/uvc.usb0/control/header/h
695 # cd functions/uvc.usb0/control/header/h
696 # ln -s header/h class/fs
697 # ln -s header/h class/ss
698 # mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p
699 # cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval
704 # cd $GADGET_CONFIGFS_ROOT
705 # mkdir functions/uvc.usb0/streaming/header/h
706 # cd functions/uvc.usb0/streaming/header/h
707 # ln -s ../../uncompressed/u
709 # ln -s ../../header/h
711 # ln -s ../../header/h
713 # ln -s ../../header/h
716 Testing the UVC function
717 ------------------------
719 device: run the gadget, modprobe vivid
721 # uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
723 where uvc-gadget is this program:
724 http://git.ideasonboard.org/uvc-gadget.git
727 http://www.spinics.net/lists/linux-usb/msg99220.html
729 host: luvcview -f yuv
734 The function is provided by usb_f_printer.ko module.
736 Function-specific configfs interface
737 ------------------------------------
739 The function name to use when creating the function directory is "printer".
740 The printer function provides these attributes in its function directory:
742 pnp_string - Data to be passed to the host in pnp string
743 q_len - Number of requests per endpoint
745 Testing the PRINTER function
746 ----------------------------
748 The most basic testing:
750 device: run the gadget
751 # ls -l /devices/virtual/usb_printer_gadget/
753 should show g_printer<number>.
755 If udev is active, then /dev/g_printer<number> should appear automatically.
759 If udev is active, then e.g. /dev/usb/lp0 should appear.
761 host->device transmission:
764 # cat /dev/g_printer<number>
768 device->host transmission:
770 # cat > /dev/g_printer<number>
774 More advanced testing can be done with the prn_example
775 described in Documentation/usb/gadget-printer.txt.