Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Sun Jul 21 11:08:38 2013 +0000
Branch:
Metric
Revision:
125:f58b7ab2abee
Parent:
109:3e6f0e8fca0d
Re-centered efficiency screen

Who changed what in which revision?

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