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 c_sync capture synchronization type (async/adaptive) 732 c_mute_present capture mute control enable 733 c_volume_present capture volume control enable 734 c_volume_min capture volume control min value (in 1/256 dB) 735 c_volume_max capture volume control max value (in 1/256 dB) 736 c_volume_res capture volume control resolution (in 1/256 dB) 737 fb_max maximum extra bandwidth in async mode 738 p_chmask playback channel mask 739 p_srate playback sampling rate 740 p_ssize playback sample size (bytes) 741 p_mute_present playback mute control enable 742 p_volume_present playback volume control enable 743 p_volume_min playback volume control min value (in 1/256 dB) 744 p_volume_max playback volume control max value (in 1/256 dB) 745 p_volume_res playback volume control resolution (in 1/256 dB) 746 req_number the number of pre-allocated request for both capture 747 and playback 748 ================ ==================================================== 749 750The attributes have sane default values. 751 752Testing the UAC2 function 753------------------------- 754 755device: run the gadget 756host: aplay -l # should list our USB Audio Gadget 757 758This function does not require real hardware support, it just 759sends a stream of audio data to/from the host. In order to 760actually hear something at the device side, a command similar 761to this must be used at the device side:: 762 763 $ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 & 764 765e.g.:: 766 767 $ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \ 768 aplay -D default:CARD=OdroidU3 769 77018. UVC function 771================ 772 773The function is provided by usb_f_uvc.ko module. 774 775Function-specific configfs interface 776------------------------------------ 777 778The function name to use when creating the function directory is "uvc". 779The uvc function provides these attributes in its function directory: 780 781 =================== ================================================ 782 streaming_interval interval for polling endpoint for data transfers 783 streaming_maxburst bMaxBurst for super speed companion descriptor 784 streaming_maxpacket maximum packet size this endpoint is capable of 785 sending or receiving when this configuration is 786 selected 787 =================== ================================================ 788 789There are also "control" and "streaming" subdirectories, each of which contain 790a number of their subdirectories. There are some sane defaults provided, but 791the user must provide the following: 792 793 ================== ==================================================== 794 control header create in control/header, link from control/class/fs 795 and/or control/class/ss 796 streaming header create in streaming/header, link from 797 streaming/class/fs and/or streaming/class/hs and/or 798 streaming/class/ss 799 format description create in streaming/mjpeg and/or 800 streaming/uncompressed 801 frame description create in streaming/mjpeg/<format> and/or in 802 streaming/uncompressed/<format> 803 ================== ==================================================== 804 805Each frame description contains frame interval specification, and each 806such specification consists of a number of lines with an inverval value 807in each line. The rules stated above are best illustrated with an example:: 808 809 # mkdir functions/uvc.usb0/control/header/h 810 # cd functions/uvc.usb0/control/ 811 # ln -s header/h class/fs 812 # ln -s header/h class/ss 813 # mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p 814 # cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval 815 666666 816 1000000 817 5000000 818 EOF 819 # cd $GADGET_CONFIGFS_ROOT 820 # mkdir functions/uvc.usb0/streaming/header/h 821 # cd functions/uvc.usb0/streaming/header/h 822 # ln -s ../../uncompressed/u 823 # cd ../../class/fs 824 # ln -s ../../header/h 825 # cd ../../class/hs 826 # ln -s ../../header/h 827 # cd ../../class/ss 828 # ln -s ../../header/h 829 830 831Testing the UVC function 832------------------------ 833 834device: run the gadget, modprobe vivid:: 835 836 # uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #> 837 838where uvc-gadget is this program: 839 http://git.ideasonboard.org/uvc-gadget.git 840 841with these patches: 842 843 http://www.spinics.net/lists/linux-usb/msg99220.html 844 845host:: 846 847 luvcview -f yuv 848 84919. PRINTER function 850==================== 851 852The function is provided by usb_f_printer.ko module. 853 854Function-specific configfs interface 855------------------------------------ 856 857The function name to use when creating the function directory is "printer". 858The printer function provides these attributes in its function directory: 859 860 ========== =========================================== 861 pnp_string Data to be passed to the host in pnp string 862 q_len Number of requests per endpoint 863 ========== =========================================== 864 865Testing the PRINTER function 866---------------------------- 867 868The most basic testing: 869 870device: run the gadget:: 871 872 # ls -l /devices/virtual/usb_printer_gadget/ 873 874should show g_printer<number>. 875 876If udev is active, then /dev/g_printer<number> should appear automatically. 877 878host: 879 880If udev is active, then e.g. /dev/usb/lp0 should appear. 881 882host->device transmission: 883 884device:: 885 886 # cat /dev/g_printer<number> 887 888host:: 889 890 # cat > /dev/usb/lp0 891 892device->host transmission:: 893 894 # cat > /dev/g_printer<number> 895 896host:: 897 898 # cat /dev/usb/lp0 899 900More advanced testing can be done with the prn_example 901described in Documentation/usb/gadget_printer.rst. 902 903 90420. UAC1 function (virtual ALSA card, using u_audio API) 905======================================================== 906 907The function is provided by usb_f_uac1.ko module. 908It will create a virtual ALSA card and the audio streams are simply 909sinked to and sourced from it. 910 911Function-specific configfs interface 912------------------------------------ 913 914The function name to use when creating the function directory is "uac1". 915The uac1 function provides these attributes in its function directory: 916 917 ================ ==================================================== 918 c_chmask capture channel mask 919 c_srate capture sampling rate 920 c_ssize capture sample size (bytes) 921 c_mute_present capture mute control enable 922 c_volume_present capture volume control enable 923 c_volume_min capture volume control min value (in 1/256 dB) 924 c_volume_max capture volume control max value (in 1/256 dB) 925 c_volume_res capture volume control resolution (in 1/256 dB) 926 p_chmask playback channel mask 927 p_srate playback sampling rate 928 p_ssize playback sample size (bytes) 929 p_mute_present playback mute control enable 930 p_volume_present playback volume control enable 931 p_volume_min playback volume control min value (in 1/256 dB) 932 p_volume_max playback volume control max value (in 1/256 dB) 933 p_volume_res playback volume control resolution (in 1/256 dB) 934 req_number the number of pre-allocated request for both capture 935 and playback 936 ================ ==================================================== 937 938The attributes have sane default values. 939 940Testing the UAC1 function 941------------------------- 942 943device: run the gadget 944host: aplay -l # should list our USB Audio Gadget 945 946This function does not require real hardware support, it just 947sends a stream of audio data to/from the host. In order to 948actually hear something at the device side, a command similar 949to this must be used at the device side:: 950 951 $ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 & 952 953e.g.:: 954 955 $ arecord -f dat -t wav -D hw:CARD=UAC1Gadget,DEV=0 | \ 956 aplay -D default:CARD=OdroidU3 957