Patrik GONDA / Mbed 2 deprecated micromag3

Dependencies:   mbed

Committer:
shredder
Date:
Wed Jun 23 18:51:42 2010 +0000
Revision:
0:e79a950111c9

        

Who changed what in which revision?

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