diff --git a/drivers/console/uart_console.c b/drivers/console/uart_console.c index 57973018cfc..f7d2a8099dd 100644 --- a/drivers/console/uart_console.c +++ b/drivers/console/uart_console.c @@ -599,7 +599,7 @@ static int uart_console_init(struct device *arg) #if defined(CONFIG_USB_UART_CONSOLE) && defined(CONFIG_USB_UART_DTR_WAIT) int ret; - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { return ret; } diff --git a/include/usb/class/usb_hid.h b/include/usb/class/usb_hid.h index f6c23ed79ad..83cc7defbcd 100644 --- a/include/usb/class/usb_hid.h +++ b/include/usb/class/usb_hid.h @@ -82,7 +82,6 @@ struct hid_ops { #ifdef CONFIG_ENABLE_HID_INT_OUT_EP hid_int_ready_callback int_out_ready; #endif - usb_dc_status_callback status_cb; }; /* HID Report Definitions */ diff --git a/include/usb/usb_device.h b/include/usb/usb_device.h index 13e3c352f93..c383cafe48c 100644 --- a/include/usb/usb_device.h +++ b/include/usb/usb_device.h @@ -227,9 +227,12 @@ int usb_deconfig(void); * before invoking this, so that any data or events on the bus are processed * correctly by the associated class handling code. * + * @param[in] status_cb Callback registered by user to notify + * about USB device controller state. + * * @return 0 on success, negative errno code on fail. */ -int usb_enable(void); +int usb_enable(usb_dc_status_callback status_cb); /** * @brief Disable the USB device diff --git a/samples/bluetooth/hci_usb/src/main.c b/samples/bluetooth/hci_usb/src/main.c index 39f62535226..6fe09a3df10 100644 --- a/samples/bluetooth/hci_usb/src/main.c +++ b/samples/bluetooth/hci_usb/src/main.c @@ -12,7 +12,7 @@ void main(void) { int ret; - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { printk("Failed to enable USB"); return; diff --git a/samples/boards/intel_s1000_crb/audio/src/usb_transport.c b/samples/boards/intel_s1000_crb/audio/src/usb_transport.c index 6cf0d7ead4e..7246d6599d0 100644 --- a/samples/boards/intel_s1000_crb/audio/src/usb_transport.c +++ b/samples/boards/intel_s1000_crb/audio/src/usb_transport.c @@ -98,7 +98,7 @@ int usb_transport_init(usb_transport_receive_callback_t callback) receive_data_cb = callback; - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/sensor/fxos8700-hid/src/main.c b/samples/sensor/fxos8700-hid/src/main.c index 5be03a77052..b54f69e1ebf 100644 --- a/samples/sensor/fxos8700-hid/src/main.c +++ b/samples/sensor/fxos8700-hid/src/main.c @@ -247,7 +247,7 @@ void main(void) usb_hid_register_device(hid_dev, hid_report_desc, sizeof(hid_report_desc), NULL); - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/cdc_acm/src/main.c b/samples/subsys/usb/cdc_acm/src/main.c index 80f3286812f..8c2bb6abf5d 100644 --- a/samples/subsys/usb/cdc_acm/src/main.c +++ b/samples/subsys/usb/cdc_acm/src/main.c @@ -82,7 +82,7 @@ void main(void) return; } - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/cdc_acm_composite/src/main.c b/samples/subsys/usb/cdc_acm_composite/src/main.c index e7e97e6e046..92a598501aa 100644 --- a/samples/subsys/usb/cdc_acm_composite/src/main.c +++ b/samples/subsys/usb/cdc_acm_composite/src/main.c @@ -131,7 +131,7 @@ void main(void) return; } - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/dfu/src/main.c b/samples/subsys/usb/dfu/src/main.c index faf722897b9..b6e9d337897 100644 --- a/samples/subsys/usb/dfu/src/main.c +++ b/samples/subsys/usb/dfu/src/main.c @@ -16,7 +16,7 @@ void main(void) { int ret; - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/hid-cdc/src/main.c b/samples/subsys/usb/hid-cdc/src/main.c index 143f584da95..9308b65452b 100644 --- a/samples/subsys/usb/hid-cdc/src/main.c +++ b/samples/subsys/usb/hid-cdc/src/main.c @@ -551,6 +551,11 @@ int callbacks_configure(struct device *gpio, u32_t pin, int flags, return 0; } +static void status_cb(enum usb_dc_status_code status, const u8_t *param) +{ + LOG_INF("Status %d", status); +} + void main(void) { int ret; @@ -626,7 +631,7 @@ void main(void) usb_hid_init(hid0_dev); usb_hid_init(hid1_dev); - ret = usb_enable(); + ret = usb_enable(status_cb); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/hid-mouse/src/main.c b/samples/subsys/usb/hid-mouse/src/main.c index 8afaade5b49..95f793664c4 100644 --- a/samples/subsys/usb/hid-mouse/src/main.c +++ b/samples/subsys/usb/hid-mouse/src/main.c @@ -214,7 +214,6 @@ int callbacks_configure(struct device *gpio, u32_t pin, int flags, void main(void) { int ret; - u8_t report[4] = { 0x00 }; u8_t toggle = 0U; struct device *led_dev, *hid_dev; @@ -263,16 +262,13 @@ void main(void) } #endif - static const struct hid_ops ops = { - .status_cb = status_cb - }; usb_hid_register_device(hid_dev, hid_report_desc, sizeof(hid_report_desc), - &ops); + NULL); usb_hid_init(hid_dev); - ret = usb_enable(); + ret = usb_enable(status_cb); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/hid/src/main.c b/samples/subsys/usb/hid/src/main.c index 57ed2758983..bc199b13af9 100644 --- a/samples/subsys/usb/hid/src/main.c +++ b/samples/subsys/usb/hid/src/main.c @@ -109,7 +109,6 @@ static void protocol_cb(u8_t protocol) static const struct hid_ops ops = { .int_in_ready = in_ready_cb, - .status_cb = status_cb, .on_idle = idle_cb, .protocol_change = protocol_cb, }; @@ -120,7 +119,7 @@ void main(void) LOG_DBG("Starting application"); - ret = usb_enable(); + ret = usb_enable(status_cb); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/mass/src/main.c b/samples/subsys/usb/mass/src/main.c index 05d790a20de..5ee2677c8a3 100644 --- a/samples/subsys/usb/mass/src/main.c +++ b/samples/subsys/usb/mass/src/main.c @@ -30,7 +30,7 @@ void main(void) { int ret; - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/testusb/src/main.c b/samples/subsys/usb/testusb/src/main.c index 4552bb12ff7..765e33066a9 100644 --- a/samples/subsys/usb/testusb/src/main.c +++ b/samples/subsys/usb/testusb/src/main.c @@ -13,7 +13,7 @@ void main(void) { int ret; - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/samples/subsys/usb/webusb/src/main.c b/samples/subsys/usb/webusb/src/main.c index 9ccff444632..4aea56a02d7 100644 --- a/samples/subsys/usb/webusb/src/main.c +++ b/samples/subsys/usb/webusb/src/main.c @@ -290,7 +290,7 @@ void main(void) /* Set the custom and vendor request handlers */ webusb_register_request_handlers(&req_handlers); - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/subsys/usb/class/hid/core.c b/subsys/usb/class/hid/core.c index f3d8f070929..522546b7c37 100644 --- a/subsys/usb/class/hid/core.c +++ b/subsys/usb/class/hid/core.c @@ -376,9 +376,6 @@ static void hid_do_status_cb(struct hid_device_info *dev_data, break; } - if (dev_data->ops && dev_data->ops->status_cb) { - dev_data->ops->status_cb(status, param); - } } static void hid_status_cb(struct usb_cfg_data *cfg, diff --git a/subsys/usb/class/netusb/netusb.c b/subsys/usb/class/netusb/netusb.c index 77f8be4d58d..162c332aa10 100644 --- a/subsys/usb/class/netusb/netusb.c +++ b/subsys/usb/class/netusb/netusb.c @@ -131,7 +131,7 @@ static void netusb_init(struct net_if *iface) LOG_DBG("netusb device initialization"); - ret = usb_enable(); + ret = usb_enable(NULL); if (ret != 0) { LOG_ERR("Failed to enable USB"); return; diff --git a/subsys/usb/usb_device.c b/subsys/usb/usb_device.c index 029cc33e2bb..1aaf4a3bf5e 100644 --- a/subsys/usb/usb_device.c +++ b/subsys/usb/usb_device.c @@ -150,8 +150,10 @@ static struct usb_dev_priv { bool zlp_flag; /** Installed custom request handler */ usb_request_handler custom_req_handler; - /** USB stack status clalback */ + /** USB stack status callback */ usb_dc_status_callback status_callback; + /** USB user status callback */ + usb_dc_status_callback user_status_callback; /** Pointer to registered descriptors */ const u8_t *descriptors; /** Array of installed request handler callbacks */ @@ -979,6 +981,10 @@ static void forward_status_cb(enum usb_dc_status_code status, const u8_t *param) cfg->cb_usb_status(cfg, status, param); } } + + if (usb_dev.user_status_callback) { + usb_dev.user_status_callback(status, param); + } } /** @@ -1035,6 +1041,9 @@ int usb_deconfig(void) /* unregister status callback */ usb_register_status_callback(NULL); + /* unregister user status callback */ + usb_dev.user_status_callback = NULL; + /* Reset USB controller */ usb_dc_reset(); @@ -1533,7 +1542,7 @@ int usb_set_config(const u8_t *device_descriptor) return 0; } -int usb_enable(void) +int usb_enable(usb_dc_status_callback status_cb) { int ret; u32_t i; @@ -1556,6 +1565,7 @@ int usb_enable(void) goto out; } + usb_dev.user_status_callback = status_cb; usb_register_status_callback(forward_status_cb); usb_dc_set_status_callback(forward_status_cb);