# USB device configuration options

# Copyright (c) 2016 Wind River Systems, Inc.
# SPDX-License-Identifier: Apache-2.0

menuconfig USB_DEVICE_DRIVER
	bool "USB device controller drivers"
	help
	  Enable USB device controller drivers.

if USB_DEVICE_DRIVER

config USB_DC_HAS_HS_SUPPORT
	bool "USB device controller supports high speed"
	help
	  USB device controller supports high speed.

config USB_DEVICE_REMOTE_WAKEUP
	bool "Remote wakeup support"
	help
	  USB device controller supports remote wakeup feature.

config USB_DW
	bool "Designware USB Device Controller Driver"
	default y
	depends on DT_HAS_SNPS_DWC2_ENABLED
	help
	  Designware USB Device Controller Driver.

config USB_DW_USB_2_0
	bool "DesignWare Controller and PHY support for USB specification 2.0"
	depends on USB_DW
	help
	  Indicates whether or not USB specification version 2.0 is supported

config USB_DC_RPI_PICO
	bool "USB device controller driver for Raspberry Pi Pico devices"
	default y
	depends on DT_HAS_RASPBERRYPI_PICO_USBD_ENABLED
	help
	  Enable USB support on the RP2 family of processors.

DT_STM32_USBHS := $(dt_nodelabel_path,usbotg_hs)
DT_STM32_USBHS_SPEED := $(dt_node_str_prop_equals,$(DT_STM32_USBHS),maximum-speed,high-speed)

config USB_DC_STM32
	bool "USB device controller driver for STM32 devices"
	default y
	depends on DT_HAS_ST_STM32_OTGFS_ENABLED \
		|| DT_HAS_ST_STM32_OTGHS_ENABLED \
		|| DT_HAS_ST_STM32_USB_ENABLED
	select USE_STM32_LL_USB
	select USE_STM32_HAL_PCD
	select USE_STM32_HAL_PCD_EX
	select USB_DC_HAS_HS_SUPPORT if "$(DT_STM32_USBHS_SPEED)"
	select PINCTRL
	imply USB_DEVICE_REMOTE_WAKEUP
	help
	  Enable STM32 family USB device controller shim driver.

config USB_DC_STM32_CLOCK_CHECK
	bool "Runtime USB 48MHz clock check"
	depends on USB_DC_STM32
	default y if !(SOC_SERIES_STM32F1X || SOC_SERIES_STM32F3X)
	help
	  Enable USB clock 48MHz configuration runtime check.
	  In specific cases, this check might provide wrong verdict and should
	  be disabled.

config USB_DC_SAM0
	bool "SAM0 series USB Device Controller driver"
	default y
	depends on DT_HAS_ATMEL_SAM0_USB_ENABLED
	select PINCTRL
	help
	  SAM0 family USB device controller Driver.

config USB_DC_SMARTBOND
	bool "SmartBond series USB Device Controller driver"
	default y
	select CLOCK_CONTROL_SMARTBOND
	select CLOCK_CONTROL
	select DMA
	depends on DT_HAS_RENESAS_SMARTBOND_USBD_ENABLED
	help
	  SmartBond family USB device controller Driver.

config USB_DC_SAM_USBC
	bool "SAM4L USBC Device Controller driver"
	default y
	depends on DT_HAS_ATMEL_SAM_USBC_ENABLED
	select PINCTRL
	help
	  SAM4L family USBC device controller Driver.

DT_SAM_USBHS := $(dt_nodelabel_path,usbhs)
DT_SAM_USBHS_SPEED := $(dt_node_str_prop_equals,$(DT_SAM_USBHS),maximum-speed,high-speed)

config USB_DC_SAM_USBHS
	bool "SAM series USB HS Device Controller driver"
	default y
	depends on DT_HAS_ATMEL_SAM_USBHS_ENABLED
	imply USB_DC_HAS_HS_SUPPORT if "$(DT_SAM_USBHS_SPEED)"
	help
	  SAM family USB HS device controller Driver.

config USB_NRFX
	bool "Nordic Semiconductor USB Device Controller Driver"
	default y
	depends on DT_HAS_NORDIC_NRF_USBD_ENABLED
	select NRF_USBD_COMMON
	select NRFX_POWER
	imply USB_DEVICE_REMOTE_WAKEUP
	help
	  nRF USB Device Controller Driver

config USB_NRFX_EVT_QUEUE_SIZE
	int "USBD event queue size"
	range 4 64
	default 32
	depends on USB_NRFX
	help
	  Size of the driver's internal event queue.
	  Required size will depend on number of endpoints (class instances) in use.

config USB_NRFX_WORK_QUEUE_STACK_SIZE
	int "USBD work queue stack size"
	default 1024
	depends on USB_NRFX
	help
	  Size of the stack for the work queue thread that is used in the driver
	  for handling the events from the USBD ISR, i.e. executing endpoint
	  callbacks and providing proper notifications to the USB device stack.

config USB_NRFX_ATTACHED_EVENT_DELAY
	int "USBD attached event delay"
	range 0 1000
	default 0
	depends on USB_NRFX
	help
	  Configurable attached event delay in milliseconds. Delay can be used
	  to give USB Charging Controller time for initialization.

config USB_KINETIS
	bool "Kinetis USB Device Controller Driver"
	default y
	depends on DT_HAS_NXP_KINETIS_USBD_ENABLED
	help
	  Kinetis USB Device Controller Driver.

config USB_MCUX
	bool "NXP MCUX USB Device Controller Driver"
	default y
	depends on DT_HAS_NXP_EHCI_ENABLED || DT_HAS_NXP_LPCIP3511_ENABLED
	select PINCTRL
	help
	  NXP MCUX USB Device Controller Driver for MXRT and LPC SoC's.

if USB_MCUX

config USB_DC_NXP_EHCI
	bool "MXRT EHCI USB Device Controller"
	default y
	depends on DT_HAS_NXP_EHCI_ENABLED
	select NOCACHE_MEMORY if ARCH_HAS_NOCACHE_MEMORY_SUPPORT
	select USB_DC_HAS_HS_SUPPORT
	help
	  Kinetis and RT EHCI USB Device Controller Driver.

config USB_DC_NXP_LPCIP3511
	bool "LPC USB Device Controller"
	default y
	depends on DT_HAS_NXP_LPCIP3511_ENABLED
	select USB_DC_HAS_HS_SUPPORT if "$(dt_nodelabel_enabled,usbhs)"
	select PINCTRL
	help
	  LPC USB Device Controller Driver.

config USB_DC_MSG_QUEUE_LEN
	int
	default 10
	help
	  Maximum number of messages USB device controller interrupt can queue
	  for callback thread

config USB_MCUX_THREAD_STACK_SIZE
	int "Stack size for the USB driver"
	default 2048 if USB_DEVICE_LOG_LEVEL_DBG
	default 1024
	help
	  Size of the stack used for the internal USB thread.

endif # USB_MCUX

config USB_DC_IT82XX2
	bool "ITE IT82XX2 USB Device Controller Driver"
	default y
	depends on DT_HAS_ITE_IT82XX2_USB_ENABLED
	select PINCTRL
	help
	  ITE IT82XX2 USB Device Controller Driver

config USB_DC_NUMAKER
	bool "Nuvoton NuMaker USB 1.1 device controller"
	default y
	depends on DT_HAS_NUVOTON_NUMAKER_USBD_ENABLED
	help
	  Enable Nuvoton NuMaker USB 1.1 device controller driver

if USB_DC_NUMAKER

config USB_DC_NUMAKER_MSG_QUEUE_SIZE
	int "USB DC message queue size"
	default 32
	help
	  Maximum number of messages the driver can queue for interrupt bottom half processing

config USB_DC_NUMAKER_MSG_HANDLER_THREAD_STACK_SIZE
	int "USB DC message handler thread stack size"
	default 1536
	help
	  Size of the stack for the message handler thread that is used in the driver
	  for handling messages from the USB DC ISR, i.e. interrupt bottom half processing,
	  including callbacks to the USB device stack.

endif # USB_DC_NUMAKER

config USB_NATIVE_POSIX
	bool "Native Posix USB Device Controller Driver"
	depends on ARCH_POSIX && EXTERNAL_LIBC
	default y if BOARD_NATIVE_SIM || BOARD_NATIVE_POSIX
	help
	  Native Posix USB Device Controller Driver.

DT_ZEPHYR_UDC0 := $(dt_nodelabel_path,zephyr_udc0)
DT_ZEPHYR_UDC0_HS_SPEED := $(dt_node_str_prop_equals,$(DT_ZEPHYR_UDC0),maximum-speed,high-speed)

config USB_NATIVE_POSIX_HS
	bool "High speed support"
	select USB_DC_HAS_HS_SUPPORT
	depends on USB_NATIVE_POSIX
	default y if "$(DT_ZEPHYR_UDC0_HS_SPEED)"
	help
	  Enable high speed support in the Native Posix USB device controller driver.

module = USB_DRIVER
module-str = usb driver
source "subsys/logging/Kconfig.template.log_config"

endif # USB_DEVICE_DRIVER
