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:
parent
9ef8ad412f
commit
b48a8c3247
3 changed files with 47 additions and 14 deletions
|
@ -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 */
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue