USB host controller driver API
The USB host controller (UHC) driver API implements the low level layer to interface with the host controller. All USB host controller drivers should implement the APIs described in include/zephyr/drivers/usb/uhc.h.
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_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 owner)
Allocate UHC transfer.
Allocate a new transfer from common transfer pool. Transfer has no buffers after allocation, these can be requested and assigned separately.
- 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
owner – [in] Transfer owner
- 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.
-
struct net_buf *uhc_xfer_buf_alloc(const struct device *dev, struct uhc_transfer *const xfer, const size_t size)
Allocate UHC transfer buffer.
Allocate a new buffer from common request buffer pool and assign it to the transfer.
- Parameters:
dev – [in] Pointer to device struct of the driver instance
xfer – [in] Pointer to UHC transfer
size – [in] Size of the request buffer
- Returns:
pointer to allocated request or NULL on error.
-
int 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
- Returns:
0 on success, all other values should be treated as error.
-
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
-
struct k_fifo queue
FIFO requests to process
-
struct k_fifo done
FIFO to keep completed requests
-
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 claimed
Flag marks request buffer claimed by the controller
-
unsigned int queued
Flag marks request buffer is queued
-
unsigned int setup
Flag marks setup stage of transfer
-
void *owner
Transfer owner
-
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
-
uint32_t value
Event value
-
struct uhc_transfer *xfer
Pointer to request used only for UHC_EVT_EP_REQUEST
-
int status
Event status, 0 on success, other (transfer) values on error
-
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