|                                                              -*- org -*- | 
 |  | 
 | * Overview | 
 |  | 
 | The Multifunction Composite Gadget (or g_multi) is a composite gadget | 
 | that makes extensive use of the composite framework to provide | 
 | a... multifunction gadget. | 
 |  | 
 | In it's standard configuration it provides a single USB configuration | 
 | with RNDIS[1] (that is Ethernet), USB CDC[2] ACM (that is serial) and | 
 | USB Mass Storage functions. | 
 |  | 
 | A CDC ECM (Ethernet) function may be turned on via a Kconfig option | 
 | and RNDIS can be turned off.  If they are both enabled the gadget will | 
 | have two configurations -- one with RNDIS and another with CDC ECM[3]. | 
 |  | 
 | Please not that if you use non-standard configuration (that is enable | 
 | CDC ECM) you may need to change vendor and/or product ID. | 
 |  | 
 | * Host drivers | 
 |  | 
 | To make use of the gadget one needs to make it work on host side -- | 
 | without that there's no hope of achieving anything with the gadget. | 
 | As one might expect, things one need to do very from system to system. | 
 |  | 
 | ** Linux host drivers | 
 |  | 
 | Since the gadget uses standard composite framework and appears as such | 
 | to Linux host it does not need any additional drivers on Linux host | 
 | side.  All the functions are handled by respective drivers developed | 
 | for them. | 
 |  | 
 | This is also true for two configuration set-up with RNDIS | 
 | configuration being the first one.  Linux host will use the second | 
 | configuration with CDC ECM which should work better under Linux. | 
 |  | 
 | ** Windows host drivers | 
 |  | 
 | For the gadget two work under Windows two conditions have to be met: | 
 |  | 
 | *** Detecting as composite gadget | 
 |  | 
 | First of all, Windows need to detect the gadget as an USB composite | 
 | gadget which on its own have some conditions[4].  If they are met, | 
 | Windows lets USB Generic Parent Driver[5] handle the device which then | 
 | tries to much drivers for each individual interface (sort of, don't | 
 | get into too many details). | 
 |  | 
 | The good news is: you do not have to worry about most of the | 
 | conditions! | 
 |  | 
 | The only thing to worry is that the gadget has to have a single | 
 | configuration so a dual RNDIS and CDC ECM gadget won't work unless you | 
 | create a proper INF -- and of course, if you do submit it! | 
 |  | 
 | *** Installing drivers for each function | 
 |  | 
 | The other, trickier thing is making Windows install drivers for each | 
 | individual function. | 
 |  | 
 | For mass storage it is trivial since Windows detect it's an interface | 
 | implementing USB Mass Storage class and selects appropriate driver. | 
 |  | 
 | Things are harder with RDNIS and CDC ACM. | 
 |  | 
 | **** RNDIS | 
 |  | 
 | To make Windows select RNDIS drivers for the first function in the | 
 | gadget, one needs to use the [[file:linux.inf]] file provided with this | 
 | document.  It "attaches" Window's RNDIS driver to the first interface | 
 | of the gadget. | 
 |  | 
 | Please note, that while testing we encountered some issues[6] when | 
 | RNDIS was not the first interface.  You do not need to worry abut it | 
 | unless you are trying to develop your own gadget in which case watch | 
 | out for this bug. | 
 |  | 
 | **** CDC ACM | 
 |  | 
 | Similarly, [[file:linux-cdc-acm.inf]] is provided for CDC ACM. | 
 |  | 
 | **** Customising the gadget | 
 |  | 
 | If you intend to hack the g_multi gadget be advised that rearranging | 
 | functions will obviously change interface numbers for each of the | 
 | functionality.  As an effect provided INFs won't work since they have | 
 | interface numbers hard-coded in them (it's not hard to change those | 
 | though[7]). | 
 |  | 
 | This also means, that after experimenting with g_multi and changing | 
 | provided functions one should change gadget's vendor and/or product ID | 
 | so there will be no collision with other customised gadgets or the | 
 | original gadget. | 
 |  | 
 | Failing to comply may cause brain damage after wondering for hours why | 
 | things don't work as intended before realising Windows have cached | 
 | some drivers information (changing USB port may sometimes help plus | 
 | you might try using USBDeview[8] to remove the phantom device). | 
 |  | 
 | **** INF testing | 
 |  | 
 | Provided INF files have been tested on Windows XP SP3, Windows Vista | 
 | and Windows 7, all 32-bit versions.  It should work on 64-bit versions | 
 | as well.  It most likely won't work on Windows prior to Windows XP | 
 | SP2. | 
 |  | 
 | ** Other systems | 
 |  | 
 | At this moment, drivers for any other systems have not been tested. | 
 | Knowing how MacOS is based on BSD and BSD is an Open Source it is | 
 | believed that it should (read: "I have no idea whether it will") work | 
 | out-of-the-box. | 
 |  | 
 | For more exotic systems I have even less to say... | 
 |  | 
 | Any testing and drivers *are* *welcome*! | 
 |  | 
 | * Authors | 
 |  | 
 | This document has been written by Michal Nazarewicz | 
 | ([[mailto:mina86@mina86.com]]).  INF files have been hacked with | 
 | support of Marek Szyprowski ([[mailto:m.szyprowski@samsung.com]]) and | 
 | Xiaofan Chen ([[mailto:xiaofanc@gmail.com]]) basing on the MS RNDIS | 
 | template[9], Microchip's CDC ACM INF file and David Brownell's | 
 | ([[mailto:dbrownell@users.sourceforge.net]]) original INF files. | 
 |  | 
 | * Footnotes | 
 |  | 
 | [1] Remote Network Driver Interface Specification, | 
 | [[http://msdn.microsoft.com/en-us/library/ee484414.aspx]]. | 
 |  | 
 | [2] Communications Device Class Abstract Control Model, spec for this | 
 | and other USB classes can be found at | 
 | [[http://www.usb.org/developers/devclass_docs/]]. | 
 |  | 
 | [3] CDC Ethernet Control Model. | 
 |  | 
 | [4] [[http://msdn.microsoft.com/en-us/library/ff537109(v=VS.85).aspx]] | 
 |  | 
 | [5] [[http://msdn.microsoft.com/en-us/library/ff539234(v=VS.85).aspx]] | 
 |  | 
 | [6] To put it in some other nice words, Windows failed to respond to | 
 | any user input. | 
 |  | 
 | [7] You may find [[http://www.cygnal.org/ubb/Forum9/HTML/001050.html]] | 
 | useful. | 
 |  | 
 | [8] http://www.nirsoft.net/utils/usb_devices_view.html | 
 |  | 
 | [9] [[http://msdn.microsoft.com/en-us/library/ff570620.aspx]] |