Skip to content

Commit 3bfe163

Browse files
jfischer-nokartben
authored andcommitted
usb: device_next: implement blocklist for classes
In the usbd_register_all_classes(), we may need to skip some instances as they may have very specific function like USB DFU "DFU mode" which should not be available by default. Signed-off-by: Johann Fischer <johann.fischer@nordicsemi.no>
1 parent a31e353 commit 3bfe163

File tree

4 files changed

+44
-6
lines changed

4 files changed

+44
-6
lines changed

include/zephyr/usb/usbd.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,14 +841,30 @@ int usbd_register_class(struct usbd_context *uds_ctx,
841841
* usbd_register_class for any device, configuration number, or instance,
842842
* either usbd_register_class or this function will fail.
843843
*
844+
* There may be situations where a particular function should not be
845+
* registered, for example, when using the USB DFU implementation, the DFU mode
846+
* function must be excluded during normal device operation. To do this, the
847+
* device can pass a blocklist in the form shown below as an optional argument.
848+
* If the blocklist is not needed, the argument should be NULL.
849+
*
850+
* @code{.c}
851+
* static const char *const blocklist[] = {
852+
* "dfu_dfu",
853+
* NULL,
854+
* };
855+
* @endcode
856+
*
844857
* @param[in] uds_ctx Pointer to USB device support context
845858
* @param[in] speed Configuration speed
846859
* @param[in] cfg Configuration value (bConfigurationValue)
860+
* @param[in] blocklist Null pointer terminated array of pointers to string
861+
* literals to be used as a block list
847862
*
848863
* @return 0 on success, other values on fail.
849864
*/
850865
int usbd_register_all_classes(struct usbd_context *uds_ctx,
851-
const enum usbd_speed speed, uint8_t cfg);
866+
const enum usbd_speed speed, uint8_t cfg,
867+
const char *const blocklist[]);
852868

853869
/**
854870
* @brief Unregister an USB class instance

samples/subsys/usb/common/sample_usbd_init.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,8 @@ struct usbd_context *sample_usbd_setup_device(usbd_msg_cb_t msg_cb)
124124
return NULL;
125125
}
126126

127-
err = usbd_register_all_classes(&sample_usbd, USBD_SPEED_HS, 1);
127+
err = usbd_register_all_classes(&sample_usbd, USBD_SPEED_HS, 1,
128+
NULL);
128129
if (err) {
129130
LOG_ERR("Failed to add register classes");
130131
return NULL;
@@ -143,7 +144,7 @@ struct usbd_context *sample_usbd_setup_device(usbd_msg_cb_t msg_cb)
143144
/* doc configuration register end */
144145

145146
/* doc functions register start */
146-
err = usbd_register_all_classes(&sample_usbd, USBD_SPEED_FS, 1);
147+
err = usbd_register_all_classes(&sample_usbd, USBD_SPEED_FS, 1, NULL);
147148
if (err) {
148149
LOG_ERR("Failed to add register classes");
149150
return NULL;

subsys/usb/device_next/usbd_class.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,13 +340,30 @@ int usbd_register_class(struct usbd_context *const uds_ctx,
340340
return ret;
341341
}
342342

343+
static bool is_blocklisted(const struct usbd_class_node *const c_nd,
344+
const char *const list[])
345+
{
346+
for (int i = 0; list[i] != NULL; i++) {
347+
if (strcmp(c_nd->c_data->name, list[i]) == 0) {
348+
return true;
349+
}
350+
}
351+
352+
return false;
353+
}
354+
343355
int usbd_register_all_classes(struct usbd_context *const uds_ctx,
344-
const enum usbd_speed speed, const uint8_t cfg)
356+
const enum usbd_speed speed, const uint8_t cfg,
357+
const char *const blocklist[])
345358
{
346359
int ret;
347360

348361
if (speed == USBD_SPEED_HS) {
349362
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs, usbd_class_node, c_nd) {
363+
if (blocklist != NULL && is_blocklisted(c_nd, blocklist)) {
364+
continue;
365+
}
366+
350367
ret = usbd_register_class(uds_ctx, c_nd->c_data->name,
351368
speed, cfg);
352369
if (ret) {
@@ -361,6 +378,10 @@ int usbd_register_all_classes(struct usbd_context *const uds_ctx,
361378

362379
if (speed == USBD_SPEED_FS) {
363380
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_fs, usbd_class_node, c_nd) {
381+
if (blocklist != NULL && is_blocklisted(c_nd, blocklist)) {
382+
continue;
383+
}
384+
364385
ret = usbd_register_class(uds_ctx, c_nd->c_data->name,
365386
speed, cfg);
366387
if (ret) {

tests/subsys/usb/device_next/src/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static void *usb_test_enable(void)
134134
zassert_equal(err, 0, "Failed to add configuration (%d)");
135135

136136
if (usbd_caps_speed(&test_usbd) == USBD_SPEED_HS) {
137-
err = usbd_register_all_classes(&test_usbd, USBD_SPEED_HS, 1);
137+
err = usbd_register_all_classes(&test_usbd, USBD_SPEED_HS, 1, NULL);
138138
zassert_equal(err, 0, "Failed to unregister all instances(%d)");
139139

140140
err = usbd_unregister_all_classes(&test_usbd, USBD_SPEED_HS, 1);
@@ -144,7 +144,7 @@ static void *usb_test_enable(void)
144144
zassert_equal(err, 0, "Failed to register loopback_0 class (%d)");
145145
}
146146

147-
err = usbd_register_all_classes(&test_usbd, USBD_SPEED_FS, 1);
147+
err = usbd_register_all_classes(&test_usbd, USBD_SPEED_FS, 1, NULL);
148148
zassert_equal(err, 0, "Failed to unregister all instances(%d)");
149149

150150
err = usbd_unregister_all_classes(&test_usbd, USBD_SPEED_FS, 1);

0 commit comments

Comments
 (0)