xref: /linux/Documentation/usb/gadget-testing.rst (revision e65e175b07bef5974045cc42238de99057669ca7)
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	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
341			result in ejection.
342	=============== ==============================================
343
344Testing the MASS STORAGE function
345---------------------------------
346
347device: connect the gadget, enable it
348host: dmesg, see the USB drives appear (if system configured to automatically
349mount)
350
3519. MIDI function
352================
353
354The function is provided by usb_f_midi.ko module.
355
356Function-specific configfs interface
357------------------------------------
358
359The function name to use when creating the function directory is "midi".
360The MIDI function provides these attributes in its function directory:
361
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	=============== ====================================
370
371Testing the MIDI function
372-------------------------
373
374There are two cases: playing a mid from the gadget to
375the host and playing a mid from the host to the gadget.
376
3771) Playing a mid from the gadget to the host:
378
379host::
380
381  $ arecordmidi -l
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
386
387gadget::
388
389  $ aplaymidi -l
390   Port    Client name                      Port name
391   20:0    f_midi                           f_midi
392
393  $ aplaymidi -p 20:0 to_host.mid
394
3952) Playing a mid from the host to the gadget
396
397gadget::
398
399  $ arecordmidi -l
400   Port    Client name                      Port name
401   20:0    f_midi                           f_midi
402
403  $ arecordmidi -p 20:0 from_host.mid
404
405host::
406
407  $ aplaymidi -l
408   Port    Client name                      Port name
409   14:0    Midi Through                     Midi Through Port-0
410   24:0    MIDI Gadget                      MIDI Gadget MIDI 1
411
412  $ aplaymidi -p24:0 to_gadget.mid
413
414The from_gadget.mid should sound identical to the to_host.mid.
415
416The from_host.id should sound identical to the to_gadget.mid.
417
418MIDI files can be played to speakers/headphones with e.g. timidity installed::
419
420  $ aplaymidi -l
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
428
429  $ aplaymidi -p 128:0 file.mid
430
431MIDI ports can be logically connected using the aconnect utility, e.g.::
432
433  $ aconnect 24:0 128:0 # try it on the host
434
435After the gadget's MIDI port is connected to timidity's MIDI port,
436whatever is played at the gadget side with aplaymidi -l is audible
437in host's speakers/headphones.
438
43910. NCM function
440================
441
442The function is provided by usb_f_ncm.ko module.
443
444Function-specific configfs interface
445------------------------------------
446
447The function name to use when creating the function directory is "ncm".
448The NCM function provides these attributes in its function directory:
449
450	=============== ==================================================
451	ifname		network device interface name associated with this
452			function instance
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	=============== ==================================================
459
460and after creating the functions/ncm.<instance name> they contain default
461values: qmult is 5, dev_addr and host_addr are randomly selected.
462The ifname can be written to if the function is not bound. A write must be an
463interface pattern such as "usb%d", which will cause the net core to choose the
464next free usbX interface. By default, it is set to "usb%d".
465
466Testing the NCM function
467------------------------
468
469Configure IP addresses of the device and the host. Then:
470
471On the device::
472
473	ping <host's IP>
474
475On the host::
476
477	ping <device's IP>
478
47911. OBEX function
480=================
481
482The function is provided by usb_f_obex.ko module.
483
484Function-specific configfs interface
485------------------------------------
486
487The function name to use when creating the function directory is "obex".
488The OBEX function provides just one attribute in its function directory:
489
490	port_num
491
492The attribute is read-only.
493
494There can be at most 4 ACM/generic serial/OBEX ports in the system.
495
496Testing the OBEX function
497-------------------------
498
499On device::
500
501	seriald -f /dev/ttyGS<Y> -s 1024
502
503On host::
504
505	serialc -v <vendorID> -p <productID> -i<interface#> -a1 -s1024 \
506                -t<out endpoint addr> -r<in endpoint addr>
507
508where seriald and serialc are Felipe's utilities found here:
509
510	https://github.com/felipebalbi/usb-tools.git master
511
51212. PHONET function
513===================
514
515The function is provided by usb_f_phonet.ko module.
516
517Function-specific configfs interface
518------------------------------------
519
520The function name to use when creating the function directory is "phonet".
521The PHONET function provides just one attribute in its function directory:
522
523	=============== ==================================================
524	ifname		network device interface name associated with this
525			function instance
526	=============== ==================================================
527
528Testing the PHONET function
529---------------------------
530
531It is not possible to test the SOCK_STREAM protocol without a specific piece
532of hardware, so only SOCK_DGRAM has been tested. For the latter to work,
533in the past I had to apply the patch mentioned here:
534
535http://www.spinics.net/lists/linux-usb/msg85689.html
536
537These tools are required:
538
539git://git.gitorious.org/meego-cellular/phonet-utils.git
540
541On the host::
542
543	$ ./phonet -a 0x10 -i usbpn0
544	$ ./pnroute add 0x6c usbpn0
545	$./pnroute add 0x10 usbpn0
546	$ ifconfig usbpn0 up
547
548On the device::
549
550	$ ./phonet -a 0x6c -i upnlink0
551	$ ./pnroute add 0x10 upnlink0
552	$ ifconfig upnlink0 up
553
554Then a test program can be used::
555
556	http://www.spinics.net/lists/linux-usb/msg85690.html
557
558On the device::
559
560	$ ./pnxmit -a 0x6c -r
561
562On the host::
563
564	$ ./pnxmit -a 0x10 -s 0x6c
565
566As a result some data should be sent from host to device.
567Then the other way round:
568
569On the host::
570
571	$ ./pnxmit -a 0x10 -r
572
573On the device::
574
575	$ ./pnxmit -a 0x6c -s 0x10
576
57713. RNDIS function
578==================
579
580The function is provided by usb_f_rndis.ko module.
581
582Function-specific configfs interface
583------------------------------------
584
585The function name to use when creating the function directory is "rndis".
586The RNDIS function provides these attributes in its function directory:
587
588	=============== ==================================================
589	ifname		network device interface name associated with this
590			function instance
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	=============== ==================================================
597
598and after creating the functions/rndis.<instance name> they contain default
599values: qmult is 5, dev_addr and host_addr are randomly selected.
600The ifname can be written to if the function is not bound. A write must be an
601interface pattern such as "usb%d", which will cause the net core to choose the
602next free usbX interface. By default, it is set to "usb%d".
603
604Testing the RNDIS function
605--------------------------
606
607Configure IP addresses of the device and the host. Then:
608
609On the device::
610
611	ping <host's IP>
612
613On the host::
614
615	ping <device's IP>
616
61714. SERIAL function
618===================
619
620The function is provided by usb_f_gser.ko module.
621
622Function-specific configfs interface
623------------------------------------
624
625The function name to use when creating the function directory is "gser".
626The SERIAL function provides just one attribute in its function directory:
627
628	port_num
629
630The attribute is read-only.
631
632There can be at most 4 ACM/generic serial/OBEX ports in the system.
633
634Testing the SERIAL function
635---------------------------
636
637On host::
638
639	insmod usbserial
640	echo VID PID >/sys/bus/usb-serial/drivers/generic/new_id
641
642On host::
643
644	cat > /dev/ttyUSB<X>
645
646On target::
647
648	cat /dev/ttyGS<Y>
649
650then the other way round
651
652On target::
653
654	cat > /dev/ttyGS<Y>
655
656On host::
657
658	cat /dev/ttyUSB<X>
659
66015. SOURCESINK function
661=======================
662
663The function is provided by usb_f_ss_lb.ko module.
664
665Function-specific configfs interface
666------------------------------------
667
668The function name to use when creating the function directory is "SourceSink".
669The SOURCESINK function provides these attributes in its function directory:
670
671	=============== ==================================
672	pattern		0 (all zeros), 1 (mod63), 2 (none)
673	isoc_interval	1..16
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	=============== ==================================
681
682Testing the SOURCESINK function
683-------------------------------
684
685device: run the gadget
686
687host: test-usb (tools/usb/testusb.c)
688
689
69016. UAC1 function (legacy implementation)
691=========================================
692
693The function is provided by usb_f_uac1_legacy.ko module.
694
695Function-specific configfs interface
696------------------------------------
697
698The function name to use when creating the function directory
699is "uac1_legacy".
700The uac1 function provides these attributes in its function directory:
701
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	=============== ====================================
710
711The attributes have sane default values.
712
713Testing the UAC1 function
714-------------------------
715
716device: run the gadget
717
718host::
719
720	aplay -l # should list our USB Audio Gadget
721
72217. UAC2 function
723=================
724
725The function is provided by usb_f_uac2.ko module.
726
727Function-specific configfs interface
728------------------------------------
729
730The function name to use when creating the function directory is "uac2".
731The uac2 function provides these attributes in its function directory:
732
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
755	                 and playback
756	function_name    name of the interface
757	================ ====================================================
758
759The attributes have sane default values.
760
761Testing the UAC2 function
762-------------------------
763
764device: run the gadget
765host: aplay -l # should list our USB Audio Gadget
766
767This function does not require real hardware support, it just
768sends a stream of audio data to/from the host. In order to
769actually hear something at the device side, a command similar
770to this must be used at the device side::
771
772	$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
773
774e.g.::
775
776	$ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \
777	  aplay -D default:CARD=OdroidU3
778
77918. UVC function
780================
781
782The function is provided by usb_f_uvc.ko module.
783
784Function-specific configfs interface
785------------------------------------
786
787The function name to use when creating the function directory is "uvc".
788The uvc function provides these attributes in its function directory:
789
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
795			    selected
796	function_name       name of the interface
797	=================== ================================================
798
799There are also "control" and "streaming" subdirectories, each of which contain
800a number of their subdirectories. There are some sane defaults provided, but
801the user must provide the following:
802
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
808			   streaming/class/ss
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	================== ====================================================
814
815Each frame description contains frame interval specification, and each
816such specification consists of a number of lines with an inverval value
817in each line. The rules stated above are best illustrated with an example::
818
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
825  666666
826  1000000
827  5000000
828  EOF
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
833  # cd ../../class/fs
834  # ln -s ../../header/h
835  # cd ../../class/hs
836  # ln -s ../../header/h
837  # cd ../../class/ss
838  # ln -s ../../header/h
839
840
841Testing the UVC function
842------------------------
843
844device: run the gadget, modprobe vivid::
845
846  # uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
847
848where uvc-gadget is this program:
849	http://git.ideasonboard.org/uvc-gadget.git
850
851with these patches:
852
853	http://www.spinics.net/lists/linux-usb/msg99220.html
854
855host::
856
857	luvcview -f yuv
858
85919. PRINTER function
860====================
861
862The function is provided by usb_f_printer.ko module.
863
864Function-specific configfs interface
865------------------------------------
866
867The function name to use when creating the function directory is "printer".
868The printer function provides these attributes in its function directory:
869
870	==========	===========================================
871	pnp_string	Data to be passed to the host in pnp string
872	q_len		Number of requests per endpoint
873	==========	===========================================
874
875Testing the PRINTER function
876----------------------------
877
878The most basic testing:
879
880device: run the gadget::
881
882	# ls -l /devices/virtual/usb_printer_gadget/
883
884should show g_printer<number>.
885
886If udev is active, then /dev/g_printer<number> should appear automatically.
887
888host:
889
890If udev is active, then e.g. /dev/usb/lp0 should appear.
891
892host->device transmission:
893
894device::
895
896	# cat /dev/g_printer<number>
897
898host::
899
900	# cat > /dev/usb/lp0
901
902device->host transmission::
903
904	# cat > /dev/g_printer<number>
905
906host::
907
908	# cat /dev/usb/lp0
909
910More advanced testing can be done with the prn_example
911described in Documentation/usb/gadget_printer.rst.
912
913
91420. UAC1 function (virtual ALSA card, using u_audio API)
915========================================================
916
917The function is provided by usb_f_uac1.ko module.
918It will create a virtual ALSA card and the audio streams are simply
919sinked to and sourced from it.
920
921Function-specific configfs interface
922------------------------------------
923
924The function name to use when creating the function directory is "uac1".
925The uac1 function provides these attributes in its function directory:
926
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
945	                 and playback
946	function_name    name of the interface
947	================ ====================================================
948
949The attributes have sane default values.
950
951Testing the UAC1 function
952-------------------------
953
954device: run the gadget
955host: aplay -l # should list our USB Audio Gadget
956
957This function does not require real hardware support, it just
958sends a stream of audio data to/from the host. In order to
959actually hear something at the device side, a command similar
960to this must be used at the device side::
961
962	$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &
963
964e.g.::
965
966	$ arecord -f dat -t wav -D hw:CARD=UAC1Gadget,DEV=0 | \
967	  aplay -D default:CARD=OdroidU3
968