Esta versión v6 pasa a ser el nuevo master. Funciona correctamente

Dependencies:   ADXL345 Display1602 MSCFileSystem SDFileSystem mbed FATFileSystem

Committer:
JuanManuelAmador
Date:
Fri Jun 06 08:52:28 2014 +0000
Revision:
2:cc4a43d806e2
Parent:
0:a5367bd4e404
Correci?n del baudrate de 112500 a 115200

Who changed what in which revision?

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