20200823_Motacon2020_ver5_kikkawa

Dependencies:   mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200821_motacon_ver4

Committer:
MPPT51
Date:
Fri Aug 21 08:30:26 2020 +0000
Revision:
1:47c28ece54ea
Parent:
0:3e0c71851fee
20200821_motacon_ver4

Who changed what in which revision?

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