diff --git a/drivers/console/uart_console.c b/drivers/console/uart_console.c index 94979bcf4d8..57973018cfc 100644 --- a/drivers/console/uart_console.c +++ b/drivers/console/uart_console.c @@ -33,6 +33,7 @@ #ifdef CONFIG_UART_CONSOLE_MCUMGR #include "mgmt/serial.h" #endif +#include static struct device *uart_console_dev; @@ -596,6 +597,13 @@ static int uart_console_init(struct device *arg) uart_console_dev = device_get_binding(CONFIG_UART_CONSOLE_ON_DEV_NAME); #if defined(CONFIG_USB_UART_CONSOLE) && defined(CONFIG_USB_UART_DTR_WAIT) + int ret; + + ret = usb_enable(); + if (ret != 0) { + return ret; + } + while (1) { u32_t dtr = 0U; diff --git a/include/usb/usb_device.h b/include/usb/usb_device.h index cd9c9f70c62..13e3c352f93 100644 --- a/include/usb/usb_device.h +++ b/include/usb/usb_device.h @@ -217,12 +217,15 @@ int usb_set_config(const u8_t *usb_descriptor); int usb_deconfig(void); /** - * @brief Enable USB for host/device connection + * @brief Enable the USB subsystem and associated hardware * - * Function to enable USB for host/device connection. - * Upon success, the USB module is no longer clock gated in hardware, - * it is now capable of transmitting and receiving on the USB bus and - * of generating interrupts. + * This function initializes the USB core subsystem and enables the + * corresponding hardware so that it can begin transmitting and receiving + * on the USB bus, as well as generating interrupts. + * + * Class-specific initialization and registration must be performed by the user + * before invoking this, so that any data or events on the bus are processed + * correctly by the associated class handling code. * * @return 0 on success, negative errno code on fail. */ diff --git a/samples/bluetooth/hci_usb/src/main.c b/samples/bluetooth/hci_usb/src/main.c index 35aabdcd488..39f62535226 100644 --- a/samples/bluetooth/hci_usb/src/main.c +++ b/samples/bluetooth/hci_usb/src/main.c @@ -6,8 +6,17 @@ #include #include +#include void main(void) { + int ret; + + ret = usb_enable(); + if (ret != 0) { + printk("Failed to enable USB"); + return; + } + printk("Bluetooth over USB sample\n"); } 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 b57ee8bad4e..6cf0d7ead4e 100644 --- a/samples/boards/intel_s1000_crb/audio/src/usb_transport.c +++ b/samples/boards/intel_s1000_crb/audio/src/usb_transport.c @@ -82,6 +82,8 @@ static struct device *hid_device; int usb_transport_init(usb_transport_receive_callback_t callback) { + int ret; + hid_device = device_get_binding("HID_0"); if (hid_device == NULL) { @@ -96,6 +98,12 @@ int usb_transport_init(usb_transport_receive_callback_t callback) receive_data_cb = callback; + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + /* initialize USB interface and HID class */ return usb_hid_init(hid_device); } diff --git a/samples/net/wpanusb/src/wpanusb.c b/samples/net/wpanusb/src/wpanusb.c index 187041743a6..de8688f172f 100644 --- a/samples/net/wpanusb/src/wpanusb.c +++ b/samples/net/wpanusb/src/wpanusb.c @@ -401,6 +401,7 @@ out: void main(void) { + int ret; LOG_INF("Starting wpanusb"); ieee802154_dev = device_get_binding(CONFIG_NET_CONFIG_IEEE802154_DEV_NAME); @@ -417,6 +418,11 @@ void main(void) radio_api = (struct ieee802154_radio_api *)ieee802154_dev->driver_api; + ret = usb_enable(NULL); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } /* TODO: Initialize more */ LOG_DBG("radio_api %p initialized", radio_api); diff --git a/samples/sensor/fxos8700-hid/src/main.c b/samples/sensor/fxos8700-hid/src/main.c index 07091815022..5be03a77052 100644 --- a/samples/sensor/fxos8700-hid/src/main.c +++ b/samples/sensor/fxos8700-hid/src/main.c @@ -184,6 +184,7 @@ static void trigger_handler(struct device *dev, struct sensor_trigger *tr) void main(void) { + int ret; u8_t report[4] = { 0x00 }; u8_t toggle = 0U; struct device *led_dev, *accel_dev, *hid_dev; @@ -245,6 +246,13 @@ void main(void) usb_hid_register_device(hid_dev, hid_report_desc, sizeof(hid_report_desc), NULL); + + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + usb_hid_init(hid_dev); while (true) { diff --git a/samples/subsys/usb/cdc_acm/src/main.c b/samples/subsys/usb/cdc_acm/src/main.c index 18a64620ec6..80f3286812f 100644 --- a/samples/subsys/usb/cdc_acm/src/main.c +++ b/samples/subsys/usb/cdc_acm/src/main.c @@ -19,6 +19,7 @@ #include #include +#include #include LOG_MODULE_REGISTER(cdc_acm_echo, LOG_LEVEL_INF); @@ -81,6 +82,12 @@ void main(void) return; } + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + ring_buf_init(&ringbuf, sizeof(ring_buffer), ring_buffer); LOG_INF("Wait for DTR"); diff --git a/samples/subsys/usb/cdc_acm_composite/src/main.c b/samples/subsys/usb/cdc_acm_composite/src/main.c index 7c51a2d46bd..e7e97e6e046 100644 --- a/samples/subsys/usb/cdc_acm_composite/src/main.c +++ b/samples/subsys/usb/cdc_acm_composite/src/main.c @@ -19,6 +19,7 @@ #include #include +#include #include LOG_MODULE_REGISTER(cdc_acm_composite, LOG_LEVEL_INF); @@ -111,6 +112,8 @@ static void uart_line_set(struct device *dev) void main(void) { + int ret; + struct serial_data *dev_data0 = &peers[0]; struct serial_data *dev_data1 = &peers[1]; struct device *dev0, *dev1; @@ -128,6 +131,12 @@ void main(void) return; } + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + LOG_INF("Wait for DTR"); while (1) { diff --git a/samples/subsys/usb/dfu/src/main.c b/samples/subsys/usb/dfu/src/main.c index 59ff26bcd98..faf722897b9 100644 --- a/samples/subsys/usb/dfu/src/main.c +++ b/samples/subsys/usb/dfu/src/main.c @@ -9,12 +9,18 @@ #include #include +#include LOG_MODULE_REGISTER(main); void main(void) { - /* Nothing to be done other than the selecting appropriate build - * config options. Use dfu-util to update the device. - */ + int ret; + + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + LOG_INF("This device supports USB DFU class.\n"); } diff --git a/samples/subsys/usb/hid-cdc/src/main.c b/samples/subsys/usb/hid-cdc/src/main.c index 3621c371be0..143f584da95 100644 --- a/samples/subsys/usb/hid-cdc/src/main.c +++ b/samples/subsys/usb/hid-cdc/src/main.c @@ -553,6 +553,8 @@ int callbacks_configure(struct device *gpio, u32_t pin, int flags, void main(void) { + int ret; + struct device *hid0_dev, *hid1_dev, *cdc0_dev, *cdc1_dev; u32_t dtr = 0U; struct app_evt_t *ev; @@ -620,9 +622,16 @@ void main(void) usb_hid_register_device(hid1_dev, hid_kbd_report_desc, sizeof(hid_kbd_report_desc), &ops); + usb_hid_init(hid0_dev); usb_hid_init(hid1_dev); + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + /* Initialize CDC ACM */ LOG_INF("Wait for DTR on CDC ACM 0"); diff --git a/samples/subsys/usb/hid-mouse/src/main.c b/samples/subsys/usb/hid-mouse/src/main.c index 0a53d6314b0..8afaade5b49 100644 --- a/samples/subsys/usb/hid-mouse/src/main.c +++ b/samples/subsys/usb/hid-mouse/src/main.c @@ -213,6 +213,8 @@ 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; @@ -267,8 +269,15 @@ void main(void) usb_hid_register_device(hid_dev, hid_report_desc, sizeof(hid_report_desc), &ops); + usb_hid_init(hid_dev); + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + while (true) { k_sem_take(&sem, K_FOREVER); diff --git a/samples/subsys/usb/hid/src/main.c b/samples/subsys/usb/hid/src/main.c index da95864246d..57ed2758983 100644 --- a/samples/subsys/usb/hid/src/main.c +++ b/samples/subsys/usb/hid/src/main.c @@ -116,8 +116,16 @@ static const struct hid_ops ops = { void main(void) { + int ret; + LOG_DBG("Starting application"); + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + k_delayed_work_init(&delayed_report_send, send_report); } diff --git a/samples/subsys/usb/mass/src/main.c b/samples/subsys/usb/mass/src/main.c index ca73f94c34a..05d790a20de 100644 --- a/samples/subsys/usb/mass/src/main.c +++ b/samples/subsys/usb/mass/src/main.c @@ -9,6 +9,7 @@ #include #include +#include LOG_MODULE_REGISTER(main); #if CONFIG_DISK_ACCESS_FLASH && CONFIG_FAT_FILESYSTEM_ELM @@ -27,9 +28,14 @@ static struct fs_mount_t fatfs_mnt = { void main(void) { - /* Nothing to be done other than the selecting appropriate build - * config options. Everything is driven from the USB host side. - */ + int ret; + + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + LOG_INF("The device is put in USB mass storage mode.\n"); #if CONFIG_DISK_ACCESS_FLASH && CONFIG_FAT_FILESYSTEM_ELM diff --git a/samples/subsys/usb/testusb/src/main.c b/samples/subsys/usb/testusb/src/main.c index f0702753675..4552bb12ff7 100644 --- a/samples/subsys/usb/testusb/src/main.c +++ b/samples/subsys/usb/testusb/src/main.c @@ -6,9 +6,19 @@ #include #include +#include LOG_MODULE_REGISTER(main); void main(void) { + int ret; + + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + LOG_INF("entered main."); } + diff --git a/samples/subsys/usb/webusb/src/main.c b/samples/subsys/usb/webusb/src/main.c index 6c0b1e6f42d..9ccff444632 100644 --- a/samples/subsys/usb/webusb/src/main.c +++ b/samples/subsys/usb/webusb/src/main.c @@ -283,11 +283,20 @@ static struct webusb_req_handlers req_handlers = { void main(void) { + int ret; + LOG_DBG(""); /* Set the custom and vendor request handlers */ webusb_register_request_handlers(&req_handlers); + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + usb_bos_register_cap((void *)&bos_cap_webusb); usb_bos_register_cap((void *)&bos_cap_msosv2); } + diff --git a/subsys/usb/class/netusb/netusb.c b/subsys/usb/class/netusb/netusb.c index 2aa4eabca61..77f8be4d58d 100644 --- a/subsys/usb/class/netusb/netusb.c +++ b/subsys/usb/class/netusb/netusb.c @@ -125,10 +125,18 @@ bool netusb_enabled(void) static void netusb_init(struct net_if *iface) { + int ret; + static u8_t mac[6] = { 0x00, 0x00, 0x5E, 0x00, 0x53, 0x00 }; LOG_DBG("netusb device initialization"); + ret = usb_enable(); + if (ret != 0) { + LOG_ERR("Failed to enable USB"); + return; + } + netusb.iface = iface; ethernet_init(iface); diff --git a/subsys/usb/usb_device.c b/subsys/usb/usb_device.c index 6cbda2c0690..029cc33e2bb 100644 --- a/subsys/usb/usb_device.c +++ b/subsys/usb/usb_device.c @@ -1645,8 +1645,6 @@ static int usb_device_init(struct device *dev) usb_set_config(device_descriptor); - usb_enable(); - return 0; } diff --git a/tests/subsys/usb/device/src/main.c b/tests/subsys/usb/device/src/main.c index 89e38bac780..72cca7dd923 100644 --- a/tests/subsys/usb/device/src/main.c +++ b/tests/subsys/usb/device/src/main.c @@ -190,6 +190,14 @@ static void test_usb_dc_api_read_write(void) /*test case main entry*/ void test_main(void) { + int ret; + + ret = usb_enable(NULL); + if (ret != 0) { + printk("Failed to enable USB\n"); + return; + } + ztest_test_suite(test_device, /* Test API for not USB attached state */ ztest_unit_test(test_usb_dc_api_invalid),