5 This file summarizes information on basic testing of USB functions
12 3. ECM subset function
17 8. MASS STORAGE function
24 15. SOURCESINK function
25 16. UAC1 function (legacy implementation)
29 20. UAC1 function (new API)
35 The function is provided by usb_f_acm.ko module.
37 Function-specific configfs interface
38 ------------------------------------
40 The function name to use when creating the function directory is "acm".
41 The ACM function provides just one attribute in its function directory:
45 The attribute is read-only.
47 There can be at most 4 ACM/generic serial/OBEX ports in the system.
50 Testing the ACM function
51 ------------------------
61 then the other way round
74 The function is provided by usb_f_ecm.ko module.
76 Function-specific configfs interface
77 ------------------------------------
79 The function name to use when creating the function directory is "ecm".
80 The ECM function provides these attributes in its function directory:
82 =============== ==================================================
83 ifname network device interface name associated with this
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 =============== ==================================================
92 and after creating the functions/ecm.<instance name> they contain default
93 values: qmult is 5, dev_addr and host_addr are randomly selected.
94 The ifname can be written to if the function is not bound. A write must be an
95 interface pattern such as "usb%d", which will cause the net core to choose the
96 next free usbX interface. By default, it is set to "usb%d".
98 Testing the ECM function
99 ------------------------
101 Configure IP addresses of the device and the host. Then:
111 3. ECM subset function
112 ======================
114 The function is provided by usb_f_ecm_subset.ko module.
116 Function-specific configfs interface
117 ------------------------------------
119 The function name to use when creating the function directory is "geth".
120 The ECM subset function provides these attributes in its function directory:
122 =============== ==================================================
123 ifname network device interface name associated with this
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 =============== ==================================================
132 and after creating the functions/ecm.<instance name> they contain default
133 values: qmult is 5, dev_addr and host_addr are randomly selected.
134 The ifname can be written to if the function is not bound. A write must be an
135 interface pattern such as "usb%d", which will cause the net core to choose the
136 next free usbX interface. By default, it is set to "usb%d".
138 Testing the ECM subset function
139 -------------------------------
141 Configure IP addresses of the device and the host. Then:
154 The function is provided by usb_f_eem.ko module.
156 Function-specific configfs interface
157 ------------------------------------
159 The function name to use when creating the function directory is "eem".
160 The EEM function provides these attributes in its function directory:
162 =============== ==================================================
163 ifname network device interface name associated with this
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 =============== ==================================================
172 and after creating the functions/eem.<instance name> they contain default
173 values: qmult is 5, dev_addr and host_addr are randomly selected.
174 The ifname can be written to if the function is not bound. A write must be an
175 interface pattern such as "usb%d", which will cause the net core to choose the
176 next free usbX interface. By default, it is set to "usb%d".
178 Testing the EEM function
179 ------------------------
181 Configure IP addresses of the device and the host. Then:
194 The function is provided by usb_f_fs.ko module.
196 Function-specific configfs interface
197 ------------------------------------
199 The function name to use when creating the function directory is "ffs".
200 The function directory is intentionally empty and not modifiable.
202 After creating the directory there is a new instance (a "device") of FunctionFS
203 available in the system. Once a "device" is available, the user should follow
204 the standard procedure for using FunctionFS (mount it, run the userspace
205 process which implements the function proper). The gadget should be enabled
206 by writing a suitable string to usb_gadget/<gadget>/UDC.
208 Testing the FFS function
209 ------------------------
211 On the device: start the function's userspace daemon, enable the gadget
213 On the host: use the USB function provided by the device
218 The function is provided by usb_f_hid.ko module.
220 Function-specific configfs interface
221 ------------------------------------
223 The function name to use when creating the function directory is "hid".
224 The HID function provides these attributes in its function directory:
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 =============== ===========================================
234 For a keyboard the protocol and the subclass are 1, the report_length is 8,
235 while the report_desc is::
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...|
244 Such a sequence of bytes can be stored to the attribute with echo::
246 $ echo -ne \\x05\\x01\\x09\\x06\\xa1.....
248 Testing the HID function
249 ------------------------
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::
259 $ ./hid_gadget_test /dev/hidg0 keyboard
263 - observe the keystrokes from the gadget
268 The function is provided by usb_f_ss_lb.ko module.
270 Function-specific configfs interface
271 ------------------------------------
273 The function name to use when creating the function directory is "Loopback".
274 The LOOPBACK function provides these attributes in its function directory:
276 =============== =======================
277 qlen depth of loopback queue
278 bulk_buflen buffer length
279 =============== =======================
281 Testing the LOOPBACK function
282 -----------------------------
284 device: run the gadget
286 host: test-usb (tools/usb/testusb.c)
288 8. MASS STORAGE function
289 ========================
291 The function is provided by usb_f_mass_storage.ko module.
293 Function-specific configfs interface
294 ------------------------------------
296 The function name to use when creating the function directory is "mass_storage".
297 The MASS STORAGE function provides these attributes in its directory:
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 =============== ==============================================
309 and a default lun.0 directory corresponding to SCSI LUN #0.
311 A new lun can be added with mkdir::
313 $ mkdir functions/mass_storage.0/partition.5
315 Lun numbering does not have to be continuous, except for lun #0 which is
316 created by default. A maximum of 8 luns can be specified and they all must be
317 named following the <name>.<number> scheme. The numbers can be 0..8.
318 Probably a good convention is to name the luns "lun.<number>",
319 although it is not mandatory.
321 In each lun directory there are the following attribute files:
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
332 cdrom Flag specifying that LUN shall be reported as
334 nofua Flag specifying that FUA flag
336 forced_eject This write-only file is useful only when
337 the function is active. It causes the backing
338 file to be forcibly detached from the LUN,
339 regardless of whether the host has allowed it.
340 Any non-zero number of bytes written will
342 =============== ==============================================
344 Testing the MASS STORAGE function
345 ---------------------------------
347 device: connect the gadget, enable it
348 host: dmesg, see the USB drives appear (if system configured to automatically
354 The function is provided by usb_f_midi.ko module.
356 Function-specific configfs interface
357 ------------------------------------
359 The function name to use when creating the function directory is "midi".
360 The MIDI function provides these attributes in its function directory:
362 =============== ====================================
363 buflen MIDI buffer length
364 id ID string for the USB MIDI adapter
365 in_ports number of MIDI input ports
366 index index value for the USB MIDI adapter
367 out_ports number of MIDI output ports
368 qlen USB read request queue length
369 =============== ====================================
371 Testing the MIDI function
372 -------------------------
374 There are two cases: playing a mid from the gadget to
375 the host and playing a mid from the host to the gadget.
377 1) Playing a mid from the gadget to the host:
382 Port Client name Port name
383 14:0 Midi Through Midi Through Port-0
384 24:0 MIDI Gadget MIDI Gadget MIDI 1
385 $ arecordmidi -p 24:0 from_gadget.mid
390 Port Client name Port name
393 $ aplaymidi -p 20:0 to_host.mid
395 2) Playing a mid from the host to the gadget
400 Port Client name Port name
403 $ arecordmidi -p 20:0 from_host.mid
408 Port Client name Port name
409 14:0 Midi Through Midi Through Port-0
410 24:0 MIDI Gadget MIDI Gadget MIDI 1
412 $ aplaymidi -p24:0 to_gadget.mid
414 The from_gadget.mid should sound identical to the to_host.mid.
416 The from_host.id should sound identical to the to_gadget.mid.
418 MIDI files can be played to speakers/headphones with e.g. timidity installed::
421 Port Client name Port name
422 14:0 Midi Through Midi Through Port-0
423 24:0 MIDI Gadget MIDI Gadget MIDI 1
424 128:0 TiMidity TiMidity port 0
425 128:1 TiMidity TiMidity port 1
426 128:2 TiMidity TiMidity port 2
427 128:3 TiMidity TiMidity port 3
429 $ aplaymidi -p 128:0 file.mid
431 MIDI ports can be logically connected using the aconnect utility, e.g.::
433 $ aconnect 24:0 128:0 # try it on the host
435 After the gadget's MIDI port is connected to timidity's MIDI port,
436 whatever is played at the gadget side with aplaymidi -l is audible
437 in host's speakers/headphones.
442 The function is provided by usb_f_ncm.ko module.
444 Function-specific configfs interface
445 ------------------------------------
447 The function name to use when creating the function directory is "ncm".
448 The NCM function provides these attributes in its function directory:
450 =============== ==================================================
451 ifname network device interface name associated with this
453 qmult queue length multiplier for high and super speed
454 host_addr MAC address of host's end of this
455 Ethernet over USB link
456 dev_addr MAC address of device's end of this
457 Ethernet over USB link
458 =============== ==================================================
460 and after creating the functions/ncm.<instance name> they contain default
461 values: qmult is 5, dev_addr and host_addr are randomly selected.
462 The ifname can be written to if the function is not bound. A write must be an
463 interface pattern such as "usb%d", which will cause the net core to choose the
464 next free usbX interface. By default, it is set to "usb%d".
466 Testing the NCM function
467 ------------------------
469 Configure IP addresses of the device and the host. Then:
482 The function is provided by usb_f_obex.ko module.
484 Function-specific configfs interface
485 ------------------------------------
487 The function name to use when creating the function directory is "obex".
488 The OBEX function provides just one attribute in its function directory:
492 The attribute is read-only.
494 There can be at most 4 ACM/generic serial/OBEX ports in the system.
496 Testing the OBEX function
497 -------------------------
501 seriald -f /dev/ttyGS<Y> -s 1024
505 serialc -v <vendorID> -p <productID> -i<interface#> -a1 -s1024 \
506 -t<out endpoint addr> -r<in endpoint addr>
508 where seriald and serialc are Felipe's utilities found here:
510 https://github.com/felipebalbi/usb-tools.git master
515 The function is provided by usb_f_phonet.ko module.
517 Function-specific configfs interface
518 ------------------------------------
520 The function name to use when creating the function directory is "phonet".
521 The PHONET function provides just one attribute in its function directory:
523 =============== ==================================================
524 ifname network device interface name associated with this
526 =============== ==================================================
528 Testing the PHONET function
529 ---------------------------
531 It is not possible to test the SOCK_STREAM protocol without a specific piece
532 of hardware, so only SOCK_DGRAM has been tested. For the latter to work,
533 in the past I had to apply the patch mentioned here:
535 http://www.spinics.net/lists/linux-usb/msg85689.html
537 These tools are required:
539 git://git.gitorious.org/meego-cellular/phonet-utils.git
543 $ ./phonet -a 0x10 -i usbpn0
544 $ ./pnroute add 0x6c usbpn0
545 $./pnroute add 0x10 usbpn0
550 $ ./phonet -a 0x6c -i upnlink0
551 $ ./pnroute add 0x10 upnlink0
552 $ ifconfig upnlink0 up
554 Then a test program can be used::
556 http://www.spinics.net/lists/linux-usb/msg85690.html
560 $ ./pnxmit -a 0x6c -r
564 $ ./pnxmit -a 0x10 -s 0x6c
566 As a result some data should be sent from host to device.
567 Then the other way round:
571 $ ./pnxmit -a 0x10 -r
575 $ ./pnxmit -a 0x6c -s 0x10
580 The function is provided by usb_f_rndis.ko module.
582 Function-specific configfs interface
583 ------------------------------------
585 The function name to use when creating the function directory is "rndis".
586 The RNDIS function provides these attributes in its function directory:
588 =============== ==================================================
589 ifname network device interface name associated with this
591 qmult queue length multiplier for high and super speed
592 host_addr MAC address of host's end of this
593 Ethernet over USB link
594 dev_addr MAC address of device's end of this
595 Ethernet over USB link
596 =============== ==================================================
598 and after creating the functions/rndis.<instance name> they contain default
599 values: qmult is 5, dev_addr and host_addr are randomly selected.
600 The ifname can be written to if the function is not bound. A write must be an
601 interface pattern such as "usb%d", which will cause the net core to choose the
602 next free usbX interface. By default, it is set to "usb%d".
604 Testing the RNDIS function
605 --------------------------
607 Configure IP addresses of the device and the host. Then:
620 The function is provided by usb_f_gser.ko module.
622 Function-specific configfs interface
623 ------------------------------------
625 The function name to use when creating the function directory is "gser".
626 The SERIAL function provides just one attribute in its function directory:
630 The attribute is read-only.
632 There can be at most 4 ACM/generic serial/OBEX ports in the system.
634 Testing the SERIAL function
635 ---------------------------
640 echo VID PID >/sys/bus/usb-serial/drivers/generic/new_id
650 then the other way round
660 15. SOURCESINK function
661 =======================
663 The function is provided by usb_f_ss_lb.ko module.
665 Function-specific configfs interface
666 ------------------------------------
668 The function name to use when creating the function directory is "SourceSink".
669 The SOURCESINK function provides these attributes in its function directory:
671 =============== ==================================
672 pattern 0 (all zeros), 1 (mod63), 2 (none)
674 isoc_maxpacket 0 - 1023 (fs), 0 - 1024 (hs/ss)
675 isoc_mult 0..2 (hs/ss only)
676 isoc_maxburst 0..15 (ss only)
677 bulk_buflen buffer length
678 bulk_qlen depth of queue for bulk
679 iso_qlen depth of queue for iso
680 =============== ==================================
682 Testing the SOURCESINK function
683 -------------------------------
685 device: run the gadget
687 host: test-usb (tools/usb/testusb.c)
690 16. UAC1 function (legacy implementation)
691 =========================================
693 The function is provided by usb_f_uac1_legacy.ko module.
695 Function-specific configfs interface
696 ------------------------------------
698 The function name to use when creating the function directory
700 The uac1 function provides these attributes in its function directory:
702 =============== ====================================
703 audio_buf_size audio buffer size
704 fn_cap capture pcm device file name
705 fn_cntl control device file name
706 fn_play playback pcm device file name
707 req_buf_size ISO OUT endpoint request buffer size
708 req_count ISO OUT endpoint request count
709 =============== ====================================
711 The attributes have sane default values.
713 Testing the UAC1 function
714 -------------------------
716 device: run the gadget
720 aplay -l # should list our USB Audio Gadget
725 The function is provided by usb_f_uac2.ko module.
727 Function-specific configfs interface
728 ------------------------------------
730 The function name to use when creating the function directory is "uac2".
731 The uac2 function provides these attributes in its function directory:
733 ================ ====================================================
734 c_chmask capture channel mask
735 c_srate list of capture sampling rates (comma-separated)
736 c_ssize capture sample size (bytes)
737 c_sync capture synchronization type (async/adaptive)
738 c_mute_present capture mute control enable
739 c_volume_present capture volume control enable
740 c_volume_min capture volume control min value (in 1/256 dB)
741 c_volume_max capture volume control max value (in 1/256 dB)
742 c_volume_res capture volume control resolution (in 1/256 dB)
743 c_hs_bint capture bInterval for HS/SS (1-4: fixed, 0: auto)
744 fb_max maximum extra bandwidth in async mode
745 p_chmask playback channel mask
746 p_srate list of playback sampling rates (comma-separated)
747 p_ssize playback sample size (bytes)
748 p_mute_present playback mute control enable
749 p_volume_present playback volume control enable
750 p_volume_min playback volume control min value (in 1/256 dB)
751 p_volume_max playback volume control max value (in 1/256 dB)
752 p_volume_res playback volume control resolution (in 1/256 dB)
753 p_hs_bint playback bInterval for HS/SS (1-4: fixed, 0: auto)
754 req_number the number of pre-allocated request for both capture
756 function_name name of the interface
757 ================ ====================================================
759 The attributes have sane default values.
761 Testing the UAC2 function
762 -------------------------
764 device: run the gadget
765 host: aplay -l # should list our USB Audio Gadget
767 This function does not require real hardware support, it just
768 sends a stream of audio data to/from the host. In order to
769 actually hear something at the device side, a command similar
770 to this must be used at the device side::
772 $ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
776 $ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \
777 aplay -D default:CARD=OdroidU3
782 The function is provided by usb_f_uvc.ko module.
784 Function-specific configfs interface
785 ------------------------------------
787 The function name to use when creating the function directory is "uvc".
788 The uvc function provides these attributes in its function directory:
790 =================== ================================================
791 streaming_interval interval for polling endpoint for data transfers
792 streaming_maxburst bMaxBurst for super speed companion descriptor
793 streaming_maxpacket maximum packet size this endpoint is capable of
794 sending or receiving when this configuration is
796 function_name name of the interface
797 =================== ================================================
799 There are also "control" and "streaming" subdirectories, each of which contain
800 a number of their subdirectories. There are some sane defaults provided, but
801 the user must provide the following:
803 ================== ====================================================
804 control header create in control/header, link from control/class/fs
805 and/or control/class/ss
806 streaming header create in streaming/header, link from
807 streaming/class/fs and/or streaming/class/hs and/or
809 format description create in streaming/mjpeg and/or
810 streaming/uncompressed
811 frame description create in streaming/mjpeg/<format> and/or in
812 streaming/uncompressed/<format>
813 ================== ====================================================
815 Each frame description contains frame interval specification, and each
816 such specification consists of a number of lines with an inverval value
817 in each line. The rules stated above are best illustrated with an example::
819 # mkdir functions/uvc.usb0/control/header/h
820 # cd functions/uvc.usb0/control/
821 # ln -s header/h class/fs
822 # ln -s header/h class/ss
823 # mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p
824 # cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval
829 # cd $GADGET_CONFIGFS_ROOT
830 # mkdir functions/uvc.usb0/streaming/header/h
831 # cd functions/uvc.usb0/streaming/header/h
832 # ln -s ../../uncompressed/u
834 # ln -s ../../header/h
836 # ln -s ../../header/h
838 # ln -s ../../header/h
841 Testing the UVC function
842 ------------------------
844 device: run the gadget, modprobe vivid::
846 # uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
848 where uvc-gadget is this program:
849 http://git.ideasonboard.org/uvc-gadget.git
853 http://www.spinics.net/lists/linux-usb/msg99220.html
862 The function is provided by usb_f_printer.ko module.
864 Function-specific configfs interface
865 ------------------------------------
867 The function name to use when creating the function directory is "printer".
868 The printer function provides these attributes in its function directory:
870 ========== ===========================================
871 pnp_string Data to be passed to the host in pnp string
872 q_len Number of requests per endpoint
873 ========== ===========================================
875 Testing the PRINTER function
876 ----------------------------
878 The most basic testing:
880 device: run the gadget::
882 # ls -l /devices/virtual/usb_printer_gadget/
884 should show g_printer<number>.
886 If udev is active, then /dev/g_printer<number> should appear automatically.
890 If udev is active, then e.g. /dev/usb/lp0 should appear.
892 host->device transmission:
896 # cat /dev/g_printer<number>
902 device->host transmission::
904 # cat > /dev/g_printer<number>
910 More advanced testing can be done with the prn_example
911 described in Documentation/usb/gadget_printer.rst.
914 20. UAC1 function (virtual ALSA card, using u_audio API)
915 ========================================================
917 The function is provided by usb_f_uac1.ko module.
918 It will create a virtual ALSA card and the audio streams are simply
919 sinked to and sourced from it.
921 Function-specific configfs interface
922 ------------------------------------
924 The function name to use when creating the function directory is "uac1".
925 The uac1 function provides these attributes in its function directory:
927 ================ ====================================================
928 c_chmask capture channel mask
929 c_srate list of capture sampling rates (comma-separated)
930 c_ssize capture sample size (bytes)
931 c_mute_present capture mute control enable
932 c_volume_present capture volume control enable
933 c_volume_min capture volume control min value (in 1/256 dB)
934 c_volume_max capture volume control max value (in 1/256 dB)
935 c_volume_res capture volume control resolution (in 1/256 dB)
936 p_chmask playback channel mask
937 p_srate list of playback sampling rates (comma-separated)
938 p_ssize playback sample size (bytes)
939 p_mute_present playback mute control enable
940 p_volume_present playback volume control enable
941 p_volume_min playback volume control min value (in 1/256 dB)
942 p_volume_max playback volume control max value (in 1/256 dB)
943 p_volume_res playback volume control resolution (in 1/256 dB)
944 req_number the number of pre-allocated requests for both capture
946 function_name name of the interface
947 ================ ====================================================
949 The attributes have sane default values.
951 Testing the UAC1 function
952 -------------------------
954 device: run the gadget
955 host: aplay -l # should list our USB Audio Gadget
957 This function does not require real hardware support, it just
958 sends a stream of audio data to/from the host. In order to
959 actually hear something at the device side, a command similar
960 to this must be used at the device side::
962 $ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
966 $ arecord -f dat -t wav -D hw:CARD=UAC1Gadget,DEV=0 | \
967 aplay -D default:CARD=OdroidU3