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;
|
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 */
|
||||||
|
|
|
@ -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,
|
||||||
*
|
|
||||||
* @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)
|
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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue