<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Switching off USB in a clean way</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/51571/switching-off-usb-in-a-clean-way</link><description>To the kind attention of Nordic support team, 
 I&amp;#39;m experiencing some problems switching off in a clean way the usbd library/usb driver/USB peripheral. I do need a clean switch off of everything comes after an app_usbd_init call in order to get everything</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Fri, 30 Aug 2019 08:21:24 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/51571/switching-off-usb-in-a-clean-way" /><item><title>RE: Switching off USB in a clean way</title><link>https://devzone.nordicsemi.com/thread/207041?ContentTypeID=1</link><pubDate>Fri, 30 Aug 2019 08:21:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d421fbea-0a3f-4441-903c-316b23ee4dc7</guid><dc:creator>astella</dc:creator><description>&lt;p&gt;It seems I got what I wanted, right now. My goal was to use the mentioned wanderful&amp;nbsp;&lt;span&gt;usbd_hid_composite&amp;nbsp;as it is. Then, in some cases, I would like to force like a USB reset, and a new enumeration process. Also, the device should be able to re-present itself to the host device using a dynamically changed descriptor (accordingly to the application requirements).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;After the normal flow to have usb up and running:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;I would need to stop the usb, dynamically change some of the usb descriptors and restart usb again.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m just trying to do something like this:&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;nrf_drv_usbd_stop()&lt;/p&gt;
&lt;p&gt;nrf_drv_usbd_disable()&lt;/p&gt;
&lt;p&gt;change&amp;nbsp;m_app_hid_kbd&amp;nbsp;&lt;/p&gt;
&lt;p&gt;app_usbd_class_remove to remove old istance&lt;/p&gt;
&lt;p&gt;app_usbd_hid_kbd_class_inst_get(&amp;amp;m_app_hid_kbd) // the updated instace&lt;/p&gt;
&lt;p&gt;app_usbd_class_append&lt;/p&gt;
&lt;p&gt;app_usbd_enable&lt;/p&gt;
&lt;p&gt;app_usbd_start&lt;/p&gt;
&lt;p&gt;Those things are working, as I see using an USB analyzer. Hope it is the standard procedure, that leaves that USB stack and peripheral in a consistent safe state. Could you convalidate this procedure?&lt;/p&gt;
&lt;p&gt;Thanks for your kind attention&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Switching off USB in a clean way</title><link>https://devzone.nordicsemi.com/thread/206936?ContentTypeID=1</link><pubDate>Thu, 29 Aug 2019 15:31:25 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5bea8dcb-0c84-4caf-9fa1-00a32f2e3e2e</guid><dc:creator>astella</dc:creator><description>&lt;p&gt;When using the software I mentioned (&lt;span&gt;usbd_hid_composite&amp;nbsp;&lt;/span&gt;) these are the routines called in order to have the usb up and running:&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I have to do something like this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;// ... stop and restart everything again&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;My question is: what do you recommend in order to be able to do like that? What&amp;nbsp; the // ... should be?&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;nrf_drv_usbd_stop(); ?&lt;br /&gt;nrf_drv_power_usbevt_uninit(); ?&lt;/p&gt;
&lt;p&gt;nrf_drv_usbd_disable(); ?&lt;/p&gt;
&lt;p&gt;nrf_drv_usbd_uninit(); ?&lt;/p&gt;
&lt;p&gt;1. app_usbd_init&lt;/p&gt;
&lt;p&gt;2. app_usbd_hid_kbd_class_inst_get&lt;/p&gt;
&lt;p&gt;3. app_usbd_class_append&lt;/p&gt;
&lt;p&gt;4. app_usbd_power_events_enable&lt;/p&gt;
&lt;p&gt;Hope that my question is clear. Best regards&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Switching off USB in a clean way</title><link>https://devzone.nordicsemi.com/thread/206911?ContentTypeID=1</link><pubDate>Thu, 29 Aug 2019 14:01:09 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:877f7256-777b-4d46-8d70-e048ab77af10</guid><dc:creator>astella</dc:creator><description>&lt;p&gt;Hi, I&amp;#39;d like to simply clean every usb initialization as it is done in the&amp;nbsp;&lt;span&gt;usbd_hid_composite sdk example.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For example, if I try and call an&amp;nbsp;app_usbd_uninit() at the end of your program, then I try to restart everything again as it is calling an app_usbd_init, I get an&amp;nbsp;NRF_ERROR_INVALID_STATE inside the&amp;nbsp;nrf_drv_usbd_init.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Switching off USB in a clean way</title><link>https://devzone.nordicsemi.com/thread/206905?ContentTypeID=1</link><pubDate>Thu, 29 Aug 2019 13:51:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:34edb577-4fbf-4c66-9f5e-cd913cf38fd4</guid><dc:creator>&amp;#216;yvind</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
[quote user=""]I&amp;#39;m experiencing some problems switching off in a clean way the usbd library/usb driver/USB peripheral[/quote]
&lt;p&gt;Can you please elaborate?&amp;nbsp; What kind of problems are you experiencing?&lt;br /&gt;&lt;br /&gt;Have a look at the &lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v15.2.0/hardware_driver_usbd.html?resultof=%22%73%64%6b%22%20%22%76%31%35%2e%32%22%20%22%75%73%62%64%22%20%22%73%74%6f%70%22%20"&gt;USBD Driver documentation&lt;/a&gt;&amp;nbsp;it states:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In most cases, enabling and starting of the&amp;nbsp;USBD&amp;nbsp;driver will be processed in response to USB power events (see&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v15.2.0/group__nrf__drv__power.html#gac86bbb91b3eb105d29295fc31cd63594"&gt;nrf_drv_power_usbevt_init&lt;/a&gt;). Using the&amp;nbsp;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v15.2.0/group__nrf__drv__power.html"&gt;POWER driver - legacy layer&lt;/a&gt;&amp;nbsp;driver, USB can be initialized in the following way:&lt;br /&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void power_usb_event_handler(nrf_drv_power_usb_evt_t event)
{
    switch(event)
    {
    case NRF_DRV_POWER_USB_EVT_DETECTED:
        if(!nrf_drv_usbd_is_enabled())
        {
            nrf_drv_usbd_enable();
        }
        break;
    case NRF_DRV_POWER_USB_EVT_REMOVED:
        if(nrf_drv_usbd_is_started())
        {
            nrf_drv_usbd_stop();
        }
        if(nrf_drv_usbd_is_enabled())
        {
            nrf_drv_usbd_disable();
        }
        break;
    case NRF_DRV_POWER_USB_EVT_READY:
        if(!nrf_drv_usbd_is_started())
        {
            nrf_drv_usbd_start(true);
        }
        break;
    default:
        ASSERT(false);
    }
}&lt;/pre&gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span&gt;Example code that provides USB HID functionality using only the&amp;nbsp;USBD&amp;nbsp;driver can be found here:&amp;nbsp;&lt;/span&gt;&lt;a href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sdk5.v15.2.0/usbd_example.html"&gt;USB Device Example&lt;/a&gt;&lt;span&gt;&amp;nbsp;(examples\peripheral\usbd).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;Kind regards,&lt;br /&gt;Øyvind&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>