test1

Dependencies:   mbed HTTPServer EthernetNetIf FatFileSystemCpp

Committer:
solarca2
Date:
Wed Sep 02 05:58:09 2020 +0000
Revision:
0:0ca3ad47fc8e
test1
;

Who changed what in which revision?

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