diff --git a/include/usb/usb_device.h b/include/usb/usb_device.h index 572f677b073..aedb06ee057 100644 --- a/include/usb/usb_device.h +++ b/include/usb/usb_device.h @@ -116,7 +116,8 @@ typedef int (*usb_request_handler)(struct usb_setup_packet *setup, /** * @brief Function for interface runtime configuration */ -typedef void (*usb_interface_config)(u8_t bInterfaceNumber); +typedef void (*usb_interface_config)(struct usb_desc_header *head, + u8_t bInterfaceNumber); /** * @brief USB Endpoint Configuration diff --git a/subsys/usb/class/bluetooth.c b/subsys/usb/class/bluetooth.c index 2d30ee3a4dc..e0236c7cda1 100644 --- a/subsys/usb/class/bluetooth.c +++ b/subsys/usb/class/bluetooth.c @@ -269,8 +269,11 @@ static int bluetooth_class_handler(struct usb_setup_packet *setup, return 0; } -static void bluetooth_interface_config(u8_t bInterfaceNumber) +static void bluetooth_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + bluetooth_cfg.if0.bInterfaceNumber = bInterfaceNumber; } diff --git a/subsys/usb/class/cdc_acm.c b/subsys/usb/class/cdc_acm.c index 8c433cc6470..ef77cce6f77 100644 --- a/subsys/usb/class/cdc_acm.c +++ b/subsys/usb/class/cdc_acm.c @@ -504,14 +504,19 @@ static void cdc_acm_dev_status_cb(enum usb_dc_status_code status, } } -static void cdc_interface_config(u8_t bInterfaceNumber) +static void cdc_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { - cdc_acm_cfg.if0.bInterfaceNumber = bInterfaceNumber; - cdc_acm_cfg.if0_union.bControlInterface = bInterfaceNumber; - cdc_acm_cfg.if1.bInterfaceNumber = bInterfaceNumber + 1; - cdc_acm_cfg.if0_union.bSubordinateInterface0 = bInterfaceNumber + 1; + struct usb_if_descriptor *if_desc = (struct usb_if_descriptor *) head; + struct usb_cdc_acm_config *desc = + CONTAINER_OF(if_desc, struct usb_cdc_acm_config, if0); + + desc->if0.bInterfaceNumber = bInterfaceNumber; + desc->if0_union.bControlInterface = bInterfaceNumber; + desc->if1.bInterfaceNumber = bInterfaceNumber + 1; + desc->if0_union.bSubordinateInterface0 = bInterfaceNumber + 1; #ifdef CONFIG_USB_COMPOSITE_DEVICE - cdc_acm_cfg.iad_cdc.bFirstInterface = bInterfaceNumber; + desc->iad_cdc.bFirstInterface = bInterfaceNumber; #endif } diff --git a/subsys/usb/class/hid/core.c b/subsys/usb/class/hid/core.c index e64b7f04c37..c859abecabf 100644 --- a/subsys/usb/class/hid/core.c +++ b/subsys/usb/class/hid/core.c @@ -491,8 +491,11 @@ static struct usb_ep_cfg_data hid_ep_data[] = { #endif }; -static void hid_interface_config(u8_t bInterfaceNumber) +static void hid_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + hid_cfg.if0.bInterfaceNumber = bInterfaceNumber; hid_cfg.if0.bNumEndpoints = ARRAY_SIZE(hid_ep_data); } diff --git a/subsys/usb/class/loopback.c b/subsys/usb/class/loopback.c index ccc3ceda06a..9aea3a0618b 100644 --- a/subsys/usb/class/loopback.c +++ b/subsys/usb/class/loopback.c @@ -158,8 +158,11 @@ static int loopback_vendor_handler(struct usb_setup_packet *setup, } /* usb.rst vendor handler end */ -static void loopback_interface_config(u8_t bInterfaceNumber) +static void loopback_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + loopback_cfg.if0.bInterfaceNumber = bInterfaceNumber; } diff --git a/subsys/usb/class/mass_storage.c b/subsys/usb/class/mass_storage.c index 933a13ef181..724bcb32ef2 100644 --- a/subsys/usb/class/mass_storage.c +++ b/subsys/usb/class/mass_storage.c @@ -841,8 +841,11 @@ static void mass_storage_status_cb(enum usb_dc_status_code status, } } -static void mass_interface_config(u8_t bInterfaceNumber) +static void mass_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + mass_cfg.if0.bInterfaceNumber = bInterfaceNumber; } diff --git a/subsys/usb/class/netusb/function_ecm.c b/subsys/usb/class/netusb/function_ecm.c index c05dde01dd1..d9d4d4d6401 100644 --- a/subsys/usb/class/netusb/function_ecm.c +++ b/subsys/usb/class/netusb/function_ecm.c @@ -407,10 +407,13 @@ USBD_STRING_DESCR_DEFINE(primary) struct usb_cdc_ecm_mac_descr utf16le_mac = { .bString = CONFIG_USB_DEVICE_NETWORK_ECM_MAC }; -static void ecm_interface_config(u8_t bInterfaceNumber) +static void ecm_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { int idx = usb_get_str_descriptor_idx(&utf16le_mac); + ARG_UNUSED(head); + if (idx) { LOG_DBG("fixup string %d", idx); cdc_ecm_cfg.if0_netfun_ecm.iMACAddress = idx; diff --git a/subsys/usb/class/netusb/function_eem.c b/subsys/usb/class/netusb/function_eem.c index ed7bc8c5b5b..586db2c806b 100644 --- a/subsys/usb/class/netusb/function_eem.c +++ b/subsys/usb/class/netusb/function_eem.c @@ -268,8 +268,11 @@ static void eem_status_cb(enum usb_dc_status_code status, const u8_t *param) } } -static void eem_interface_config(u8_t bInterfaceNumber) +static void eem_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + cdc_eem_cfg.if0.bInterfaceNumber = bInterfaceNumber; } diff --git a/subsys/usb/class/netusb/function_rndis.c b/subsys/usb/class/netusb/function_rndis.c index d15a739d545..d7b1a28370a 100644 --- a/subsys/usb/class/netusb/function_rndis.c +++ b/subsys/usb/class/netusb/function_rndis.c @@ -1313,8 +1313,11 @@ static void rndis_status_cb(enum usb_dc_status_code status, const u8_t *param) } } -static void netusb_interface_config(u8_t bInterfaceNumber) +static void netusb_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + rndis_cfg.if0.bInterfaceNumber = bInterfaceNumber; rndis_cfg.if0_union.bControlInterface = bInterfaceNumber; rndis_cfg.if0_union.bSubordinateInterface0 = bInterfaceNumber + 1; diff --git a/subsys/usb/class/usb_dfu.c b/subsys/usb/class/usb_dfu.c index 28c6e6627d3..6f95bef8446 100644 --- a/subsys/usb/class/usb_dfu.c +++ b/subsys/usb/class/usb_dfu.c @@ -673,8 +673,11 @@ static int dfu_custom_handle_req(struct usb_setup_packet *pSetup, return -ENOTSUP; } -static void dfu_interface_config(u8_t bInterfaceNumber) +static void dfu_interface_config(struct usb_desc_header *head, + u8_t bInterfaceNumber) { + ARG_UNUSED(head); + dfu_cfg.if0.bInterfaceNumber = bInterfaceNumber; } diff --git a/subsys/usb/usb_descriptor.c b/subsys/usb/usb_descriptor.c index ab78666bb02..4f3ef122424 100644 --- a/subsys/usb/usb_descriptor.c +++ b/subsys/usb/usb_descriptor.c @@ -367,7 +367,7 @@ static int usb_fix_descriptor(struct usb_desc_header *head) } if (cfg_data->interface_config) { - cfg_data->interface_config( + cfg_data->interface_config(head, numof_ifaces); } }