diff --git a/sys/include/usb/usbus.h b/sys/include/usb/usbus.h index 1e5a8c727f..ec62f868d5 100644 --- a/sys/include/usb/usbus.h +++ b/sys/include/usb/usbus.h @@ -449,6 +449,15 @@ uint16_t usbus_add_string_descriptor(usbus_t *usbus, usbus_string_t *desc, */ uint16_t usbus_add_interface(usbus_t *usbus, usbus_interface_t *iface); +/** + * @brief Add alternate settings to a given interface + * + * @param[in] iface USB interface + * @param[in] alt alternate settings interface to add + */ +void usbus_add_interface_alt(usbus_interface_t *iface, + usbus_interface_alt_t *alt); + /** * @brief Find an endpoint from an interface based on the endpoint properties * diff --git a/sys/usb/usbus/cdc/ecm/cdc_ecm.c b/sys/usb/usbus/cdc/ecm/cdc_ecm.c index f4da67efb9..f580209e03 100644 --- a/sys/usb/usbus/cdc/ecm/cdc_ecm.c +++ b/sys/usb/usbus/cdc/ecm/cdc_ecm.c @@ -229,7 +229,7 @@ static void _init(usbus_t *usbus, usbus_handler_t *handler) usbus_add_interface(usbus, &cdcecm->iface_ctrl); usbus_add_interface(usbus, &cdcecm->iface_data); - cdcecm->iface_data.alts = &cdcecm->iface_data_alt; + usbus_add_interface_alt(&cdcecm->iface_data, &cdcecm->iface_data_alt); usbus_enable_endpoint(cdcecm->ep_out); usbus_enable_endpoint(cdcecm->ep_in); diff --git a/sys/usb/usbus/usbus.c b/sys/usb/usbus/usbus.c index 84a5437e1b..8304134815 100644 --- a/sys/usb/usbus/usbus.c +++ b/sys/usb/usbus/usbus.c @@ -121,6 +121,16 @@ uint16_t usbus_add_interface(usbus_t *usbus, usbus_interface_t *iface) return idx; } +void usbus_add_interface_alt(usbus_interface_t *iface, + usbus_interface_alt_t *alt) +{ + usbus_interface_alt_t **last = &iface->alts; + while (*last) { + last = &(*last)->next; + } + *last = alt; +} + void usbus_register_event_handler(usbus_t *usbus, usbus_handler_t *handler) { /* See note above for reasons against clist.h */