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