Samir Bouaziz / FileSystem_POPS

Dependencies:   FatFileSystemCpp USBHostLite

Dependents:   m3PI_TP_POPS_II2015v0 m3PI_TP_POPS_II2015v0 ourproject m3PI_TP_SETI ... more

Committer:
WiredHome
Date:
Thu Oct 10 23:56:41 2013 +0000
Revision:
0:7304356c0790
File System interface for USB.

Who changed what in which revision?

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