USB host controller (UHC) driver API
The USB host controller driver API is described in
include/zephyr/drivers/usb/uhc.h and referred to
as the UHC driver
API.
UHC driver API is experimental and is subject to change without notice.
Driver API reference
- group uhc_api
USB host controller (UHC) driver API.
Defines
-
UHC_STATUS_INITIALIZED
Controller is initialized by uhc_init()
-
UHC_STATUS_ENABLED
Controller is enabled and all API functions are available.
Typedefs
-
typedef int (*uhc_event_cb_t)(const struct device *dev, const struct uhc_event *const event)
Callback to submit UHC event to higher layer.
At the higher level, the event is to be inserted into a message queue.
- Param dev:
[in] Pointer to device struct of the driver instance
- Param event:
[in] Point to event structure
- Return:
0 on success, all other values should be treated as error.
Enums
-
enum uhc_control_stage
USB control transfer stage.
Values:
-
enumerator UHC_CONTROL_STAGE_SETUP = 0
-
enumerator UHC_CONTROL_STAGE_DATA
-
enumerator UHC_CONTROL_STAGE_STATUS
-
enumerator UHC_CONTROL_STAGE_SETUP = 0
-
enum uhc_event_type
USB host controller event types.
Values:
-
enumerator UHC_EVT_DEV_CONNECTED_LS
Low speed device connected.
-
enumerator UHC_EVT_DEV_CONNECTED_FS
Full speed device connected.
-
enumerator UHC_EVT_DEV_CONNECTED_HS
High speed device connected.
-
enumerator UHC_EVT_DEV_REMOVED
Device (peripheral) removed.
-
enumerator UHC_EVT_RESETED
Bus reset operation finished.
-
enumerator UHC_EVT_SUSPENDED
Bus suspend operation finished.
-
enumerator UHC_EVT_RESUMED
Bus resume operation finished.
-
enumerator UHC_EVT_RWUP
Remote wakeup signal.
-
enumerator UHC_EVT_EP_REQUEST
Endpoint request result event.
-
enumerator UHC_EVT_ERROR
Non-correctable error event, requires attention from higher levels or application.
-
enumerator UHC_EVT_DEV_CONNECTED_LS
Functions
-
static inline bool uhc_is_initialized(const struct device *dev)
Checks whether the controller is initialized.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Returns:
true if controller is initialized, false otherwise
-
static inline bool uhc_is_enabled(const struct device *dev)
Checks whether the controller is enabled.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Returns:
true if controller is enabled, false otherwise
-
static inline int uhc_bus_reset(const struct device *dev)
Reset USB bus.
Perform USB bus reset, controller may emit UHC_EVT_RESETED at the end of reset signaling.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EBUSY – if the controller is already performing a bus operation
- Returns:
0 on success, all other values should be treated as error.
-
static inline int uhc_sof_enable(const struct device *dev)
Enable Start of Frame generator.
Enable SOF generator.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EALREADY – if already enabled
- Returns:
0 on success, all other values should be treated as error.
-
static inline int uhc_bus_suspend(const struct device *dev)
Suspend USB bus.
Disable SOF generator and emit UHC_EVT_SUSPENDED event when USB bus is suspended.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EALREADY – if already suspended
- Returns:
0 on success, all other values should be treated as error.
-
static inline int uhc_bus_resume(const struct device *dev)
Resume USB bus.
Signal resume for at least 20ms, emit UHC_EVT_RESUMED at the end of USB bus resume signaling. The SoF generator should subsequently start within 3ms.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EBUSY – if the controller is already performing a bus operation
- Returns:
0 on success, all other values should be treated as error.
-
struct uhc_transfer *uhc_xfer_alloc(const struct device *dev, const uint8_t addr, const uint8_t ep, const uint8_t attrib, const uint16_t mps, const uint16_t timeout, void *const udev, void *const cb)
Allocate UHC transfer.
Allocate a new transfer from common transfer pool. Transfer has no buffer after allocation, but can be allocated and added from different pools.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
addr – [in] Device (peripheral) address
ep – [in] Endpoint address
attrib – [in] Endpoint attributes
mps – [in] Maximum packet size of the endpoint
timeout – [in] Timeout in number of frames
udev – [in] Opaque pointer to USB device
cb – [in] Transfer completion callback
- Returns:
pointer to allocated transfer or NULL on error.
-
struct uhc_transfer *uhc_xfer_alloc_with_buf(const struct device *dev, const uint8_t addr, const uint8_t ep, const uint8_t attrib, const uint16_t mps, const uint16_t timeout, void *const udev, void *const cb, size_t size)
Allocate UHC transfer with buffer.
Allocate a new transfer from common transfer pool with buffer.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
addr – [in] Device (peripheral) address
ep – [in] Endpoint address
attrib – [in] Endpoint attributes
mps – [in] Maximum packet size of the endpoint
timeout – [in] Timeout in number of frames
udev – [in] Opaque pointer to USB device
cb – [in] Transfer completion callback
size – [in] Size of the buffer
- Returns:
pointer to allocated transfer or NULL on error.
-
int uhc_xfer_free(const struct device *dev, struct uhc_transfer *const xfer)
Free UHC transfer and any buffers.
Free any buffers and put the transfer back into the transfer pool.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
xfer – [in] Pointer to UHC transfer
- Returns:
0 on success, all other values should be treated as error.
-
int uhc_xfer_buf_add(const struct device *dev, struct uhc_transfer *const xfer, struct net_buf *buf)
Add UHC transfer buffer.
Add a previously allocated buffer to the transfer.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
xfer – [in] Pointer to UHC transfer
buf – [in] Pointer to UHC request buffer
- Returns:
pointer to allocated request or NULL on error.
-
struct net_buf *uhc_xfer_buf_alloc(const struct device *dev, const size_t size)
Allocate UHC transfer buffer.
Allocate a new buffer from common request buffer pool and assign it to the transfer if the xfer parameter is not NULL.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
size – [in] Size of the request buffer
- Returns:
pointer to allocated request or NULL on error.
-
void uhc_xfer_buf_free(const struct device *dev, struct net_buf *const buf)
Free UHC request buffer.
Put the buffer back into the request buffer pool.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
buf – [in] Pointer to UHC request buffer
-
int uhc_ep_enqueue(const struct device *dev, struct uhc_transfer *const xfer)
Queue USB host controller transfer.
Add transfer to the queue. If the queue is empty, the transfer can be claimed by the controller immediately.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
xfer – [in] Pointer to UHC transfer
- Return values:
-EPERM – controller is not initialized
- Returns:
0 on success, all other values should be treated as error.
-
int uhc_ep_dequeue(const struct device *dev, struct uhc_transfer *const xfer)
Remove a USB host controller transfers from queue.
Not implemented yet.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
xfer – [in] Pointer to UHC transfer
- Return values:
-EPERM – controller is not initialized
- Returns:
0 on success, all other values should be treated as error.
-
int uhc_init(const struct device *dev, uhc_event_cb_t event_cb)
Initialize USB host controller.
Initialize USB host controller.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
event_cb – [in] Event callback from the higher layer (USB host stack)
- Return values:
-EINVAL – on parameter error (no callback is passed)
-EALREADY – already initialized
- Returns:
0 on success, all other values should be treated as error.
-
int uhc_enable(const struct device *dev)
Enable USB host controller.
Enable powered USB host controller and allow host stack to recognize and enumerate devices.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EPERM – controller is not initialized
-EALREADY – already enabled
- Returns:
0 on success, all other values should be treated as error.
-
int uhc_disable(const struct device *dev)
Disable USB host controller.
Disable enabled USB host controller.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EALREADY – already disabled
- Returns:
0 on success, all other values should be treated as error.
-
int uhc_shutdown(const struct device *dev)
Poweroff USB host controller.
Shut down the controller completely to reduce energy consumption or to change the role of the controller.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Return values:
-EALREADY – controller is already uninitialized
- Returns:
0 on success, all other values should be treated as error.
-
static inline struct uhc_device_caps uhc_caps(const struct device *dev)
Get USB host controller capabilities.
Obtain the capabilities of the controller such as high speed (HS), and more.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
- Returns:
USB host controller capabilities.
-
struct uhc_transfer
- #include <uhc.h>
UHC endpoint buffer info.
This structure is mandatory for all UHC request. It contains the meta data about the request and FIFOs to store net_buf structures for each request.
The members of this structure should not be used directly by a higher layer (host stack).
Public Members
-
sys_dnode_t node
dlist node
-
uint8_t setup_pkt[8]
Control transfer setup packet.
-
uint8_t addr
Device (peripheral) address.
-
uint8_t ep
Endpoint to which request is associated.
-
uint8_t attrib
Endpoint attributes (TBD)
-
uint16_t mps
Maximum packet size.
-
uint16_t timeout
Timeout in number of frames.
-
unsigned int queued
Flag marks request buffer is queued.
-
unsigned int stage
Control stage status, up to the driver to use it or not.
-
void *udev
Pointer to USB device (opaque for the UHC)
-
void *cb
Pointer to transfer completion callback (opaque for the UHC)
-
int err
Transfer result, 0 on success, other values on error.
-
sys_dnode_t node
-
struct uhc_event
- #include <uhc.h>
USB host controller event.
Common structure for all events that originate from the UHC driver and are passed to higher layer using message queue and a callback (uhc_event_cb_t) provided by higher layer during controller initialization (uhc_init).
Public Members
-
sys_snode_t node
slist node for the message queue
-
enum uhc_event_type type
Event type.
-
int status
Event status value, if any.
-
struct uhc_transfer *xfer
Pointer to request used only for UHC_EVT_EP_REQUEST.
-
sys_snode_t node
-
struct uhc_device_caps
- #include <uhc.h>
USB host controller capabilities.
This structure is mainly intended for the USB host stack.
Public Members
-
uint32_t hs
USB high speed capable controller.
-
uint32_t hs
-
struct uhc_data
- #include <uhc.h>
Common UHC driver data structure.
Mandatory structure for each UHC controller driver. To be implemented as device’s private data (device->data).
Public Members
-
struct uhc_device_caps caps
Controller capabilities.
-
sys_dlist_t ctrl_xfers
dlist for control transfers
-
sys_dlist_t bulk_xfers
dlist for bulk transfers
-
uhc_event_cb_t event_cb
Callback to submit an UHC event to upper layer.
-
atomic_t status
USB host controller status.
-
void *priv
Driver private data.
-
struct uhc_device_caps caps
-
UHC_STATUS_INITIALIZED