j

Dependencies:   General C12832 FatFileSystemCpp mbed

Fork of 1TestDECAWAVE_plus_others by U of Calegary - Okeef

Committer:
Kekehoho
Date:
Fri Aug 19 17:38:43 2016 +0000
Revision:
2:e28f4414ca2c
Parent:
1:4523d7cda75e
k

Who changed what in which revision?

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