From 212875013839b23720b14b67ca7d150028d18575 Mon Sep 17 00:00:00 2001 From: Emil Obalski Date: Tue, 5 Nov 2019 15:24:45 +0100 Subject: [PATCH] usb: api: Add user device status callback By this commit user gets possibility to register USB device satutus callback. This callback represents device state and is added so user could know what happend to USB device. Callback is registered by providing it to usb_enable() USB api is extended by this callback handler. Samples using using USB are by default provide no callback and the usb_enable() is called with NULL parameter. Status callback registered by hid class is deleted as now USB device has global callback for all classes within device. Signed-off-by: Emil Obalski --- drivers/console/uart_console.c | 2 +- include/usb/class/usb_hid.h | 1 - include/usb/usb_device.h | 5 ++++- samples/bluetooth/hci_usb/src/main.c | 2 +- .../intel_s1000_crb/audio/src/usb_transport.c | 2 +- samples/sensor/fxos8700-hid/src/main.c | 2 +- samples/subsys/usb/cdc_acm/src/main.c | 2 +- samples/subsys/usb/cdc_acm_composite/src/main.c | 2 +- samples/subsys/usb/dfu/src/main.c | 2 +- samples/subsys/usb/hid-cdc/src/main.c | 7 ++++++- samples/subsys/usb/hid-mouse/src/main.c | 8 ++------ samples/subsys/usb/hid/src/main.c | 3 +-- samples/subsys/usb/mass/src/main.c | 2 +- samples/subsys/usb/testusb/src/main.c | 2 +- samples/subsys/usb/webusb/src/main.c | 2 +- subsys/usb/class/hid/core.c | 3 --- subsys/usb/class/netusb/netusb.c | 2 +- subsys/usb/usb_device.c | 14 ++++++++++++-- 18 files changed, 36 insertions(+), 27 deletions(-) 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);