<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: [MQX3.8]: How USB Bus Reset Works in MQX Software Solutions</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX3-8-How-USB-Bus-Reset-Works/m-p/467949#M15557</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Hui,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Reset condition is sent to device once an attach event is received.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Basically, attach event is detected by hardware and internally, the module sets the USBx_ISTAT[ATTACH] flag, in the USB stack, there is a task that polls for this event (_usb_khci_task), if this attach flag is set, then KHCI controller calls the _usb_khci_attach function (located at khci.c file), in this function, stack does perform the High speed detection handshake to detect device's speed, then, a BUS RESET is applied for 30 ms seconds:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14561792183952824 jive_text_macro" data-renderedposition="190_8_1192_256" jivemacro_uid="_14561792183952824" modifiedtitle="true"&gt;&lt;P&gt;// speed check, set&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_host_ptr-&amp;gt;G.SPEED = (uint8_t)((usb_ptr-&amp;gt;CTL &amp;amp; USB_CTL_JSTATE_MASK) ? USB_SPEED_FULL : USB_SPEED_LOW);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (usb_host_ptr-&amp;gt;G.SPEED == USB_SPEED_FULL)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;ADDR &amp;amp;= ~USB_ADDR_LSEN_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;ISTAT = 0xff;&amp;nbsp;&amp;nbsp; // clean each int flags&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;INTEN = \&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_INTEN_TOKDNEEN_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_INTEN_USBRSTEN_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // bus reset&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;CTL |= USB_CTL_RESET_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _time_delay(30); //wait for 30 milliseconds (2.5 is minimum for reset, 10 recommended)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;CTL &amp;amp;= ~USB_CTL_RESET_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After that, enumeration process is taken place.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is an USB capture that shows this process and see that you only need to generate one USB RESET signal on device to enumerate it correctly. (I recommend you to use a USB Host stack newer than 3.8)&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="USB Reset Signal.jpg"&gt;&lt;IMG alt="USB Reset Signal.jpg" src="https://community.nxp.com/t5/image/serverpage/image-id/53662i186E27CE6E3A48A4/image-size/large?v=v2&amp;amp;px=999" title="USB Reset Signal.jpg" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I hope this can help you!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Isaac&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 02 Nov 2020 13:24:34 GMT</pubDate>
    <dc:creator>isaacavila</dc:creator>
    <dc:date>2020-11-02T13:24:34Z</dc:date>
    <item>
      <title>[MQX3.8]: How USB Bus Reset Works</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX3-8-How-USB-Bus-Reset-Works/m-p/467948#M15556</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi -&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My USB host is k20d72 and MQX3.8 based board while my USB device is powered by k20d50 and MQX4.1. The communication over USB is HID class based. The enumeration is done by soft-attach via applying power to Vbus each time when the communication is needed.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Usually this way of mechanism is working fine except for enumeration failure with rate like one out of a thousand enumerations. Although it can be worked around by a re-try by powering cycling Vbus but I want to dig into it a bit. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;With help by a data logger, I can see that when failure happens, USB device is already powered up but doesn't see USB_APP_ENUM_COMPLETE event even though there is one USB bus reset from host.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For some unusual cases, USB host does send out more than one USB bus resets to device to get enumeration done successfully.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;My question is, what is the condition for RESET to be sent out more than once? Why for my failure cases, only one bus reset is sent out? Any other reason could prevent enumeration from going through?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;thanks!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hui &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 17 Feb 2016 19:28:29 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/MQX3-8-How-USB-Bus-Reset-Works/m-p/467948#M15556</guid>
      <dc:creator>huishao2</dc:creator>
      <dc:date>2016-02-17T19:28:29Z</dc:date>
    </item>
    <item>
      <title>Re: [MQX3.8]: How USB Bus Reset Works</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX3-8-How-USB-Bus-Reset-Works/m-p/467949#M15557</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Hui,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Reset condition is sent to device once an attach event is received.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Basically, attach event is detected by hardware and internally, the module sets the USBx_ISTAT[ATTACH] flag, in the USB stack, there is a task that polls for this event (_usb_khci_task), if this attach flag is set, then KHCI controller calls the _usb_khci_attach function (located at khci.c file), in this function, stack does perform the High speed detection handshake to detect device's speed, then, a BUS RESET is applied for 30 ms seconds:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14561792183952824 jive_text_macro" data-renderedposition="190_8_1192_256" jivemacro_uid="_14561792183952824" modifiedtitle="true"&gt;&lt;P&gt;// speed check, set&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_host_ptr-&amp;gt;G.SPEED = (uint8_t)((usb_ptr-&amp;gt;CTL &amp;amp; USB_CTL_JSTATE_MASK) ? USB_SPEED_FULL : USB_SPEED_LOW);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (usb_host_ptr-&amp;gt;G.SPEED == USB_SPEED_FULL)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;ADDR &amp;amp;= ~USB_ADDR_LSEN_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;ISTAT = 0xff;&amp;nbsp;&amp;nbsp; // clean each int flags&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;INTEN = \&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_INTEN_TOKDNEEN_MASK |&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USB_INTEN_USBRSTEN_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // bus reset&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;CTL |= USB_CTL_RESET_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _time_delay(30); //wait for 30 milliseconds (2.5 is minimum for reset, 10 recommended)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usb_ptr-&amp;gt;CTL &amp;amp;= ~USB_CTL_RESET_MASK;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After that, enumeration process is taken place.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is an USB capture that shows this process and see that you only need to generate one USB RESET signal on device to enumerate it correctly. (I recommend you to use a USB Host stack newer than 3.8)&lt;/P&gt;&lt;P&gt;&lt;SPAN class="lia-inline-image-display-wrapper" image-alt="USB Reset Signal.jpg"&gt;&lt;IMG alt="USB Reset Signal.jpg" src="https://community.nxp.com/t5/image/serverpage/image-id/53662i186E27CE6E3A48A4/image-size/large?v=v2&amp;amp;px=999" title="USB Reset Signal.jpg" /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;I hope this can help you!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Isaac&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 02 Nov 2020 13:24:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/MQX3-8-How-USB-Bus-Reset-Works/m-p/467949#M15557</guid>
      <dc:creator>isaacavila</dc:creator>
      <dc:date>2020-11-02T13:24:34Z</dc:date>
    </item>
  </channel>
</rss>

