From b48a8c3247391e05e9f1cb983a2cd565a70dbba4 Mon Sep 17 00:00:00 2001 From: Andrei Emeltchenko Date: Thu, 24 Jan 2019 11:23:59 +0200 Subject: [PATCH] usb: device: Add composite status callback Add new status callback with usb_cfg_data parameter to be able to identify instance callback. Signed-off-by: Andrei Emeltchenko --- include/usb/usb_device.h | 5 ++++ subsys/usb/class/cdc_acm.c | 50 +++++++++++++++++++++++++++++--------- subsys/usb/usb_device.c | 6 +++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/include/usb/usb_device.h b/include/usb/usb_device.h index aedb06ee057..edfd879c69e 100644 --- a/include/usb/usb_device.h +++ b/include/usb/usb_device.h @@ -191,6 +191,11 @@ struct usb_cfg_data { usb_interface_config interface_config; /** Callback to be notified on USB connection status change */ usb_dc_status_callback cb_usb_status; + /** Composite callback */ + void (*cb_usb_status_composite)(struct usb_cfg_data *cfg, + enum usb_dc_status_code cb_status, + const u8_t *param); + /** USB interface (Class) handler and storage space */ struct usb_interface_cfg_data interface; /** Number of individual endpoints in the device configuration */ diff --git a/subsys/usb/class/cdc_acm.c b/subsys/usb/class/cdc_acm.c index ef77cce6f77..8c31c82fc7f 100644 --- a/subsys/usb/class/cdc_acm.c +++ b/subsys/usb/class/cdc_acm.c @@ -452,19 +452,10 @@ static void cdc_acm_int_in(u8_t ep, enum usb_dc_ep_cb_status_code ep_status) LOG_DBG("CDC_IntIN EP[%x]\r", ep); } -/** - * @brief Callback used to know the USB connection status - * - * @param status USB device status code. - * - * @return N/A. - */ -static void cdc_acm_dev_status_cb(enum usb_dc_status_code status, - const u8_t *param) +static void cdc_acm_do_cb(struct cdc_acm_dev_data_t *dev_data, + enum usb_dc_status_code status, + const u8_t *param) { - struct cdc_acm_dev_data_t * const dev_data = DEV_DATA(cdc_acm_dev); - - ARG_UNUSED(param); /* Store the new status */ if (status != USB_DC_SOF) { @@ -504,6 +495,41 @@ static void cdc_acm_dev_status_cb(enum usb_dc_status_code status, } } +#if defined(CONFIG_USB_COMPOSITE_DEVICE) +static void cdc_acm_dev_status_composite_cb(struct usb_cfg_data *cfg, + enum usb_dc_status_code status, + const u8_t *param) +{ + struct usb_if_descriptor *if_desc = (void *)cfg->interface_descriptor; + struct cdc_acm_dev_data_t *dev_data; + + dev_data = get_dev_data_by_iface(if_desc->bInterfaceNumber); + if (!dev_data) { + LOG_WRN("Device data not found for interface %u", + if_desc->bInterfaceNumber); + return; + } + + cdc_acm_do_cb(dev_data, status, param); +} +#else +static void cdc_acm_dev_status_cb(enum usb_dc_status_code status, + const u8_t *param) +{ + struct cdc_acm_dev_data_t *dev_data; + + /* Should be the only one element in the list */ + dev_data = CONTAINER_OF(sys_slist_peek_head(&cdc_acm_data_devlist), + struct cdc_acm_dev_data_t, node); + if (dev_data == NULL) { + LOG_WRN("Device data not found"); + return; + } + + cdc_acm_do_cb(dev_data, status, param); +} +#endif + static void cdc_interface_config(struct usb_desc_header *head, u8_t bInterfaceNumber) { diff --git a/subsys/usb/usb_device.c b/subsys/usb/usb_device.c index 48b5edcf457..22274c7f998 100644 --- a/subsys/usb/usb_device.c +++ b/subsys/usb/usb_device.c @@ -1377,8 +1377,10 @@ static void forward_status_cb(enum usb_dc_status_code status, const u8_t *param) size_t size = (__usb_data_end - __usb_data_start); for (size_t i = 0; i < size; i++) { - if (__usb_data_start[i].cb_usb_status) { - __usb_data_start[i].cb_usb_status(status, param); + struct usb_cfg_data *cfg = &__usb_data_start[i]; + + if (cfg->cb_usb_status_composite) { + cfg->cb_usb_status_composite(cfg, status, param); } } }