SD

Dependents:   Andar_Linha_Reta_Robo_Claw_v1

Fork of MSCFileSystem by Chris Styles

Committer:
carlos_nascimento08
Date:
Sun Sep 16 15:00:33 2012 +0000
Revision:
5:59daf2b48180
Parent:
4:dcc326e4d358
USB;

Who changed what in which revision?

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