disable unnecessary prints

Dependents:   PLAUCI_full

Committer:
legwinskij
Date:
Tue Jan 12 21:35:20 2016 +0000
Revision:
1:1538f5588c56
Parent:
0:e042bdf9c219
Changed delay before port reset, some USB flash disks takes longer to enumerate

Who changed what in which revision?

UserRevisionLine numberNew contents of line
legwinskij 0:e042bdf9c219 1 /*
legwinskij 0:e042bdf9c219 2 **************************************************************************************************************
legwinskij 0:e042bdf9c219 3 * NXP USB Host Stack
legwinskij 0:e042bdf9c219 4 *
legwinskij 0:e042bdf9c219 5 * (c) Copyright 2008, NXP SemiConductors
legwinskij 0:e042bdf9c219 6 * (c) Copyright 2008, OnChip Technologies LLC
legwinskij 0:e042bdf9c219 7 * All Rights Reserved
legwinskij 0:e042bdf9c219 8 *
legwinskij 0:e042bdf9c219 9 * www.nxp.com
legwinskij 0:e042bdf9c219 10 * www.onchiptech.com
legwinskij 0:e042bdf9c219 11 *
legwinskij 0:e042bdf9c219 12 * File : usbhost_ms.c
legwinskij 0:e042bdf9c219 13 * Programmer(s) : Ravikanth.P
legwinskij 0:e042bdf9c219 14 * Version :
legwinskij 0:e042bdf9c219 15 *
legwinskij 0:e042bdf9c219 16 **************************************************************************************************************
legwinskij 0:e042bdf9c219 17 */
legwinskij 0:e042bdf9c219 18
legwinskij 0:e042bdf9c219 19 /*
legwinskij 0:e042bdf9c219 20 **************************************************************************************************************
legwinskij 0:e042bdf9c219 21 * INCLUDE HEADER FILES
legwinskij 0:e042bdf9c219 22 **************************************************************************************************************
legwinskij 0:e042bdf9c219 23 */
legwinskij 0:e042bdf9c219 24
legwinskij 0:e042bdf9c219 25 #include "usbhost_ms.h"
legwinskij 0:e042bdf9c219 26
legwinskij 0:e042bdf9c219 27 /*
legwinskij 0:e042bdf9c219 28 **************************************************************************************************************
legwinskij 0:e042bdf9c219 29 * GLOBAL VARIABLES
legwinskij 0:e042bdf9c219 30 **************************************************************************************************************
legwinskij 0:e042bdf9c219 31 */
legwinskij 0:e042bdf9c219 32
legwinskij 0:e042bdf9c219 33 USB_INT32U MS_BlkSize;
legwinskij 0:e042bdf9c219 34
legwinskij 0:e042bdf9c219 35 /*
legwinskij 0:e042bdf9c219 36 **************************************************************************************************************
legwinskij 0:e042bdf9c219 37 * INITIALIZE MASS STORAGE INTERFACE
legwinskij 0:e042bdf9c219 38 *
legwinskij 0:e042bdf9c219 39 * Description: This function initializes the mass storage interface
legwinskij 0:e042bdf9c219 40 *
legwinskij 0:e042bdf9c219 41 * Arguments : None
legwinskij 0:e042bdf9c219 42 *
legwinskij 0:e042bdf9c219 43 * Returns : OK if Success
legwinskij 0:e042bdf9c219 44 * ERR_INVALID_BOOTSIG if Failed
legwinskij 0:e042bdf9c219 45 *
legwinskij 0:e042bdf9c219 46 **************************************************************************************************************
legwinskij 0:e042bdf9c219 47 */
legwinskij 0:e042bdf9c219 48
legwinskij 0:e042bdf9c219 49 USB_INT32S MS_Init (USB_INT32U *blkSize, USB_INT32U *numBlks, USB_INT08U *inquiryResult)
legwinskij 0:e042bdf9c219 50 {
legwinskij 0:e042bdf9c219 51 USB_INT08U retry;
legwinskij 0:e042bdf9c219 52 USB_INT32S rc;
legwinskij 0:e042bdf9c219 53
legwinskij 0:e042bdf9c219 54 MS_GetMaxLUN(); /* Get maximum logical unit number */
legwinskij 0:e042bdf9c219 55 retry = 80;
legwinskij 0:e042bdf9c219 56 while(retry) {
legwinskij 0:e042bdf9c219 57 rc = MS_TestUnitReady(); /* Test whether the unit is ready */
legwinskij 0:e042bdf9c219 58 if (rc == OK) {
legwinskij 0:e042bdf9c219 59 break;
legwinskij 0:e042bdf9c219 60 }
legwinskij 0:e042bdf9c219 61 MS_GetSenseInfo(); /* Get sense information */
legwinskij 0:e042bdf9c219 62 retry--;
legwinskij 0:e042bdf9c219 63 }
legwinskij 0:e042bdf9c219 64 if (rc != OK) {
legwinskij 0:e042bdf9c219 65 PRINT_Err(rc);
legwinskij 0:e042bdf9c219 66 return (rc);
legwinskij 0:e042bdf9c219 67 }
legwinskij 0:e042bdf9c219 68 rc = MS_ReadCapacity(numBlks, blkSize); /* Read capacity of the disk */
legwinskij 0:e042bdf9c219 69 MS_BlkSize = *blkSize; // Set global
legwinskij 0:e042bdf9c219 70 rc = MS_Inquire (inquiryResult);
legwinskij 0:e042bdf9c219 71 return (rc);
legwinskij 0:e042bdf9c219 72 }
legwinskij 0:e042bdf9c219 73 /*
legwinskij 0:e042bdf9c219 74 **************************************************************************************************************
legwinskij 0:e042bdf9c219 75 * PARSE THE CONFIGURATION
legwinskij 0:e042bdf9c219 76 *
legwinskij 0:e042bdf9c219 77 * Description: This function is used to parse the configuration
legwinskij 0:e042bdf9c219 78 *
legwinskij 0:e042bdf9c219 79 * Arguments : None
legwinskij 0:e042bdf9c219 80 *
legwinskij 0:e042bdf9c219 81 * Returns : OK if Success
legwinskij 0:e042bdf9c219 82 * ERR_INVALID_BOOTSIG if Failed
legwinskij 0:e042bdf9c219 83 *
legwinskij 0:e042bdf9c219 84 **************************************************************************************************************
legwinskij 0:e042bdf9c219 85 */
legwinskij 0:e042bdf9c219 86
legwinskij 0:e042bdf9c219 87 USB_INT32S MS_ParseConfiguration (void)
legwinskij 0:e042bdf9c219 88 {
legwinskij 0:e042bdf9c219 89 volatile USB_INT08U *desc_ptr;
legwinskij 0:e042bdf9c219 90 USB_INT08U ms_int_found;
legwinskij 0:e042bdf9c219 91
legwinskij 0:e042bdf9c219 92
legwinskij 0:e042bdf9c219 93 desc_ptr = TDBuffer;
legwinskij 0:e042bdf9c219 94 ms_int_found = 0;
legwinskij 0:e042bdf9c219 95
legwinskij 0:e042bdf9c219 96 if (desc_ptr[1] != USB_DESCRIPTOR_TYPE_CONFIGURATION) {
legwinskij 0:e042bdf9c219 97 return (ERR_BAD_CONFIGURATION);
legwinskij 0:e042bdf9c219 98 }
legwinskij 0:e042bdf9c219 99 desc_ptr += desc_ptr[0];
legwinskij 0:e042bdf9c219 100
legwinskij 0:e042bdf9c219 101 while (desc_ptr != TDBuffer + ReadLE16U(&TDBuffer[2])) {
legwinskij 0:e042bdf9c219 102
legwinskij 0:e042bdf9c219 103 switch (desc_ptr[1]) {
legwinskij 0:e042bdf9c219 104
legwinskij 0:e042bdf9c219 105 case USB_DESCRIPTOR_TYPE_INTERFACE: /* If it is an interface descriptor */
legwinskij 0:e042bdf9c219 106 if (desc_ptr[5] == MASS_STORAGE_CLASS && /* check if the class is mass storage */
legwinskij 0:e042bdf9c219 107 desc_ptr[6] == MASS_STORAGE_SUBCLASS_SCSI && /* check if the subclass is SCSI */
legwinskij 0:e042bdf9c219 108 desc_ptr[7] == MASS_STORAGE_PROTOCOL_BO) { /* check if the protocol is Bulk only */
legwinskij 0:e042bdf9c219 109 ms_int_found = 1;
legwinskij 0:e042bdf9c219 110 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
legwinskij 0:e042bdf9c219 111 }
legwinskij 0:e042bdf9c219 112 break;
legwinskij 0:e042bdf9c219 113
legwinskij 0:e042bdf9c219 114 case USB_DESCRIPTOR_TYPE_ENDPOINT: /* If it is an endpoint descriptor */
legwinskij 0:e042bdf9c219 115 if ((desc_ptr[3] & 0x03) == 0x02) { /* If it is Bulk endpoint */
legwinskij 0:e042bdf9c219 116 if (desc_ptr[2] & 0x80) { /* If it is In endpoint */
legwinskij 0:e042bdf9c219 117 EDBulkIn->Control = 1 | /* USB address */
legwinskij 0:e042bdf9c219 118 ((desc_ptr[2] & 0x7F) << 7) | /* Endpoint address */
legwinskij 0:e042bdf9c219 119 (2 << 11) | /* direction */
legwinskij 0:e042bdf9c219 120 (ReadLE16U(&desc_ptr[4]) << 16); /* MaxPkt Size */
legwinskij 0:e042bdf9c219 121 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
legwinskij 0:e042bdf9c219 122 } else { /* If it is Out endpoint */
legwinskij 0:e042bdf9c219 123 EDBulkOut->Control = 1 | /* USB address */
legwinskij 0:e042bdf9c219 124 ((desc_ptr[2] & 0x7F) << 7) | /* Endpoint address */
legwinskij 0:e042bdf9c219 125 (1 << 11) | /* direction */
legwinskij 0:e042bdf9c219 126 (ReadLE16U(&desc_ptr[4]) << 16); /* MaxPkt Size */
legwinskij 0:e042bdf9c219 127 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
legwinskij 0:e042bdf9c219 128 }
legwinskij 0:e042bdf9c219 129 } else { /* If it is not bulk end point */
legwinskij 0:e042bdf9c219 130 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
legwinskij 0:e042bdf9c219 131 }
legwinskij 0:e042bdf9c219 132 break;
legwinskij 0:e042bdf9c219 133
legwinskij 0:e042bdf9c219 134 default: /* If the descriptor is neither interface nor endpoint */
legwinskij 0:e042bdf9c219 135 desc_ptr += desc_ptr[0]; /* Move to next descriptor start */
legwinskij 0:e042bdf9c219 136 break;
legwinskij 0:e042bdf9c219 137 }
legwinskij 0:e042bdf9c219 138 }
legwinskij 0:e042bdf9c219 139 if (ms_int_found) {
legwinskij 0:e042bdf9c219 140 PRINT_Log("Mass Storage device connected\r\n");
legwinskij 0:e042bdf9c219 141 return (OK);
legwinskij 0:e042bdf9c219 142 } else {
legwinskij 0:e042bdf9c219 143 PRINT_Log("Not a Mass Storage device\r\n");
legwinskij 0:e042bdf9c219 144 return (ERR_NO_MS_INTERFACE);
legwinskij 0:e042bdf9c219 145 }
legwinskij 0:e042bdf9c219 146 }
legwinskij 0:e042bdf9c219 147
legwinskij 0:e042bdf9c219 148 /*
legwinskij 0:e042bdf9c219 149 **************************************************************************************************************
legwinskij 0:e042bdf9c219 150 * GET MAXIMUM LOGICAL UNIT
legwinskij 0:e042bdf9c219 151 *
legwinskij 0:e042bdf9c219 152 * Description: This function returns the maximum logical unit from the device
legwinskij 0:e042bdf9c219 153 *
legwinskij 0:e042bdf9c219 154 * Arguments : None
legwinskij 0:e042bdf9c219 155 *
legwinskij 0:e042bdf9c219 156 * Returns : OK if Success
legwinskij 0:e042bdf9c219 157 * ERR_INVALID_BOOTSIG if Failed
legwinskij 0:e042bdf9c219 158 *
legwinskij 0:e042bdf9c219 159 **************************************************************************************************************
legwinskij 0:e042bdf9c219 160 */
legwinskij 0:e042bdf9c219 161
legwinskij 0:e042bdf9c219 162 USB_INT32S MS_GetMaxLUN (void)
legwinskij 0:e042bdf9c219 163 {
legwinskij 0:e042bdf9c219 164 USB_INT32S rc;
legwinskij 0:e042bdf9c219 165
legwinskij 0:e042bdf9c219 166
legwinskij 0:e042bdf9c219 167 rc = Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE,
legwinskij 0:e042bdf9c219 168 MS_GET_MAX_LUN_REQ,
legwinskij 0:e042bdf9c219 169 0,
legwinskij 0:e042bdf9c219 170 0,
legwinskij 0:e042bdf9c219 171 1,
legwinskij 0:e042bdf9c219 172 TDBuffer);
legwinskij 0:e042bdf9c219 173 return (rc);
legwinskij 0:e042bdf9c219 174 }
legwinskij 0:e042bdf9c219 175
legwinskij 0:e042bdf9c219 176 /*
legwinskij 0:e042bdf9c219 177 **************************************************************************************************************
legwinskij 0:e042bdf9c219 178 * GET SENSE INFORMATION
legwinskij 0:e042bdf9c219 179 *
legwinskij 0:e042bdf9c219 180 * Description: This function is used to get sense information from the device
legwinskij 0:e042bdf9c219 181 *
legwinskij 0:e042bdf9c219 182 * Arguments : None
legwinskij 0:e042bdf9c219 183 *
legwinskij 0:e042bdf9c219 184 * Returns : OK if Success
legwinskij 0:e042bdf9c219 185 * ERROR if Failed
legwinskij 0:e042bdf9c219 186 *
legwinskij 0:e042bdf9c219 187 **************************************************************************************************************
legwinskij 0:e042bdf9c219 188 */
legwinskij 0:e042bdf9c219 189
legwinskij 0:e042bdf9c219 190 USB_INT32S MS_GetSenseInfo (void)
legwinskij 0:e042bdf9c219 191 {
legwinskij 0:e042bdf9c219 192 USB_INT32S rc;
legwinskij 0:e042bdf9c219 193
legwinskij 0:e042bdf9c219 194
legwinskij 0:e042bdf9c219 195 Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_REQUEST_SENSE, 6);
legwinskij 0:e042bdf9c219 196 rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
legwinskij 0:e042bdf9c219 197 if (rc == OK) {
legwinskij 0:e042bdf9c219 198 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 18);
legwinskij 0:e042bdf9c219 199 if (rc == OK) {
legwinskij 0:e042bdf9c219 200 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
legwinskij 0:e042bdf9c219 201 if (rc == OK) {
legwinskij 0:e042bdf9c219 202 if (TDBuffer[12] != 0) {
legwinskij 0:e042bdf9c219 203 rc = ERR_MS_CMD_FAILED;
legwinskij 0:e042bdf9c219 204 }
legwinskij 0:e042bdf9c219 205 }
legwinskij 0:e042bdf9c219 206 }
legwinskij 0:e042bdf9c219 207 }
legwinskij 0:e042bdf9c219 208 return (rc);
legwinskij 0:e042bdf9c219 209 }
legwinskij 0:e042bdf9c219 210
legwinskij 0:e042bdf9c219 211 /*
legwinskij 0:e042bdf9c219 212 **************************************************************************************************************
legwinskij 0:e042bdf9c219 213 * TEST UNIT READY
legwinskij 0:e042bdf9c219 214 *
legwinskij 0:e042bdf9c219 215 * Description: This function is used to test whether the unit is ready or not
legwinskij 0:e042bdf9c219 216 *
legwinskij 0:e042bdf9c219 217 * Arguments : None
legwinskij 0:e042bdf9c219 218 *
legwinskij 0:e042bdf9c219 219 * Returns : OK if Success
legwinskij 0:e042bdf9c219 220 * ERROR if Failed
legwinskij 0:e042bdf9c219 221 *
legwinskij 0:e042bdf9c219 222 **************************************************************************************************************
legwinskij 0:e042bdf9c219 223 */
legwinskij 0:e042bdf9c219 224
legwinskij 0:e042bdf9c219 225 USB_INT32S MS_TestUnitReady (void)
legwinskij 0:e042bdf9c219 226 {
legwinskij 0:e042bdf9c219 227 USB_INT32S rc;
legwinskij 0:e042bdf9c219 228
legwinskij 0:e042bdf9c219 229
legwinskij 0:e042bdf9c219 230 Fill_MSCommand(0, 0, 0, MS_DATA_DIR_NONE, SCSI_CMD_TEST_UNIT_READY, 6);
legwinskij 0:e042bdf9c219 231 rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
legwinskij 0:e042bdf9c219 232 if (rc == OK) {
legwinskij 0:e042bdf9c219 233 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
legwinskij 0:e042bdf9c219 234 if (rc == OK) {
legwinskij 0:e042bdf9c219 235 if (TDBuffer[12] != 0) {
legwinskij 0:e042bdf9c219 236 rc = ERR_MS_CMD_FAILED;
legwinskij 0:e042bdf9c219 237 }
legwinskij 0:e042bdf9c219 238 }
legwinskij 0:e042bdf9c219 239 }
legwinskij 0:e042bdf9c219 240 return (rc);
legwinskij 0:e042bdf9c219 241 }
legwinskij 0:e042bdf9c219 242
legwinskij 0:e042bdf9c219 243 /*
legwinskij 0:e042bdf9c219 244 **************************************************************************************************************
legwinskij 0:e042bdf9c219 245 * READ CAPACITY
legwinskij 0:e042bdf9c219 246 *
legwinskij 0:e042bdf9c219 247 * Description: This function is used to read the capacity of the mass storage device
legwinskij 0:e042bdf9c219 248 *
legwinskij 0:e042bdf9c219 249 * Arguments : None
legwinskij 0:e042bdf9c219 250 *
legwinskij 0:e042bdf9c219 251 * Returns : OK if Success
legwinskij 0:e042bdf9c219 252 * ERROR if Failed
legwinskij 0:e042bdf9c219 253 *
legwinskij 0:e042bdf9c219 254 **************************************************************************************************************
legwinskij 0:e042bdf9c219 255 */
legwinskij 0:e042bdf9c219 256
legwinskij 0:e042bdf9c219 257 USB_INT32S MS_ReadCapacity (USB_INT32U *numBlks, USB_INT32U *blkSize)
legwinskij 0:e042bdf9c219 258 {
legwinskij 0:e042bdf9c219 259 USB_INT32S rc;
legwinskij 0:e042bdf9c219 260
legwinskij 0:e042bdf9c219 261
legwinskij 0:e042bdf9c219 262 Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_READ_CAPACITY, 10);
legwinskij 0:e042bdf9c219 263 rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
legwinskij 0:e042bdf9c219 264 if (rc == OK) {
legwinskij 0:e042bdf9c219 265 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, 8);
legwinskij 0:e042bdf9c219 266 if (rc == OK) {
legwinskij 0:e042bdf9c219 267 if (numBlks)
legwinskij 0:e042bdf9c219 268 *numBlks = ReadBE32U(&TDBuffer[0]);
legwinskij 0:e042bdf9c219 269 if (blkSize)
legwinskij 0:e042bdf9c219 270 *blkSize = ReadBE32U(&TDBuffer[4]);
legwinskij 0:e042bdf9c219 271 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
legwinskij 0:e042bdf9c219 272 if (rc == OK) {
legwinskij 0:e042bdf9c219 273 if (TDBuffer[12] != 0) {
legwinskij 0:e042bdf9c219 274 rc = ERR_MS_CMD_FAILED;
legwinskij 0:e042bdf9c219 275 }
legwinskij 0:e042bdf9c219 276 }
legwinskij 0:e042bdf9c219 277 }
legwinskij 0:e042bdf9c219 278 }
legwinskij 0:e042bdf9c219 279 return (rc);
legwinskij 0:e042bdf9c219 280 }
legwinskij 0:e042bdf9c219 281
legwinskij 0:e042bdf9c219 282
legwinskij 0:e042bdf9c219 283
legwinskij 0:e042bdf9c219 284 USB_INT32S MS_Inquire (USB_INT08U *response)
legwinskij 0:e042bdf9c219 285 {
legwinskij 0:e042bdf9c219 286 USB_INT32S rc;
legwinskij 0:e042bdf9c219 287 USB_INT32U i;
legwinskij 0:e042bdf9c219 288
legwinskij 0:e042bdf9c219 289 Fill_MSCommand(0, 0, 0, MS_DATA_DIR_IN, SCSI_CMD_INQUIRY, 6);
legwinskij 0:e042bdf9c219 290 rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
legwinskij 0:e042bdf9c219 291 if (rc == OK) {
legwinskij 0:e042bdf9c219 292 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, INQUIRY_LENGTH);
legwinskij 0:e042bdf9c219 293 if (rc == OK) {
legwinskij 0:e042bdf9c219 294 if (response) {
legwinskij 0:e042bdf9c219 295 for ( i = 0; i < INQUIRY_LENGTH; i++ )
legwinskij 0:e042bdf9c219 296 *response++ = *TDBuffer++;
legwinskij 0:e042bdf9c219 297 #if 0
legwinskij 0:e042bdf9c219 298 MemCpy (response, TDBuffer, INQUIRY_LENGTH);
legwinskij 0:e042bdf9c219 299 StrNullTrailingSpace (response->vendorID, SCSI_INQUIRY_VENDORCHARS);
legwinskij 0:e042bdf9c219 300 StrNullTrailingSpace (response->productID, SCSI_INQUIRY_PRODUCTCHARS);
legwinskij 0:e042bdf9c219 301 StrNullTrailingSpace (response->productRev, SCSI_INQUIRY_REVCHARS);
legwinskij 0:e042bdf9c219 302 #endif
legwinskij 0:e042bdf9c219 303 }
legwinskij 0:e042bdf9c219 304 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
legwinskij 0:e042bdf9c219 305 if (rc == OK) {
legwinskij 0:e042bdf9c219 306 if (TDBuffer[12] != 0) { // bCSWStatus byte
legwinskij 0:e042bdf9c219 307 rc = ERR_MS_CMD_FAILED;
legwinskij 0:e042bdf9c219 308 }
legwinskij 0:e042bdf9c219 309 }
legwinskij 0:e042bdf9c219 310 }
legwinskij 0:e042bdf9c219 311 }
legwinskij 0:e042bdf9c219 312 return (rc);
legwinskij 0:e042bdf9c219 313 }
legwinskij 0:e042bdf9c219 314
legwinskij 0:e042bdf9c219 315 /*
legwinskij 0:e042bdf9c219 316 **************************************************************************************************************
legwinskij 0:e042bdf9c219 317 * RECEIVE THE BULK DATA
legwinskij 0:e042bdf9c219 318 *
legwinskij 0:e042bdf9c219 319 * Description: This function is used to receive the bulk data
legwinskij 0:e042bdf9c219 320 *
legwinskij 0:e042bdf9c219 321 * Arguments : None
legwinskij 0:e042bdf9c219 322 *
legwinskij 0:e042bdf9c219 323 * Returns : OK if Success
legwinskij 0:e042bdf9c219 324 * ERR_INVALID_BOOTSIG if Failed
legwinskij 0:e042bdf9c219 325 *
legwinskij 0:e042bdf9c219 326 **************************************************************************************************************
legwinskij 0:e042bdf9c219 327 */
legwinskij 0:e042bdf9c219 328
legwinskij 0:e042bdf9c219 329 USB_INT32S MS_BulkRecv ( USB_INT32U block_number,
legwinskij 0:e042bdf9c219 330 USB_INT16U num_blocks,
legwinskij 0:e042bdf9c219 331 volatile USB_INT08U *user_buffer)
legwinskij 0:e042bdf9c219 332 {
legwinskij 0:e042bdf9c219 333 USB_INT32S rc;
legwinskij 0:e042bdf9c219 334 int i;
legwinskij 0:e042bdf9c219 335 volatile USB_INT08U *c = user_buffer;
legwinskij 0:e042bdf9c219 336 for (i=0;i<MS_BlkSize*num_blocks;i++)
legwinskij 0:e042bdf9c219 337 *c++ = 0;
legwinskij 0:e042bdf9c219 338
legwinskij 0:e042bdf9c219 339
legwinskij 0:e042bdf9c219 340 Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_IN, SCSI_CMD_READ_10, 10);
legwinskij 0:e042bdf9c219 341
legwinskij 0:e042bdf9c219 342 rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
legwinskij 0:e042bdf9c219 343 if (rc == OK) {
legwinskij 0:e042bdf9c219 344 rc = Host_ProcessTD(EDBulkIn, TD_IN, user_buffer, MS_BlkSize * num_blocks);
legwinskij 0:e042bdf9c219 345 if (rc == OK) {
legwinskij 0:e042bdf9c219 346 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
legwinskij 0:e042bdf9c219 347 if (rc == OK) {
legwinskij 0:e042bdf9c219 348 if (TDBuffer[12] != 0) {
legwinskij 0:e042bdf9c219 349 rc = ERR_MS_CMD_FAILED;
legwinskij 0:e042bdf9c219 350 }
legwinskij 0:e042bdf9c219 351 }
legwinskij 0:e042bdf9c219 352 }
legwinskij 0:e042bdf9c219 353 }
legwinskij 0:e042bdf9c219 354 return (rc);
legwinskij 0:e042bdf9c219 355 }
legwinskij 0:e042bdf9c219 356
legwinskij 0:e042bdf9c219 357 /*
legwinskij 0:e042bdf9c219 358 **************************************************************************************************************
legwinskij 0:e042bdf9c219 359 * SEND BULK DATA
legwinskij 0:e042bdf9c219 360 *
legwinskij 0:e042bdf9c219 361 * Description: This function is used to send the bulk data
legwinskij 0:e042bdf9c219 362 *
legwinskij 0:e042bdf9c219 363 * Arguments : None
legwinskij 0:e042bdf9c219 364 *
legwinskij 0:e042bdf9c219 365 * Returns : OK if Success
legwinskij 0:e042bdf9c219 366 * ERR_INVALID_BOOTSIG if Failed
legwinskij 0:e042bdf9c219 367 *
legwinskij 0:e042bdf9c219 368 **************************************************************************************************************
legwinskij 0:e042bdf9c219 369 */
legwinskij 0:e042bdf9c219 370
legwinskij 0:e042bdf9c219 371 USB_INT32S MS_BulkSend ( USB_INT32U block_number,
legwinskij 0:e042bdf9c219 372 USB_INT16U num_blocks,
legwinskij 0:e042bdf9c219 373 volatile USB_INT08U *user_buffer)
legwinskij 0:e042bdf9c219 374 {
legwinskij 0:e042bdf9c219 375 USB_INT32S rc;
legwinskij 0:e042bdf9c219 376
legwinskij 0:e042bdf9c219 377
legwinskij 0:e042bdf9c219 378 Fill_MSCommand(block_number, MS_BlkSize, num_blocks, MS_DATA_DIR_OUT, SCSI_CMD_WRITE_10, 10);
legwinskij 0:e042bdf9c219 379
legwinskij 0:e042bdf9c219 380 rc = Host_ProcessTD(EDBulkOut, TD_OUT, TDBuffer, CBW_SIZE);
legwinskij 0:e042bdf9c219 381 if (rc == OK) {
legwinskij 0:e042bdf9c219 382 rc = Host_ProcessTD(EDBulkOut, TD_OUT, user_buffer, MS_BlkSize * num_blocks);
legwinskij 0:e042bdf9c219 383 if (rc == OK) {
legwinskij 0:e042bdf9c219 384 rc = Host_ProcessTD(EDBulkIn, TD_IN, TDBuffer, CSW_SIZE);
legwinskij 0:e042bdf9c219 385 if (rc == OK) {
legwinskij 0:e042bdf9c219 386 if (TDBuffer[12] != 0) {
legwinskij 0:e042bdf9c219 387 rc = ERR_MS_CMD_FAILED;
legwinskij 0:e042bdf9c219 388 }
legwinskij 0:e042bdf9c219 389 }
legwinskij 0:e042bdf9c219 390 }
legwinskij 0:e042bdf9c219 391 }
legwinskij 0:e042bdf9c219 392 return (rc);
legwinskij 0:e042bdf9c219 393 }
legwinskij 0:e042bdf9c219 394
legwinskij 0:e042bdf9c219 395 /*
legwinskij 0:e042bdf9c219 396 **************************************************************************************************************
legwinskij 0:e042bdf9c219 397 * FILL MASS STORAGE COMMAND
legwinskij 0:e042bdf9c219 398 *
legwinskij 0:e042bdf9c219 399 * Description: This function is used to fill the mass storage command
legwinskij 0:e042bdf9c219 400 *
legwinskij 0:e042bdf9c219 401 * Arguments : None
legwinskij 0:e042bdf9c219 402 *
legwinskij 0:e042bdf9c219 403 * Returns : OK if Success
legwinskij 0:e042bdf9c219 404 * ERR_INVALID_BOOTSIG if Failed
legwinskij 0:e042bdf9c219 405 *
legwinskij 0:e042bdf9c219 406 **************************************************************************************************************
legwinskij 0:e042bdf9c219 407 */
legwinskij 0:e042bdf9c219 408
legwinskij 0:e042bdf9c219 409 void Fill_MSCommand (USB_INT32U block_number,
legwinskij 0:e042bdf9c219 410 USB_INT32U block_size,
legwinskij 0:e042bdf9c219 411 USB_INT16U num_blocks,
legwinskij 0:e042bdf9c219 412 MS_DATA_DIR direction,
legwinskij 0:e042bdf9c219 413 USB_INT08U scsi_cmd,
legwinskij 0:e042bdf9c219 414 USB_INT08U scsi_cmd_len)
legwinskij 0:e042bdf9c219 415 {
legwinskij 0:e042bdf9c219 416 USB_INT32U data_len;
legwinskij 0:e042bdf9c219 417 static USB_INT32U tag_cnt = 0;
legwinskij 0:e042bdf9c219 418 USB_INT32U cnt;
legwinskij 0:e042bdf9c219 419
legwinskij 0:e042bdf9c219 420
legwinskij 0:e042bdf9c219 421 for (cnt = 0; cnt < CBW_SIZE; cnt++) {
legwinskij 0:e042bdf9c219 422 TDBuffer[cnt] = 0;
legwinskij 0:e042bdf9c219 423 }
legwinskij 0:e042bdf9c219 424 switch(scsi_cmd) {
legwinskij 0:e042bdf9c219 425
legwinskij 0:e042bdf9c219 426 case SCSI_CMD_TEST_UNIT_READY:
legwinskij 0:e042bdf9c219 427 data_len = 0;
legwinskij 0:e042bdf9c219 428 break;
legwinskij 0:e042bdf9c219 429 case SCSI_CMD_READ_CAPACITY:
legwinskij 0:e042bdf9c219 430 data_len = 8;
legwinskij 0:e042bdf9c219 431 break;
legwinskij 0:e042bdf9c219 432 case SCSI_CMD_REQUEST_SENSE:
legwinskij 0:e042bdf9c219 433 data_len = 18;
legwinskij 0:e042bdf9c219 434 break;
legwinskij 0:e042bdf9c219 435 case SCSI_CMD_INQUIRY:
legwinskij 0:e042bdf9c219 436 data_len = 36;
legwinskij 0:e042bdf9c219 437 break;
legwinskij 0:e042bdf9c219 438 default:
legwinskij 0:e042bdf9c219 439 data_len = block_size * num_blocks;
legwinskij 0:e042bdf9c219 440 break;
legwinskij 0:e042bdf9c219 441 }
legwinskij 0:e042bdf9c219 442 WriteLE32U(TDBuffer, CBW_SIGNATURE);
legwinskij 0:e042bdf9c219 443 WriteLE32U(&TDBuffer[4], tag_cnt);
legwinskij 0:e042bdf9c219 444 WriteLE32U(&TDBuffer[8], data_len);
legwinskij 0:e042bdf9c219 445 TDBuffer[12] = (direction == MS_DATA_DIR_NONE) ? 0 : direction;
legwinskij 0:e042bdf9c219 446 TDBuffer[14] = scsi_cmd_len; /* Length of the CBW */
legwinskij 0:e042bdf9c219 447 TDBuffer[15] = scsi_cmd;
legwinskij 0:e042bdf9c219 448 if ((scsi_cmd == SCSI_CMD_REQUEST_SENSE)
legwinskij 0:e042bdf9c219 449 || (scsi_cmd == SCSI_CMD_INQUIRY)) {
legwinskij 0:e042bdf9c219 450 TDBuffer[19] = (USB_INT08U)data_len;
legwinskij 0:e042bdf9c219 451 } else {
legwinskij 0:e042bdf9c219 452 WriteBE32U(&TDBuffer[17], block_number);
legwinskij 0:e042bdf9c219 453 }
legwinskij 0:e042bdf9c219 454 WriteBE16U(&TDBuffer[22], num_blocks);
legwinskij 0:e042bdf9c219 455 }