<?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 USB MSC Host Issues. in LPC Microcontrollers</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/USB-MSC-Host-Issues/m-p/523320#M5956</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by MikeSimmonds on Thu Mar 26 06:04:17 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi forumites.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am in the process of developing mass storage class host software on the LPC1778.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Of course, the UM bows out and refers me to the OHCI spec. [Note to NXP, a link to this in the UM would be nice in the next revision.]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Any way, I sourced this and ...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have completed the basic USB detatch/insert and enumeration pass with no worries.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When I find a USB stick with a suitable SCSI/Bulk Only Configuation, I move on to the MSC part of things.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I found some 2008 NXP CMSIS based source [CodeRed era?] to look at.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Their Init function&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMaxLUN();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Get maximum logical unit number&amp;nbsp;&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (retry&amp;nbsp; = 80; retry--)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = TestUnitReady();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Test whether the unit is ready&amp;nbsp;&amp;nbsp;&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rc == OK)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetSenseInfo();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Get sense information&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;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rc != OK)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT_Err(rc);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(rc);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = ReadCapacity(numBlks, blkSize);/* Read capacity of the disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; BlkSize = *blkSize;// Set global
&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = Inquire(inquiryResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp; return (rc);
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My 'InitMS' function followed this scheme but omited 'GetLUN' because the any result was not available and never used.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Initially, I was getting hangs because the 1st TestUnitReady was returning continuous NAK's and the 'TDProcess' subroutine&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;was spinning on 'WDH Done' (as recognised by the USB interrupt).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But for NAK returns, this never happens -- &lt;/SPAN&gt;&lt;I&gt;Is this a flaw in the OHCI design?&lt;/I&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So I had some fun and games trying to set a time out that was long enough for a 'done' (OK/Non-NAK error) to be set.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any way, I ended up (due to web postings) moving the Device Enquiry before the TestUnit ready.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Up to this point, I was testing with a single USB stick (in case I bricked it).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When I stared testing on 8 other USB sticks that I had to hand, some anomalies arose.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;One would show flickering of the USB connect LED for about 17 seconds and thereafter enumerate and work fine.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;One would fail (with NAKS) if inserted into a running system, but succeded if I use the debugger to set the PC back to the enumeration (without removing the drive).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;One simply refused to respond to Enquiry either way.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Anyway, I found a solution of sorts, but I dont understand why.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I added DeviceReset EP1, EP2 clear feature before the 1st Enquiry, but these all return STALL, So ignore them.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The first MSC call is Enquiry -- if I &lt;/SPAN&gt;&lt;I&gt;add a delay (and this is the stange part)&lt;/I&gt;&lt;SPAN&gt; between the CBW transaction and the data in phase&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;it all works on all devices and I can read the 1st sector at LBA 0. [No other SCSI commands have such a delay.]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If I don't use the delay, when things fail, absolutely everything just returns endless NAKs. Even with (10's of seconds timeouts).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;However, for the worst case (of the devices that I have available) I need a delay of over 800 milliseconds for reliable operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[Kingston DT101 G2, 16GB]&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anyone have any comments, observations, experience, or anecdotes regarding this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As I said, I think now that I can move forward and work on the file system code.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Code Snips&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
;-----------------------------------------------------------------------!
; InitMS!
;-----------------------------------------------------------------------!

fn InitMS

push{r4-r7,lr}; save regs
ldrr5, =usbBase; get base register
movsr7, hostBase; and host base

ldrr1, =bulkReset; reset device
blUsbCtrlSend;
ldrr1, =clear1; clear endpoint 1
blUsbCtrlSend;
ldrr1, =clear2; clear endpoint 2
blUsbCtrlSend;

;;blMaxLUN; why -- no result, not used
blDevEnquiry; why -- result not used
cbzr0, 1f;
orrsr0, 0x810;
b9f;

1:movsr12, 256; timeout
0:blTestUnitReady; wait for device ready
cbzr0, 1f; ok
blRequestSense; keep in phase?
subsr12, 1; don't wait too long
bne0b;
orrsr0, 0x820;
b9f;

1:blGetCapacity; get size info
cbzr0, 9f; oops
orrsr0, 0x830;

9:pop{r4-r7,pc}; return

fe InitMS

&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;
;-----------------------------------------------------------------------!
; DevEnquiry!
;-----------------------------------------------------------------------!

fn DevEnquiry

push{lr}; save regs
movsr0, cmdEnquiry; setup
blUsbSetupMS;

movsr0, pidOut; send command wrapper 
movsr1, cbwSz;
movsr2, 0; use tBuff
blUsbBulkTD;
cbnzr0, 9f; oops

; for some devices, a delay here seems to be essential
; one device needs approx 800 ms
; It might also be reqd for the 1st SCSI operation.

movsr0, 0x380; delay for a bit, but why? !!!
blUsbDelay;

movsr0, pidIn; get payload
movsr1, 36; enquiry data size
movsr2, 0; use tBuff
blUsbBulkTD;
cbnzr0, 9f; oops

addsr0, r7, devEnq; stash details
addsr1, r7, tBuff;
movsr2, 36;
blblkcpy;

movsr2, 42; only reason for doing this
blUsbDump;

movsr0, pidIn; get status
movsr1, cswSz;
movsr2, 0; use tBuff
blUsbBulkTD;
cbnzr0, 9f; oops
ldrbr0, [r7, tBuff+12]; get status code (0 = ok)

9:pop{pc};

fe DevEnquiry

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers, Mike&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 16:43:45 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T16:43:45Z</dc:date>
    <item>
      <title>USB MSC Host Issues.</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/USB-MSC-Host-Issues/m-p/523320#M5956</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by MikeSimmonds on Thu Mar 26 06:04:17 MST 2015&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Hi forumites.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I am in the process of developing mass storage class host software on the LPC1778.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Of course, the UM bows out and refers me to the OHCI spec. [Note to NXP, a link to this in the UM would be nice in the next revision.]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Any way, I sourced this and ...&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I have completed the basic USB detatch/insert and enumeration pass with no worries.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When I find a USB stick with a suitable SCSI/Bulk Only Configuation, I move on to the MSC part of things.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I found some 2008 NXP CMSIS based source [CodeRed era?] to look at.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Their Init function&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; GetMaxLUN();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Get maximum logical unit number&amp;nbsp;&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; for (retry&amp;nbsp; = 80; retry--)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = TestUnitReady();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Test whether the unit is ready&amp;nbsp;&amp;nbsp;&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rc == OK)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetSenseInfo();&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Get sense information&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;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rc != OK)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PRINT_Err(rc);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(rc);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = ReadCapacity(numBlks, blkSize);/* Read capacity of the disk&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */
&amp;nbsp;&amp;nbsp;&amp;nbsp; BlkSize = *blkSize;// Set global
&amp;nbsp;&amp;nbsp;&amp;nbsp; rc = Inquire(inquiryResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp; return (rc);
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;My 'InitMS' function followed this scheme but omited 'GetLUN' because the any result was not available and never used.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Initially, I was getting hangs because the 1st TestUnitReady was returning continuous NAK's and the 'TDProcess' subroutine&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;was spinning on 'WDH Done' (as recognised by the USB interrupt).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;But for NAK returns, this never happens -- &lt;/SPAN&gt;&lt;I&gt;Is this a flaw in the OHCI design?&lt;/I&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;So I had some fun and games trying to set a time out that was long enough for a 'done' (OK/Non-NAK error) to be set.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Any way, I ended up (due to web postings) moving the Device Enquiry before the TestUnit ready.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Up to this point, I was testing with a single USB stick (in case I bricked it).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;When I stared testing on 8 other USB sticks that I had to hand, some anomalies arose.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;One would show flickering of the USB connect LED for about 17 seconds and thereafter enumerate and work fine.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;One would fail (with NAKS) if inserted into a running system, but succeded if I use the debugger to set the PC back to the enumeration (without removing the drive).&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;One simply refused to respond to Enquiry either way.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Anyway, I found a solution of sorts, but I dont understand why.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I added DeviceReset EP1, EP2 clear feature before the 1st Enquiry, but these all return STALL, So ignore them.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The first MSC call is Enquiry -- if I &lt;/SPAN&gt;&lt;I&gt;add a delay (and this is the stange part)&lt;/I&gt;&lt;SPAN&gt; between the CBW transaction and the data in phase&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;it all works on all devices and I can read the 1st sector at LBA 0. [No other SCSI commands have such a delay.]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If I don't use the delay, when things fail, absolutely everything just returns endless NAKs. Even with (10's of seconds timeouts).&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;However, for the worst case (of the devices that I have available) I need a delay of over 800 milliseconds for reliable operation.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;[Kingston DT101 G2, 16GB]&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Does anyone have any comments, observations, experience, or anecdotes regarding this.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;As I said, I think now that I can move forward and work on the file system code.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Code Snips&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;
;-----------------------------------------------------------------------!
; InitMS!
;-----------------------------------------------------------------------!

fn InitMS

push{r4-r7,lr}; save regs
ldrr5, =usbBase; get base register
movsr7, hostBase; and host base

ldrr1, =bulkReset; reset device
blUsbCtrlSend;
ldrr1, =clear1; clear endpoint 1
blUsbCtrlSend;
ldrr1, =clear2; clear endpoint 2
blUsbCtrlSend;

;;blMaxLUN; why -- no result, not used
blDevEnquiry; why -- result not used
cbzr0, 1f;
orrsr0, 0x810;
b9f;

1:movsr12, 256; timeout
0:blTestUnitReady; wait for device ready
cbzr0, 1f; ok
blRequestSense; keep in phase?
subsr12, 1; don't wait too long
bne0b;
orrsr0, 0x820;
b9f;

1:blGetCapacity; get size info
cbzr0, 9f; oops
orrsr0, 0x830;

9:pop{r4-r7,pc}; return

fe InitMS

&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;
;-----------------------------------------------------------------------!
; DevEnquiry!
;-----------------------------------------------------------------------!

fn DevEnquiry

push{lr}; save regs
movsr0, cmdEnquiry; setup
blUsbSetupMS;

movsr0, pidOut; send command wrapper 
movsr1, cbwSz;
movsr2, 0; use tBuff
blUsbBulkTD;
cbnzr0, 9f; oops

; for some devices, a delay here seems to be essential
; one device needs approx 800 ms
; It might also be reqd for the 1st SCSI operation.

movsr0, 0x380; delay for a bit, but why? !!!
blUsbDelay;

movsr0, pidIn; get payload
movsr1, 36; enquiry data size
movsr2, 0; use tBuff
blUsbBulkTD;
cbnzr0, 9f; oops

addsr0, r7, devEnq; stash details
addsr1, r7, tBuff;
movsr2, 36;
blblkcpy;

movsr2, 42; only reason for doing this
blUsbDump;

movsr0, pidIn; get status
movsr1, cswSz;
movsr2, 0; use tBuff
blUsbBulkTD;
cbnzr0, 9f; oops
ldrbr0, [r7, tBuff+12]; get status code (0 = ok)

9:pop{pc};

fe DevEnquiry

&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Cheers, Mike&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 16:43:45 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/USB-MSC-Host-Issues/m-p/523320#M5956</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T16:43:45Z</dc:date>
    </item>
  </channel>
</rss>

