usb: Refactor usb_interface_config callback

Add interface parameter to interface configuration callback to be able
to configure several instances of the same class.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
This commit is contained in:
Andrei Emeltchenko 2019-01-18 15:18:14 +02:00 committed by Anas Nashif
commit 9ef8ad412f
11 changed files with 46 additions and 16 deletions

View file

@ -116,7 +116,8 @@ typedef int (*usb_request_handler)(struct usb_setup_packet *setup,
/** /**
* @brief Function for interface runtime configuration * @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 * @brief USB Endpoint Configuration

View file

@ -269,8 +269,11 @@ static int bluetooth_class_handler(struct usb_setup_packet *setup,
return 0; 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; bluetooth_cfg.if0.bInterfaceNumber = bInterfaceNumber;
} }

View file

@ -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; struct usb_if_descriptor *if_desc = (struct usb_if_descriptor *) head;
cdc_acm_cfg.if0_union.bControlInterface = bInterfaceNumber; struct usb_cdc_acm_config *desc =
cdc_acm_cfg.if1.bInterfaceNumber = bInterfaceNumber + 1; CONTAINER_OF(if_desc, struct usb_cdc_acm_config, if0);
cdc_acm_cfg.if0_union.bSubordinateInterface0 = bInterfaceNumber + 1;
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 #ifdef CONFIG_USB_COMPOSITE_DEVICE
cdc_acm_cfg.iad_cdc.bFirstInterface = bInterfaceNumber; desc->iad_cdc.bFirstInterface = bInterfaceNumber;
#endif #endif
} }

View file

@ -491,8 +491,11 @@ static struct usb_ep_cfg_data hid_ep_data[] = {
#endif #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.bInterfaceNumber = bInterfaceNumber;
hid_cfg.if0.bNumEndpoints = ARRAY_SIZE(hid_ep_data); hid_cfg.if0.bNumEndpoints = ARRAY_SIZE(hid_ep_data);
} }

View file

@ -158,8 +158,11 @@ static int loopback_vendor_handler(struct usb_setup_packet *setup,
} }
/* usb.rst vendor handler end */ /* 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; loopback_cfg.if0.bInterfaceNumber = bInterfaceNumber;
} }

View file

@ -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; mass_cfg.if0.bInterfaceNumber = bInterfaceNumber;
} }

View file

@ -407,10 +407,13 @@ USBD_STRING_DESCR_DEFINE(primary) struct usb_cdc_ecm_mac_descr utf16le_mac = {
.bString = CONFIG_USB_DEVICE_NETWORK_ECM_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); int idx = usb_get_str_descriptor_idx(&utf16le_mac);
ARG_UNUSED(head);
if (idx) { if (idx) {
LOG_DBG("fixup string %d", idx); LOG_DBG("fixup string %d", idx);
cdc_ecm_cfg.if0_netfun_ecm.iMACAddress = idx; cdc_ecm_cfg.if0_netfun_ecm.iMACAddress = idx;

View file

@ -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; cdc_eem_cfg.if0.bInterfaceNumber = bInterfaceNumber;
} }

View file

@ -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.bInterfaceNumber = bInterfaceNumber;
rndis_cfg.if0_union.bControlInterface = bInterfaceNumber; rndis_cfg.if0_union.bControlInterface = bInterfaceNumber;
rndis_cfg.if0_union.bSubordinateInterface0 = bInterfaceNumber + 1; rndis_cfg.if0_union.bSubordinateInterface0 = bInterfaceNumber + 1;

View file

@ -673,8 +673,11 @@ static int dfu_custom_handle_req(struct usb_setup_packet *pSetup,
return -ENOTSUP; 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; dfu_cfg.if0.bInterfaceNumber = bInterfaceNumber;
} }

View file

@ -367,7 +367,7 @@ static int usb_fix_descriptor(struct usb_desc_header *head)
} }
if (cfg_data->interface_config) { if (cfg_data->interface_config) {
cfg_data->interface_config( cfg_data->interface_config(head,
numof_ifaces); numof_ifaces);
} }
} }