<?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>LPC MicrocontrollersのトピックUSB ROM API bulk OUT endpoint problem</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/USB-ROM-API-bulk-OUT-endpoint-problem/m-p/524410#M7046</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wlamers on Tue Jun 03 07:17:47 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Having ported an application from NXPUSBLib to the USB ROM API runs me into trouble when transferring large amounts of data from the host (PC) to the device (LPC4357) using bulk transfers.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I set up a read request using :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;int32_t libusbdev_Read_DataEp(uint8_t *pBuf, uint32_t buf_len)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t ret = -1;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Queue read request&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (libusbdev_QueueReadReq_DataEp(pBuf, buf_len) == LPC_OK) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wait for Rx to complete */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( (ret = libusbdev_QueueReadDone()) == -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Sleep until next IRQ happens */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __WFI();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;ErrorCode_t libusbdev_QueueReadReq_DataEp(uint8_t *pBuf, uint32_t buf_len)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; LUSB_CTRL_T *pUSB = (LUSB_CTRL_T *) &amp;amp;g_lusb;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorCode_t ret = ERR_FAILED;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if a read request is pending */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pUSB-&amp;gt;pRxBuf == 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Queue the read request */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;pRxBuf = pBuf;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;rxBuffLen = buf_len;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USBD_API-&amp;gt;hw-&amp;gt;ReadReqEP(pUSB-&amp;gt;hUsb, LUSB_DATAOUT_EP, pBuf, buf_len);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = LPC_OK;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;int32_t libusbdev_QueueReadDone(void)
{
LUSB_CTRL_T *pUSB = (LUSB_CTRL_T *) &amp;amp;g_lusb;

/* A read request is pending */
if (pUSB-&amp;gt;pRxBuf) {
return -1;
}
/* if data received return the length */
return pUSB-&amp;gt;rxBuffLen;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And the endpoint handler looks like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;ErrorCode_t lusb_BulkDataOUT_Hdlr(USBD_HANDLE_T hUsb, void *data, uint32_t event)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; LUSB_CTRL_T *pUSB = (LUSB_CTRL_T *) data;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t receivedBytes;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We received a transfer from the USB host. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (event == USB_EVT_OUT) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;rxBuffLen = USBD_API-&amp;gt;hw-&amp;gt;ReadEP(hUsb, LUSB_DATAOUT_EP, pUSB-&amp;gt;pRxBuf);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;pRxBuf = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; return LPC_OK;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The host tries to send data continioulsy (or at least untill all data is send). The problem is that it can send data without having to wait for the device to be ready to receive the next data chunk. Using NXPUSBLib this was no problem at all. How can I prevent the host from sending, e.g. locking the device from receiving data?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Maybe good te mention: the SysTick_Handler is doing a read request every 1ms but for another endpoint (a command endpoint). This is probably not relevant for the problem.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;How can I solve this? The USB ROM documentatin is very minimal.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 16:49:53 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T16:49:53Z</dc:date>
    <item>
      <title>USB ROM API bulk OUT endpoint problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/USB-ROM-API-bulk-OUT-endpoint-problem/m-p/524410#M7046</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wlamers on Tue Jun 03 07:17:47 MST 2014&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Having ported an application from NXPUSBLib to the USB ROM API runs me into trouble when transferring large amounts of data from the host (PC) to the device (LPC4357) using bulk transfers.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I set up a read request using :&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;int32_t libusbdev_Read_DataEp(uint8_t *pBuf, uint32_t buf_len)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t ret = -1;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Queue read request&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (libusbdev_QueueReadReq_DataEp(pBuf, buf_len) == LPC_OK) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* wait for Rx to complete */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ( (ret = libusbdev_QueueReadDone()) == -1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Sleep until next IRQ happens */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __WFI();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;ErrorCode_t libusbdev_QueueReadReq_DataEp(uint8_t *pBuf, uint32_t buf_len)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; LUSB_CTRL_T *pUSB = (LUSB_CTRL_T *) &amp;amp;g_lusb;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ErrorCode_t ret = ERR_FAILED;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check if a read request is pending */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (pUSB-&amp;gt;pRxBuf == 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Queue the read request */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;pRxBuf = pBuf;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;rxBuffLen = buf_len;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; USBD_API-&amp;gt;hw-&amp;gt;ReadReqEP(pUSB-&amp;gt;hUsb, LUSB_DATAOUT_EP, pBuf, buf_len);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = LPC_OK;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; return ret;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;int32_t libusbdev_QueueReadDone(void)
{
LUSB_CTRL_T *pUSB = (LUSB_CTRL_T *) &amp;amp;g_lusb;

/* A read request is pending */
if (pUSB-&amp;gt;pRxBuf) {
return -1;
}
/* if data received return the length */
return pUSB-&amp;gt;rxBuffLen;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;And the endpoint handler looks like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;ErrorCode_t lusb_BulkDataOUT_Hdlr(USBD_HANDLE_T hUsb, void *data, uint32_t event)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; LUSB_CTRL_T *pUSB = (LUSB_CTRL_T *) data;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int32_t receivedBytes;

&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We received a transfer from the USB host. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (event == USB_EVT_OUT) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;rxBuffLen = USBD_API-&amp;gt;hw-&amp;gt;ReadEP(hUsb, LUSB_DATAOUT_EP, pUSB-&amp;gt;pRxBuf);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pUSB-&amp;gt;pRxBuf = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; return LPC_OK;
}&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The host tries to send data continioulsy (or at least untill all data is send). The problem is that it can send data without having to wait for the device to be ready to receive the next data chunk. Using NXPUSBLib this was no problem at all. How can I prevent the host from sending, e.g. locking the device from receiving data?&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Maybe good te mention: the SysTick_Handler is doing a read request every 1ms but for another endpoint (a command endpoint). This is probably not relevant for the problem.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;How can I solve this? The USB ROM documentatin is very minimal.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:49:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/USB-ROM-API-bulk-OUT-endpoint-problem/m-p/524410#M7046</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:49:53Z</dc:date>
    </item>
    <item>
      <title>Re: USB ROM API bulk OUT endpoint problem</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/USB-ROM-API-bulk-OUT-endpoint-problem/m-p/524411#M7047</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by SeleneSW on Wed Dec 30 09:38:39 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi wlamers,&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;In your &lt;/SPAN&gt;&lt;STRONG&gt;lusb_BulkDataOUT_Hdlr&lt;/STRONG&gt;&lt;SPAN&gt; function you do an &lt;/SPAN&gt;&lt;STRONG&gt;USBD_API-&amp;gt;hw-&amp;gt;ReadEP&lt;/STRONG&gt;&lt;SPAN&gt; call, this call empties the USB peripheral buffer, and so it will be ready to recieve new data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;You could do a check if you already read the data in the &lt;/SPAN&gt;&lt;STRONG&gt;pUSB-&amp;gt;pRxBuf&lt;/STRONG&gt;&lt;SPAN&gt; buffer, and if not, you could skip the &lt;/SPAN&gt;&lt;STRONG&gt;USBD_API-&amp;gt;hw-&amp;gt;ReadEP&lt;/STRONG&gt;&lt;SPAN&gt; call for now, and you'll do it later when you are ready to recieve.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:49:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/USB-ROM-API-bulk-OUT-endpoint-problem/m-p/524411#M7047</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:49:54Z</dc:date>
    </item>
  </channel>
</rss>

