Versión de Firmware con funciones de RAM incorporadas.

Dependencies:   mbed

Fork of VmRecorderV1dot1 by virtualmech

Committer:
JuanManuelAmador
Date:
Tue Jul 14 08:34:11 2015 +0000
Revision:
2:e818c80e6d5c
Parent:
0:3d456b8ce449
Funciones de memoria RAM introducidas.

Who changed what in which revision?

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