# SPDX-License-Identifier: GPL-2.0
#
# USB Gadget support on a system involves
#    (a) a peripheral controller, and
#    (b) the gadget driver using it.
#
# NOTE:  Gadget support ** DOES NOT ** depend on host-side CONFIG_USB !!
#
#  - Host systems (like PCs) need CONFIG_USB (with "A" jacks).
#  - Peripherals (like PDAs) need CONFIG_USB_GADGET (with "B" jacks).
#  - Some systems have both kinds of controllers.
#
# With help from a special transceiver and a "Mini-AB" jack, systems with
# both kinds of controller can also support "USB On-the-Go" (CONFIG_USB_OTG).
#

config USB_ZERO
	tristate "Gadget Zero (DEVELOPMENT)"
	select USB_LIBCOMPOSITE
	select USB_F_SS_LB
	help
	  Gadget Zero is a two-configuration device.  It either sinks and
	  sources bulk data; or it loops back a configurable number of
	  transfers.  It also implements control requests, for "chapter 9"
	  conformance.  The driver needs only two bulk-capable endpoints, so
	  it can work on top of most device-side usb controllers.  It's
	  useful for testing, and is also a working example showing how
	  USB "gadget drivers" can be written.

	  Make this be the first driver you try using on top of any new
	  USB peripheral controller driver.  Then you can use host-side
	  test software, like the "usbtest" driver, to put your hardware
	  and its driver through a basic set of functional tests.

	  Gadget Zero also works with the host-side "usb-skeleton" driver,
	  and with many kinds of host-side test software.  You may need
	  to tweak product and vendor IDs before host software knows about
	  this device, and arrange to select an appropriate configuration.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_zero".

config USB_ZERO_HNPTEST
	bool "HNP Test Device"
	depends on USB_ZERO && USB_OTG
	help
	  You can configure this device to enumerate using the device
	  identifiers of the USB-OTG test device.  That means that when
	  this gadget connects to another OTG device, with this one using
	  the "B-Peripheral" role, that device will use HNP to let this
	  one serve as the USB host instead (in the "B-Host" role).

config USB_AUDIO
	tristate "Audio Gadget"
	depends on SND
	select USB_LIBCOMPOSITE
	select SND_PCM
	select USB_F_UAC1 if (GADGET_UAC1 && !GADGET_UAC1_LEGACY)
	select USB_F_UAC1_LEGACY if (GADGET_UAC1 && GADGET_UAC1_LEGACY)
	select USB_F_UAC2 if !GADGET_UAC1
	select USB_U_AUDIO if (USB_F_UAC2 || USB_F_UAC1)
	help
	  This Gadget Audio driver is compatible with USB Audio Class
	  specification 2.0. It implements 1 AudioControl interface,
	  1 AudioStreaming Interface each for USB-OUT and USB-IN.
	  Number of channels, sample rate and sample size can be
	  specified as module parameters.
	  This driver doesn't expect any real Audio codec to be present
	  on the device - the audio streams are simply sinked to and
	  sourced from a virtual ALSA sound card created. The user-space
	  application may choose to do whatever it wants with the data
	  received from the USB Host and choose to provide whatever it
	  wants as audio data to the USB Host.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_audio".

config GADGET_UAC1
	bool "UAC 1.0"
	depends on USB_AUDIO
	help
	  If you instead want older USB Audio Class specification 1.0 support
	  with similar driver capabilities.

config GADGET_UAC1_LEGACY
	bool "UAC 1.0 (Legacy)"
	depends on GADGET_UAC1
	help
	  If you instead want legacy UAC Spec-1.0 driver that also has audio
	  paths hardwired to the Audio codec chip on-board and doesn't work
	  without one.

config USB_ETH
	tristate "Ethernet Gadget (with CDC Ethernet support)"
	depends on NET
	select USB_LIBCOMPOSITE
	select USB_U_ETHER
	select USB_F_ECM
	select USB_F_SUBSET
	select CRC32
	help
	  This driver implements Ethernet style communication, in one of
	  several ways:

	   - The "Communication Device Class" (CDC) Ethernet Control Model.
	     That protocol is often avoided with pure Ethernet adapters, in
	     favor of simpler vendor-specific hardware, but is widely
	     supported by firmware for smart network devices.

	   - On hardware can't implement that protocol, a simple CDC subset
	     is used, placing fewer demands on USB.

	   - CDC Ethernet Emulation Model (EEM) is a newer standard that has
	     a simpler interface that can be used by more USB hardware.

	  RNDIS support is an additional option, more demanding than subset.

	  Within the USB device, this gadget driver exposes a network device
	  "usbX", where X depends on what other networking devices you have.
	  Treat it like a two-node Ethernet link:  host, and gadget.

	  The Linux-USB host-side "usbnet" driver interoperates with this
	  driver, so that deep I/O queues can be supported.  On 2.4 kernels,
	  use "CDCEther" instead, if you're using the CDC option. That CDC
	  mode should also interoperate with standard CDC Ethernet class
	  drivers on other host operating systems.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_ether".

config USB_ETH_RNDIS
	bool "RNDIS support"
	depends on USB_ETH
	select USB_LIBCOMPOSITE
	select USB_F_RNDIS
	default y
	help
	   Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol,
	   and Microsoft provides redistributable binary RNDIS drivers for
	   older versions of Windows.

	   If you say "y" here, the Ethernet gadget driver will try to provide
	   a second device configuration, supporting RNDIS to talk to such
	   Microsoft USB hosts.

	   To make MS-Windows work with this, use Documentation/usb/linux.inf
	   as the "driver info file".  For versions of MS-Windows older than
	   XP, you'll need to download drivers from Microsoft's website; a URL
	   is given in comments found in that info file.

config USB_ETH_EEM
       bool "Ethernet Emulation Model (EEM) support"
       depends on USB_ETH
	select USB_LIBCOMPOSITE
	select USB_F_EEM
       help
         CDC EEM is a newer USB standard that is somewhat simpler than CDC ECM
         and therefore can be supported by more hardware.  Technically ECM and
         EEM are designed for different applications.  The ECM model extends
         the network interface to the target (e.g. a USB cable modem), and the
         EEM model is for mobile devices to communicate with hosts using
         ethernet over USB.  For Linux gadgets, however, the interface with
         the host is the same (a usbX device), so the differences are minimal.

         If you say "y" here, the Ethernet gadget driver will use the EEM
         protocol rather than ECM.  If unsure, say "n".

config USB_G_NCM
	tristate "Network Control Model (NCM) support"
	depends on NET
	select USB_LIBCOMPOSITE
	select USB_U_ETHER
	select USB_F_NCM
	select CRC32
	help
	  This driver implements USB CDC NCM subclass standard. NCM is
	  an advanced protocol for Ethernet encapsulation, allows grouping
	  of several ethernet frames into one USB transfer and different
	  alignment possibilities.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_ncm".

config USB_GADGETFS
	tristate "Gadget Filesystem"
	help
	  This driver provides a filesystem based API that lets user mode
	  programs implement a single-configuration USB device, including
	  endpoint I/O and control requests that don't relate to enumeration.
	  All endpoints, transfer speeds, and transfer types supported by
	  the hardware are available, through read() and write() calls.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "gadgetfs".

config USB_FUNCTIONFS
	tristate "Function Filesystem"
	select USB_LIBCOMPOSITE
	select USB_F_FS
	select USB_FUNCTIONFS_GENERIC if !(USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS)
	help
	  The Function Filesystem (FunctionFS) lets one create USB
	  composite functions in user space in the same way GadgetFS
	  lets one create USB gadgets in user space.  This allows creation
	  of composite gadgets such that some of the functions are
	  implemented in kernel space (for instance Ethernet, serial or
	  mass storage) and other are implemented in user space.

	  If you say "y" or "m" here you will be able what kind of
	  configurations the gadget will provide.

	  Say "y" to link the driver statically, or "m" to build
	  a dynamically linked module called "g_ffs".

config USB_FUNCTIONFS_ETH
	bool "Include configuration with CDC ECM (Ethernet)"
	depends on USB_FUNCTIONFS && NET
	select USB_U_ETHER
	select USB_F_ECM
	select USB_F_SUBSET
	help
	  Include a configuration with CDC ECM function (Ethernet) and the
	  Function Filesystem.

config USB_FUNCTIONFS_RNDIS
	bool "Include configuration with RNDIS (Ethernet)"
	depends on USB_FUNCTIONFS && NET
	select USB_U_ETHER
	select USB_F_RNDIS
	help
	  Include a configuration with RNDIS function (Ethernet) and the Filesystem.

config USB_FUNCTIONFS_GENERIC
	bool "Include 'pure' configuration"
	depends on USB_FUNCTIONFS
	help
	  Include a configuration with the Function Filesystem alone with
	  no Ethernet interface.

config USB_MASS_STORAGE
	tristate "Mass Storage Gadget"
	depends on BLOCK
	select USB_LIBCOMPOSITE
	select USB_F_MASS_STORAGE
	help
	  The Mass Storage Gadget acts as a USB Mass Storage disk drive.
	  As its storage repository it can use a regular file or a block
	  device (in much the same way as the "loop" device driver),
	  specified as a module parameter or sysfs option.

	  This driver is a replacement for now removed File-backed
	  Storage Gadget (g_file_storage).

	  Say "y" to link the driver statically, or "m" to build
	  a dynamically linked module called "g_mass_storage".

config USB_GADGET_TARGET
	tristate "USB Gadget Target Fabric Module"
	depends on TARGET_CORE
	select USB_LIBCOMPOSITE
	select USB_F_TCM
	help
	  This fabric is an USB gadget. Two USB protocols are supported that is
	  BBB or BOT (Bulk Only Transport) and UAS (USB Attached SCSI). BOT is
	  advertised on alternative interface 0 (primary) and UAS is on
	  alternative interface 1. Both protocols can work on USB2.0 and USB3.0.
	  UAS utilizes the USB 3.0 feature called streams support.

config USB_G_SERIAL
	tristate "Serial Gadget (with CDC ACM and CDC OBEX support)"
	depends on TTY
	select USB_U_SERIAL
	select USB_F_ACM
	select USB_F_SERIAL
	select USB_F_OBEX
	select USB_LIBCOMPOSITE
	help
	  The Serial Gadget talks to the Linux-USB generic serial driver.
	  This driver supports a CDC-ACM module option, which can be used
	  to interoperate with MS-Windows hosts or with the Linux-USB
	  "cdc-acm" driver.

	  This driver also supports a CDC-OBEX option.  You will need a
	  user space OBEX server talking to /dev/ttyGS*, since the kernel
	  itself doesn't implement the OBEX protocol.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_serial".

	  For more information, see Documentation/usb/gadget_serial.rst
	  which includes instructions and a "driver info file" needed to
	  make MS-Windows work with CDC ACM.

config USB_MIDI_GADGET
	tristate "MIDI Gadget"
	depends on SND
	select USB_LIBCOMPOSITE
	select SND_RAWMIDI
	select USB_F_MIDI
	help
	  The MIDI Gadget acts as a USB Audio device, with one MIDI
	  input and one MIDI output. These MIDI jacks appear as
	  a sound "card" in the ALSA sound system. Other MIDI
	  connections can then be made on the gadget system, using
	  ALSA's aconnect utility etc.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_midi".

config USB_G_PRINTER
	tristate "Printer Gadget"
	select USB_LIBCOMPOSITE
	select USB_F_PRINTER
	help
	  The Printer Gadget channels data between the USB host and a
	  userspace program driving the print engine. The user space
	  program reads and writes the device file /dev/g_printer to
	  receive or send printer data. It can use ioctl calls to
	  the device file to get or set printer status.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_printer".

	  For more information, see Documentation/usb/gadget_printer.rst
	  which includes sample code for accessing the device file.

if TTY

config USB_CDC_COMPOSITE
	tristate "CDC Composite Device (Ethernet and ACM)"
	depends on NET
	select USB_LIBCOMPOSITE
	select USB_U_SERIAL
	select USB_U_ETHER
	select USB_F_ACM
	select USB_F_ECM
	help
	  This driver provides two functions in one configuration:
	  a CDC Ethernet (ECM) link, and a CDC ACM (serial port) link.

	  This driver requires four bulk and two interrupt endpoints,
	  plus the ability to handle altsettings.  Not all peripheral
	  controllers are that capable.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module.

config USB_G_NOKIA
	tristate "Nokia composite gadget"
	depends on PHONET
	depends on BLOCK
	select USB_LIBCOMPOSITE
	select USB_U_SERIAL
	select USB_U_ETHER
	select USB_F_ACM
	select USB_F_OBEX
	select USB_F_PHONET
	select USB_F_ECM
	select USB_F_MASS_STORAGE
	help
	  The Nokia composite gadget provides support for acm, obex
	  and phonet in only one composite gadget driver.

	  It's only really useful for N900 hardware. If you're building
	  a kernel for N900, say Y or M here. If unsure, say N.

config USB_G_ACM_MS
	tristate "CDC Composite Device (ACM and mass storage)"
	depends on BLOCK
	select USB_LIBCOMPOSITE
	select USB_U_SERIAL
	select USB_F_ACM
	select USB_F_MASS_STORAGE
	help
	  This driver provides two functions in one configuration:
	  a mass storage, and a CDC ACM (serial port) link.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_acm_ms".

config USB_G_MULTI
	tristate "Multifunction Composite Gadget"
	depends on BLOCK && NET
	select USB_G_MULTI_CDC if !USB_G_MULTI_RNDIS
	select USB_LIBCOMPOSITE
	select USB_U_SERIAL
	select USB_U_ETHER
	select USB_F_ACM
	select USB_F_MASS_STORAGE
	help
	  The Multifunction Composite Gadget provides Ethernet (RNDIS
	  and/or CDC Ethernet), mass storage and ACM serial link
	  interfaces.

	  You will be asked to choose which of the two configurations is
	  to be available in the gadget.  At least one configuration must
	  be chosen to make the gadget usable.  Selecting more than one
	  configuration will prevent Windows from automatically detecting
	  the gadget as a composite gadget, so an INF file will be needed to
	  use the gadget.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_multi".

config USB_G_MULTI_RNDIS
	bool "RNDIS + CDC Serial + Storage configuration"
	depends on USB_G_MULTI
	select USB_F_RNDIS
	default y
	help
	  This option enables a configuration with RNDIS, CDC Serial and
	  Mass Storage functions available in the Multifunction Composite
	  Gadget.  This is the configuration dedicated for Windows since RNDIS
	  is Microsoft's protocol.

	  If unsure, say "y".

config USB_G_MULTI_CDC
	bool "CDC Ethernet + CDC Serial + Storage configuration"
	depends on USB_G_MULTI
	select USB_F_ECM
	help
	  This option enables a configuration with CDC Ethernet (ECM), CDC
	  Serial and Mass Storage functions available in the Multifunction
	  Composite Gadget.

	  If unsure, say "y".

endif # TTY

config USB_G_HID
	tristate "HID Gadget"
	select USB_LIBCOMPOSITE
	select USB_F_HID
	help
	  The HID gadget driver provides generic emulation of USB
	  Human Interface Devices (HID).

	  For more information, see Documentation/usb/gadget_hid.rst which
	  includes sample code for accessing the device files.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_hid".

# Standalone / single function gadgets
config USB_G_DBGP
	tristate "EHCI Debug Device Gadget"
	depends on TTY
	select USB_LIBCOMPOSITE
	help
	  This gadget emulates an EHCI Debug device. This is useful when you want
	  to interact with an EHCI Debug Port.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_dbgp".

if USB_G_DBGP
choice
	prompt "EHCI Debug Device mode"
	default USB_G_DBGP_SERIAL

config USB_G_DBGP_PRINTK
	depends on USB_G_DBGP
	bool "printk"
	help
	  Directly printk() received data. No interaction.

config USB_G_DBGP_SERIAL
	depends on USB_G_DBGP
	select USB_U_SERIAL
	bool "serial"
	help
	  Userland can interact using /dev/ttyGSxxx.
endchoice
endif

# put drivers that need isochronous transfer support (for audio
# or video class gadget drivers), or specific hardware, here.
config USB_G_WEBCAM
	tristate "USB Webcam Gadget"
	depends on VIDEO_V4L2
	select USB_LIBCOMPOSITE
	select VIDEOBUF2_VMALLOC
	select USB_F_UVC
	help
	  The Webcam Gadget acts as a composite USB Audio and Video Class
	  device. It provides a userspace API to process UVC control requests
	  and stream video data to the host.

	  Say "y" to link the driver statically, or "m" to build a
	  dynamically linked module called "g_webcam".
