Wireless Gas Meter Reading System Data Logger

Dependencies:   mbed

Committer:
harrisjunaid
Date:
Tue Apr 17 15:54:02 2012 +0000
Revision:
0:a67cda7c126f

        

Who changed what in which revision?

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