zephyr/subsys/usb/Kconfig
Emil Obalski 773f02e6e9 usb: drivers: Fix ZLP handling for Nordic driver.
ZLP - zero length packet is used to indicate that the device
has no more data to send. If the Host asks for more data that the
device can provide and the data size is mutliplication of Endpoint
wMaxPacketSize then the device must terminate the data transfer
with ZLP.

Until this patch Nordic device driver controller was not aware of
the requested data length and could not determine when the ZLP was
required.

This patch introduces a fix that prevents the driver from starting
setup stage before the ZLP is being send.

For consistance with the Zephyr USB stack sending ZLP must be
issued from the stack level. Making trans_zlp flag true results
in blocking the driver from starting setup stage without required
ZLP.

After the data transfer finishes the driver will be prepared for ZLP
and will call back the stack to start writing ZLP. After the ZLP
is being send the driver will automatically start status stage and
end the Control Transfer.

This patch also removes CONFIG_USB_DEVICE_DISABLE_ZLP_EPIN_HANDLING
and aligns Nordic driver with others.

Without this patch the issue could occur when handling get requests.
Typical case is string descriptor of length equal to wMaxPacketSize.
Hosts usually asks for wLength = 255 Bytes when string descriptors
are being requested. In that case to successfully finish the data
stage of the Control transfer the device must send wMacPacketSize
Bytes of actual string descriptor and then ZLP to indicate that no
more data are present. After ZLP the status stage may start and the
request is finished successfully.

Without this patch the driver will not send ZLP making it unable
to end the Control Request successful - this may lead to failing
'Device Descriptor Test' from USB3CV test tool.

Signed-off-by: Emil Obalski <emil.obalski@nordicsemi.no>
2020-11-17 18:06:26 +01:00

147 lines
3.9 KiB
Plaintext

# USB device stack configuration options
# Copyright (c) 2016 Wind River Systems, Inc.
# SPDX-License-Identifier: Apache-2.0
menuconfig USB_DEVICE_STACK
bool "USB Device Support"
depends on USB_DEVICE_DRIVER || ARCH_POSIX
select HWINFO
help
Enable USB device stack.
if USB_DEVICE_STACK
module = USB_DEVICE
module-str = usb device
source "subsys/logging/Kconfig.template.log_config"
source "samples/subsys/usb/usb_pid.Kconfig"
config USB_DEVICE_VID
hex "USB Vendor ID"
default 0x2FE3
help
USB device vendor ID. MUST be configured by vendor.
config USB_DEVICE_PID
hex "USB Product ID"
default 0x0100
help
USB device product ID. MUST be configured by vendor.
config USB_DEVICE_MANUFACTURER
string "USB manufacturer name"
default "ZEPHYR"
help
USB device Manufacturer string. MUST be configured by vendor.
config USB_DEVICE_PRODUCT
string "USB product name"
default "USB-DEV"
help
USB device Product string. MUST be configured by vendor.
config USB_DEVICE_SN
string "USB device Serial Number String"
default "0123456789ABCDEF"
help
Placeholder for USB device Serial Number String.
Serial Number String will be derived from
Hardware Information Driver (HWINFO).
config USB_COMPOSITE_DEVICE
bool "Enable composite device driver"
depends on USB
help
Enable composite USB device driver.
config USB_MAX_NUM_TRANSFERS
int "Set number of USB transfer data buffers"
range 1 32
default 4
help
Allocates buffers used for parallel transfers. Increase this number
according to USB devices count.
config USB_REQUEST_BUFFER_SIZE
int "Set buffer size for Standard, Class and Vendor request handlers"
range 256 65536 if USB_DEVICE_NETWORK_RNDIS
range 8 65536
default 256 if USB_DEVICE_NETWORK_RNDIS
default 266 if (BT_RX_BUF_LEN > 127 && USB_DEVICE_BLUETOOTH)
default 1024 if USB_DEVICE_LOOPBACK
default 128
config USB_NUMOF_EP_WRITE_RETRIES
int "Number of endpoint write retries"
default 3
help
Number of endpoint write retries.
config USB_DEVICE_SOF
bool "Enable Start of Frame processing in events"
default y if (USB_DEVICE_AUDIO && NRFX_USBD)
config USB_DEVICE_REMOTE_WAKEUP
bool "Enable support for remote wakeup"
help
This option requires USBD peripheral driver to also support remote wakeup.
config USB_DEVICE_BOS
bool "Enable USB Binary Device Object Store (BOS)"
config USB_DEVICE_OS_DESC
bool "Enable MS OS Descriptors support"
config USB_SELF_POWERED
bool "Set Self-powered characteristic"
default y
help
Set Self-powered characteristic in bmAttributes to indicate
self powered USB device.
config USB_MAX_POWER
int "Set bMaxPower value"
default 50
range 0 250
help
Set bMaxPower value in the Standard Configuration Descriptor,
the result is 2mA times the value provided.
config USB_WORKQUEUE
bool "Use a dedicate work queue in the USB subsystem"
default y if USB_CDC_ACM
help
This option provides a dedicated work queue that is used for
all offloaded operations initiated by the USB subsystem.
This prevents deadlock situations where tasks on the system
workqueue inadvertently initiate operations that block, such
as UART transmission on CDC-ACM, preventing the system work
queue from making progress on the USB tasks that would
release the task.
Without this the system work queue is used for all USB
offloaded transfers.
config USB_WORKQUEUE_STACK_SIZE
int "USB workqueue stack size"
depends on USB_WORKQUEUE
default 4096 if COVERAGE
default 1024
config USB_WORKQUEUE_PRIORITY
int "USB workqueue priority"
depends on USB_WORKQUEUE
default -2 if COOP_ENABLED && !PREEMPT_ENABLED
default 0 if !COOP_ENABLED
default -1
help
By default, USB work queue priority is the lowest cooperative
priority. This means that any work handler, once started, won't
be preempted by any other thread until finished.
source "subsys/usb/class/Kconfig"
endif # USB_DEVICE_STACK