Skip to content

Commit fe952ff

Browse files
author
Josuah Demangeon
committed
usb: host: introduce wrappers to access the class function pointers
Add API wrappers around the function pointers in struct usbh_class_api, while also documenting the USB host class internal API. Signed-off-by: Josuah Demangeon <[email protected]>
1 parent 9c27337 commit fe952ff

File tree

2 files changed

+121
-17
lines changed

2 files changed

+121
-17
lines changed

include/zephyr/usb/usbh.h

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,23 +90,18 @@ struct usbh_class_data;
9090
* @brief USB host class instance API
9191
*/
9292
struct usbh_class_api {
93-
/** Initialization of the class implementation */
94-
int (*init)(struct usbh_class_data *const c_data);
93+
/** Host init handler, before any device is connected */
94+
int (*init)(struct usbh_class_data *const c_data,
95+
struct usbh_context *const uhs_ctx);
9596
/** Request completion event handler */
96-
int (*request)(struct usbh_class_data *const c_data,
97-
struct uhc_transfer *const xfer, int err);
98-
/** Device connected handler */
99-
int (*connected)(struct usbh_class_data *const c_data,
100-
void *const desc_start_addr,
101-
void *const desc_end_addr);
102-
/** Device removed handler */
97+
int (*completion_cb)(struct usbh_class_data *const c_data,
98+
struct uhc_transfer *const xfer);
99+
/** Device connection handler */
100+
int (*probe)(struct usbh_class_data *const c_data,
101+
struct usb_device *const udev,
102+
const uint8_t iface);
103+
/** Device removal handler */
103104
int (*removed)(struct usbh_class_data *const c_data);
104-
/** Bus remote wakeup handler */
105-
int (*rwup)(struct usbh_class_data *const c_data);
106-
/** Bus suspended handler */
107-
int (*suspended)(struct usbh_class_data *const c_data);
108-
/** Bus resumed handler */
109-
int (*resumed)(struct usbh_class_data *const c_data);
110105
};
111106

112107
/**
@@ -117,8 +112,10 @@ struct usbh_class_data {
117112
const char *name;
118113
/** Pointer to USB host stack context structure */
119114
struct usbh_context *uhs_ctx;
120-
/** Class code supported by this instance */
121-
struct usbh_code_triple code;
115+
/** Pointer to USB device this class is used for */
116+
struct usb_device *udev;
117+
/** Interface number for which this class matched */
118+
uint8_t iface;
122119
/** Pointer to host support class API */
123120
struct usbh_class_api *api;
124121
/** Pointer to private data */

subsys/usb/host/usbh_class_api.h

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
* Copyright Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/**
8+
* @file
9+
* @brief USB host stack class instances API
10+
*
11+
* This file contains the USB host stack class instances API.
12+
*/
13+
14+
#ifndef ZEPHYR_INCLUDE_USBH_CLASS_API_H
15+
#define ZEPHYR_INCLUDE_USBH_CLASS_API_H
16+
17+
#include <zephyr/usb/usbh.h>
18+
19+
/**
20+
* @brief Initialization of the class implementation
21+
*
22+
* This is called for each instance during the initialization phase,
23+
* for every registered class.
24+
* It can be used to initialize underlying systems.
25+
*
26+
* @param[in] c_data Pointer to USB host class data
27+
* @param[in] uhs_ctx USB host context to assign to this class
28+
* @return 0 on success, negative error code on failure.
29+
*/
30+
static inline int usbh_class_init(struct usbh_class_data *const c_data,
31+
struct usbh_context *const uhs_ctx)
32+
{
33+
const struct usbh_class_api *api = c_data->api;
34+
35+
if (api->init != NULL) {
36+
return api->init(c_data, uhs_ctx);
37+
}
38+
39+
return -ENOTSUP;
40+
}
41+
42+
/**
43+
* @brief Request completion event handler
44+
*
45+
* Called upon completion of a request made by the host to this class.
46+
*
47+
* @param[in] c_data Pointer to USB host class data
48+
* @param[in] xfer Completed transfer
49+
* @return 0 on success, negative error code on failure.
50+
*/
51+
static inline int usbh_class_completion_cb(struct usbh_class_data *const c_data,
52+
struct uhc_transfer *const xfer)
53+
{
54+
const struct usbh_class_api *api = c_data->api;
55+
56+
if (api->completion_cb != NULL) {
57+
return api->completion_cb(c_data, xfer);
58+
}
59+
60+
return -ENOTSUP;
61+
}
62+
63+
/**
64+
* @brief Device initialization handler
65+
*
66+
* Called when a device is connected to the bus for every device.
67+
*
68+
* @param[in] c_data Pointer to USB host class data
69+
* @param[in] udev USB device connected
70+
* @param[in] iface The @c bInterfaceNumber or @c bFirstInterface of this class
71+
* @return 0 on success, negative error code on failure.
72+
* @return -ENOTSUP if the class is not matching
73+
*/
74+
static inline int usbh_class_probe(struct usbh_class_data *const c_data,
75+
struct usb_device *const udev,
76+
const uint8_t iface)
77+
{
78+
const struct usbh_class_api *api = c_data->api;
79+
80+
if (api->probe != NULL) {
81+
return api->probe(c_data, udev, iface);
82+
}
83+
84+
return -ENOTSUP;
85+
}
86+
87+
/**
88+
* @brief Device removed handler
89+
*
90+
* Called when the device is removed from the bus
91+
* and it matches the class filters of this instance.
92+
*
93+
* @param[in] c_data Pointer to USB host class data
94+
* @return 0 on success, negative error code on failure.
95+
*/
96+
static inline int usbh_class_removed(struct usbh_class_data *const c_data)
97+
{
98+
const struct usbh_class_api *api = c_data->api;
99+
100+
if (api->removed != NULL) {
101+
return api->removed(c_data);
102+
}
103+
104+
return -ENOTSUP;
105+
}
106+
107+
#endif /* ZEPHYR_INCLUDE_USBD_CLASS_API_H */

0 commit comments

Comments
 (0)