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 <andrei.emeltchenko@intel.com>
This commit is contained in:
Andrei Emeltchenko 2019-01-24 11:23:59 +02:00 committed by Anas Nashif
commit b48a8c3247
3 changed files with 47 additions and 14 deletions

View file

@ -191,6 +191,11 @@ struct usb_cfg_data {
usb_interface_config interface_config; usb_interface_config interface_config;
/** Callback to be notified on USB connection status change */ /** Callback to be notified on USB connection status change */
usb_dc_status_callback cb_usb_status; 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 */ /** USB interface (Class) handler and storage space */
struct usb_interface_cfg_data interface; struct usb_interface_cfg_data interface;
/** Number of individual endpoints in the device configuration */ /** Number of individual endpoints in the device configuration */

View file

@ -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); LOG_DBG("CDC_IntIN EP[%x]\r", ep);
} }
/** static void cdc_acm_do_cb(struct cdc_acm_dev_data_t *dev_data,
* @brief Callback used to know the USB connection status enum usb_dc_status_code status,
* const u8_t *param)
* @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)
{ {
struct cdc_acm_dev_data_t * const dev_data = DEV_DATA(cdc_acm_dev);
ARG_UNUSED(param);
/* Store the new status */ /* Store the new status */
if (status != USB_DC_SOF) { 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, static void cdc_interface_config(struct usb_desc_header *head,
u8_t bInterfaceNumber) u8_t bInterfaceNumber)
{ {

View file

@ -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); size_t size = (__usb_data_end - __usb_data_start);
for (size_t i = 0; i < size; i++) { for (size_t i = 0; i < size; i++) {
if (__usb_data_start[i].cb_usb_status) { struct usb_cfg_data *cfg = &__usb_data_start[i];
__usb_data_start[i].cb_usb_status(status, param);
if (cfg->cb_usb_status_composite) {
cfg->cb_usb_status_composite(cfg, status, param);
} }
} }
} }