Compact Flash I/O test

Dependencies:   mbed

Committer:
emh203
Date:
Fri Dec 30 21:02:16 2011 +0000
Revision:
1:dc171f34db9b

        

Who changed what in which revision?

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