#
# 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).
#

menuconfig USB_GADGET
	bool "USB Gadget Support"
	depends on DM
	select DM_USB
	imply CMD_BIND
	help
	   USB is a master/slave protocol, organized with one master
	   host (such as a PC) controlling up to 127 peripheral devices.
	   The USB hardware is asymmetric, which makes it easier to set up:
	   you can't connect a "to-the-host" connector to a peripheral.

	   U-Boot can run in the host, or in the peripheral.  In both cases
	   you need a low level bus controller driver, and some software
	   talking to it.  Peripheral controllers are often discrete silicon,
	   or are integrated with the CPU in a microcontroller.  The more
	   familiar host side controllers have names like "EHCI", "OHCI",
	   or "UHCI", and are usually integrated into southbridges on PC
	   motherboards.

	   Enable this configuration option if you want to run U-Boot inside
	   a USB peripheral device.  Configure one hardware driver for your
	   peripheral/device side bus controller, and a "gadget driver" for
	   your peripheral protocol.

config SPL_USB_GADGET
	bool "USB Gadget Support in SPL"
	depends on SPL_FRAMEWORK
	help
	  Enable USB Gadget API which allows to enable USB device functions
	  in SPL.

if USB_GADGET

config USB_GADGET_MANUFACTURER
	string "Vendor name of the USB device"
	default "NVIDIA" if ARCH_TEGRA
	default "Allwinner Technology" if ARCH_SUNXI
	default "Rockchip" if ARCH_ROCKCHIP
	default "U-Boot"
	help
	  Vendor name of the USB device emulated, reported to the host device.
	  This is usually either the manufacturer of the device or the SoC.

config USB_GADGET_VENDOR_NUM
	hex "Vendor ID of the USB device"
	default 0x0955 if ARCH_TEGRA
	default 0x1f3a if ARCH_SUNXI
	default 0x2207 if ARCH_ROCKCHIP
	default 0x18d1 if ARCH_SNAPDRAGON
	default 0x0
	help
	  Vendor ID of the USB device emulated, reported to the host device.
	  This is usually the board or SoC vendor's, unless you've registered
	  for one.

config USB_GADGET_PRODUCT_NUM
	hex "Product ID of the USB device"
	default 0x701a if ARCH_TEGRA
	default 0x1010 if ARCH_SUNXI
	default 0x110a if ROCKCHIP_RV1108
	default 0x110b if ROCKCHIP_RV1126
	default 0x300a if ROCKCHIP_RK3066
	default 0x301a if ROCKCHIP_RK3036
	default 0x310b if ROCKCHIP_RK3188
	default 0x310c if ROCKCHIP_RK3128
	default 0x320a if ROCKCHIP_RK3288
	default 0x320b if ROCKCHIP_RK322X
	default 0x320c if ROCKCHIP_RK3328
	default 0x330a if ROCKCHIP_RK3368
	default 0x330c if ROCKCHIP_RK3399
	default 0x330d if ROCKCHIP_PX30
	default 0x330e if ROCKCHIP_RK3308
	default 0x350a if ROCKCHIP_RK3568
	default 0x350b if ROCKCHIP_RK3588
	default 0x350c if ROCKCHIP_RK3528
	default 0x350e if ROCKCHIP_RK3576
	default 0x4ee0 if ARCH_SNAPDRAGON
	default 0x0
	help
	  Product ID of the USB device emulated, reported to the host device.

config USB_GADGET_ATMEL_USBA
	bool "Atmel USBA"
	depends on ARCH_AT91
	select USB_GADGET_DUALSPEED
	help
	  USBA is the integrated high-speed USB Device controller on
	  the AT32AP700x, some AT91SAM9 and AT91CAP9 processors from Atmel.

config USB_GADGET_AT91
	bool "Atmel AT91 USB Gadget Controller"
	depends on ARCH_AT91

config USB_GADGET_DWC2_OTG
	bool "DesignWare USB2.0 HS OTG controller (gadget mode)"
	depends on ARM
	select USB_GADGET_DUALSPEED
	help
	  The Designware USB2.0 high-speed gadget controller
	  integrated into many SoCs. Select this option if you want the
	  driver to operate in Peripheral mode. This option requires
	  USB_GADGET to be enabled.

config USB_RENESAS_USBHS
	bool "Renesas R-Car USB2.0 HS controller (gadget mode)"
	select USB_GADGET_DUALSPEED
	help
	  The Renesas R-Car USB 2.0 high-speed gadget controller
	  integrated into Salvator and Kingfisher boards. Select this
	  option if you want the driver to operate in Peripheral mode.
	  This option requires USB_GADGET to be enabled.

if USB_GADGET_DWC2_OTG

config USB_GADGET_DWC2_OTG_PHY
	bool "DesignWare USB2.0 HS OTG PHY"
	help
	  Enable the DesignWare USB2.0 HS OTG physical device interface.

config USB_GADGET_DWC2_OTG_PHY_BUS_WIDTH_8
	bool "DesignWare USB2.0 HS OTG controller 8-bit PHY bus width"
	help
	  Set the Designware USB2.0 high-speed OTG controller
	  PHY interface width to 8 bits, rather than the default (16 bits).

endif # USB_GADGET_DWC2_OTG

config USB_GADGET_OS_DESCRIPTORS
	bool "USB OS Feature Descriptors support"
	help
	  This is a porting patch from linux kernel: 37a3a533429e
	  ("usb: gadget: OS Feature Descriptors support"), the original commit
	  log see below:
	  There is a custom (non-USB IF) extension to the USB standard:
	  http://msdn.microsoft.com/library/windows/hardware/gg463182

config CI_UDC
	bool "ChipIdea device controller"
	depends on !DM_USB_GADGET
	select USB_GADGET_DUALSPEED
	help
	  Say Y here to enable device controller functionality of the
	  ChipIdea driver.

config USB_GADGET_VBUS_DRAW
	int "Maximum VBUS Power usage (2-500 mA)"
	range 2 500
	default 2
	help
	   Some devices need to draw power from USB when they are
	   configured, perhaps to operate circuitry or to recharge
	   batteries.  This is in addition to any local power supply,
	   such as an AC adapter or batteries.

	   Enter the maximum power your device draws through USB, in
	   milliAmperes.  The permitted range of values is 2 - 500 mA;
	   0 mA would be legal, but can make some hosts misbehave.

	   This value will be used except for system-specific gadget
	   drivers that have more specific information.

config SDP_LOADADDR
	hex "Default load address at SDP_WRITE and SDP_JUMP"
	default 0x0

# Selected by UDC drivers that support high-speed operation.
config USB_GADGET_DUALSPEED
	bool

config USB_GADGET_DOWNLOAD
	bool "Enable USB download gadget"
	help
	  Composite USB download gadget support (g_dnl) for download functions.
	  This code works on top of composite gadget.

if USB_GADGET_DOWNLOAD

config USB_FUNCTION_MASS_STORAGE
	bool "Enable USB mass storage gadget"
	help
	  Enable mass storage protocol support in U-Boot. It allows exporting
	  the eMMC/SD card content to HOST PC so it can be mounted.

config USB_FUNCTION_ROCKUSB
	bool "Enable USB rockusb gadget"
	depends on ARCH_ROCKCHIP
	help
	  Rockusb protocol is widely used by Rockchip SoC based devices. It can
	  read/write info, image to/from devices. This enables the USB part of
	  the rockusb gadget.for more detail about Rockusb protocol, please see
	  doc/README.rockusb

config USB_FUNCTION_SDP
	bool "Enable USB SDP (Serial Download Protocol)"
	help
	  Enable Serial Download Protocol (SDP) device support in U-Boot. This
	  allows to download images into memory and execute (jump to) them
	  using the same protocol as implemented by the i.MX family's boot ROM.

config USB_FUNCTION_THOR
	bool "Enable USB THOR gadget"
	help
	  Enable Tizen's THOR download protocol support in U-Boot. It
	  allows downloading images into memory and flash them to target device.

config USB_FUNCTION_ACM
	bool "Enable CDC ACM gadget"
	select SYS_STDIO_DEREGISTER
	select CIRCBUF
	help
	  ACM serial link. This function can be used to create a stdio device to
	  interoperate with MS-Windows hosts or with the Linux-USB "cdc-acm"
	  driver.

endif # USB_GADGET_DOWNLOAD

config USB_ETHER
	bool "USB Ethernet Gadget"
	depends on NET || NET_LWIP
	default y if ARCH_SUNXI && USB_MUSB_GADGET
	help
	  Creates an Ethernet network device through a USB peripheral
	  controller. This will create a network interface on both the device
	  (U-Boot) and the host (remote device) that can be used just like any
	  other nework interface.
	  It will bind on the peripheral USB controller, ignoring the USB hosts
	  controllers in the system.

if USB_ETHER

choice
	prompt "USB Ethernet Gadget Model"
	default USB_ETH_RNDIS
	help
	  There is several models (protocols) to implement Ethernet over USB
	  devices. The main ones are Microsoft's RNDIS and USB's CDC-Ethernet
	  (also called CDC-ECM). RNDIS is obviously compatible with Windows,
	  while CDC-ECM is not. Most other operating systems support both, so
	  if inter-operability is a concern, RNDIS is to be preferred.

config USB_ETH_CDC
	bool "CDC-ECM Protocol"
	help
	  CDC (Communications Device Class) is the standard for Ethernet over
	  USB devices. While there's several alternatives, the most widely used
	  protocol is ECM (Ethernet Control Model). However, compatibility with
	  Windows is not that great.

config USB_ETH_RNDIS
	bool "RNDIS Protocol"
	help
	  The RNDIS (Remote Network Driver Interface Specification) is a
	  Microsoft proprietary protocol to create an Ethernet device over USB.
	  Windows obviously supports it, as well as all the major operating
	  systems, so it's the best option for compatibility.

endchoice

config USBNET_DEV_ADDR
	string "USB Gadget Ethernet device mac address"
	default "de:ad:be:ef:00:01"
	help
	  Ethernet MAC address of the device-side (ie. local board's) MAC
	  address of the usb_ether interface

config USBNET_HOST_ADDR
	string "USB Gadget Ethernet host mac address"
	default "de:ad:be:ef:00:00"
	help
	  Ethernet MAC address of the host-side (ie. remote device's) MAC
	  address of the usb_ether interface

endif # USB_ETHER

endif # USB_GADGET

if SPL_USB_GADGET

config SPL_USB_ETHER
	bool "Support USB Ethernet drivers in SPL"
	depends on SPL_NET
	help
	  Enable access to the USB network subsystem and associated
	  drivers in SPL. This permits SPL to load U-Boot over a
	  USB-connected Ethernet link (such as a USB Ethernet dongle) rather
	  than from an onboard peripheral. Environment support is required
	  since the network stack uses a number of environment variables.
	  See also SPL_NET and SPL_ETH.

if SPL_USB_ETHER

choice
	prompt "USB Ethernet Gadget Model in SPL"
	default SPL_USB_ETH_RNDIS
	help
	  There is several models (protocols) to implement Ethernet over USB
	  devices. The main ones are Microsoft's RNDIS and USB's CDC-Ethernet
	  (also called CDC-ECM). RNDIS is obviously compatible with Windows,
	  while CDC-ECM is not. Most other operating systems support both, so
	  if inter-operability is a concern, RNDIS is to be preferred.

config SPL_USB_ETH_RNDIS
	bool "RNDIS Protocol"
	help
	  The RNDIS (Remote Network Driver Interface Specification) is a
	  Microsoft proprietary protocol to create an Ethernet device over USB.
	  Windows obviously supports it, as well as all the major operating
	  systems, so it's the best option for compatibility.

endchoice

endif # SPL_USB_ETHER

config SPL_DFU
	bool "Support DFU (Device Firmware Upgrade) in SPL"
	select SPL_HASH
	select SPL_DFU_NO_RESET
	select SPL_RAM_SUPPORT
	depends on DFU_OVER_USB
	help
	  This feature enables the DFU (Device Firmware Upgrade) in SPL with
	  RAM memory device support. The ROM code will load and execute
	  the SPL built with dfu. The user can load binaries (u-boot/kernel) to
	  selected device partition from host-pc using dfu-utils.
	  This feature is useful to flash the binaries to factory or bare-metal
	  boards using USB interface.

choice
	bool "DFU device selection in SPL"
	depends on SPL_DFU

config SPL_DFU_RAM
	bool "RAM device"
	depends on SPL_DFU && SPL_RAM_SUPPORT
	help
	 select RAM/DDR memory device for loading binary images
	 (u-boot/kernel) to the selected device partition using
	 DFU and execute the u-boot/kernel from RAM.

endchoice

config SPL_USB_SDP_SUPPORT
	bool "Support SDP (Serial Download Protocol) in SPL"
	depends on SPL_SERIAL
	help
	  Enable Serial Download Protocol (SDP) device support in SPL. This
	  allows to download images into memory and execute (jump to) them
	  using the same protocol as implemented by the i.MX family's boot ROM.

config SPL_SDP_USB_DEV
	int "SDP USB controller index in SPL"
	default 0
	depends on SPL_USB_SDP_SUPPORT
	help
	  Some boards have USB controller other than 0. Define this option
	  so it can be used in compiled environment.

endif # SPL_USB_GADGET
