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