# 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).
#
# A Linux "Gadget Driver" talks to the USB Peripheral Controller
# driver through the abstract "gadget" API.  Some other operating
# systems call these "client" drivers, of which "class drivers"
# are a subset (implementing a USB device class specification).
# A gadget driver implements one or more USB functions using
# the peripheral hardware.
#
# Gadget drivers are hardware-neutral, or "platform independent",
# except that they sometimes must understand quirks or limitations
# of the particular controllers they work with.  For example, when
# a controller doesn't support alternate configurations or provide
# enough of the right types of endpoints, the gadget driver might
# not be able work with that controller, or might need to implement
# a less common variant of a device class protocol.
#
# The available choices each represent a single precomposed USB
# gadget configuration. In the device model, each option contains
# both the device instantiation as a child for a USB gadget
# controller, and the relevant drivers for each function declared
# by the device.

menu "USB Gadget precomposed configurations"

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_DMA_SG
	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".

config USB_RAW_GADGET
	tristate "USB Raw Gadget"
	help
	  USB Raw Gadget is a gadget driver that gives userspace low-level
	  control over the gadget's communication process.

	  Like any other gadget driver, Raw Gadget implements USB devices via
	  the USB gadget API. Unlike most gadget drivers, Raw Gadget does not
	  implement any concrete USB functions itself but requires userspace
	  to do that.

	  See Documentation/usb/raw-gadget.rst for details.

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

endmenu
