Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #include "MSP430.h"
00084 #include "..\Common\types.h"
00085 #include "..\USB_Common\defMSP430USB.h"
00086 #include "..\USB_Common\descriptors.h"
00087 #include "..\USB_Common\usb.h"
00088 # ifdef _CDC_
00089 #include "..\USB_CDC_API\UsbCdc.h"
00090 #endif
00091
00092 #include "UsbIsr.h"
00093 #include <string.h>
00094
00095
00096
00097
00098 extern BYTE bFunctionSuspended;
00099
00100 extern __no_init tEDB0 __data16 tEndPoint0DescriptorBlock;
00101 extern __no_init tEDB __data16 tInputEndPointDescriptorBlock[];
00102 extern __no_init tEDB __data16 tOutputEndPointDescriptorBlock[];
00103
00104 extern volatile BYTE bHostAsksUSBData;
00105 extern volatile BYTE bTransferInProgress;
00106 extern volatile BYTE bSecondUartTxDataCounter[];
00107 extern volatile PBYTE pbSecondUartTxData;
00108
00109 extern BYTE bStatusAction;
00110 extern WORD wUsbEventMask;
00111
00112 BOOL CdcToHostFromBuffer();
00113 BOOL CdcToBufferFromHost();
00114 BOOL CdcIsReceiveInProgress();
00115
00116 BOOL HidToHostFromBuffer();
00117 BOOL HidToBufferFromHost();
00118 BOOL HidIsReceiveInProgress();
00119
00120 extern unsigned char TEST;
00121
00122
00123
00124
00125 #pragma vector=USB_UBM_VECTOR
00126 __interrupt VOID iUsbInterruptHandler(VOID)
00127 {
00128 BYTE bWakeUp = FALSE;
00129
00130
00131
00132
00133 if (USBIFG & SETUPIFG)
00134 {
00135 bWakeUp = SetupPacketInterruptHandler();
00136 USBIFG &= ~SETUPIFG;
00137 }
00138
00139 switch (__even_in_range(USBVECINT & 0x3f, USBVECINT_OUTPUT_ENDPOINT7))
00140 {
00141 case USBVECINT_NONE:
00142 break;
00143 case USBVECINT_PWR_DROP:
00144 __no_operation();
00145 break;
00146 case USBVECINT_PLL_LOCK:
00147 break;
00148 case USBVECINT_PLL_SIGNAL:
00149 break;
00150 case USBVECINT_PLL_RANGE:
00151 if (wUsbEventMask & kUSB_clockFaultEvent)
00152 {
00153 bWakeUp = USB_handleClockEvent();
00154 }
00155 break;
00156 case USBVECINT_PWR_VBUSOn:
00157 PWRVBUSonHandler();
00158 if (wUsbEventMask & kUSB_VbusOnEvent)
00159 {
00160 bWakeUp = USB_handleVbusOnEvent();
00161 }
00162 break;
00163 case USBVECINT_PWR_VBUSOff:
00164 PWRVBUSoffHandler();
00165 if (wUsbEventMask & kUSB_VbusOffEvent)
00166 {
00167 bWakeUp = USB_handleVbusOffEvent();
00168 }
00169 break;
00170 case USBVECINT_USB_TIMESTAMP:
00171 break;
00172 case USBVECINT_INPUT_ENDPOINT0:
00173 IEP0InterruptHandler();
00174 break;
00175 case USBVECINT_OUTPUT_ENDPOINT0:
00176 OEP0InterruptHandler();
00177 break;
00178 case USBVECINT_RSTR:
00179 USB_reset();
00180 if (wUsbEventMask & kUSB_UsbResetEvent)
00181 {
00182 bWakeUp = USB_handleResetEvent();
00183 }
00184 break;
00185 case USBVECINT_SUSR:
00186 USB_suspend();
00187 if (wUsbEventMask & kUSB_UsbSuspendEvent)
00188 {
00189 bWakeUp = USB_handleSuspendEvent();
00190 }
00191 break;
00192 case USBVECINT_RESR:
00193 USB_resume();
00194 if (wUsbEventMask & kUSB_UsbResumeEvent)
00195 {
00196 bWakeUp = USB_handleResumeEvent();
00197 }
00198
00199 bWakeUp = TRUE;
00200
00201 break;
00202 case USBVECINT_SETUP_PACKET_RECEIVED:
00203 bWakeUp = SetupPacketInterruptHandler();
00204 break;
00205
00206 case USBVECINT_STPOW_PACKET_RECEIVED:
00207 break;
00208
00209 case USBVECINT_INPUT_ENDPOINT1:
00210
00211 break;
00212
00213 case USBVECINT_INPUT_ENDPOINT2:
00214 break;
00215
00216 case USBVECINT_INPUT_ENDPOINT3:
00217 #ifdef _CDC_
00218
00219 bWakeUp = CdcToHostFromBuffer();
00220 #endif
00221 break;
00222
00223 case USBVECINT_INPUT_ENDPOINT4:
00224 break;
00225 case USBVECINT_INPUT_ENDPOINT5:
00226 break;
00227 case USBVECINT_INPUT_ENDPOINT6:
00228 break;
00229 case USBVECINT_INPUT_ENDPOINT7:
00230 break;
00231
00232 case USBVECINT_OUTPUT_ENDPOINT1:
00233
00234 break;
00235
00236 case USBVECINT_OUTPUT_ENDPOINT2:
00237 break;
00238
00239 case USBVECINT_OUTPUT_ENDPOINT3:
00240 #ifdef _CDC_
00241
00242 if (!CdcIsReceiveInProgress())
00243 {
00244 if (wUsbEventMask & kUSB_dataReceivedEvent)
00245 {
00246 bWakeUp = USBCDC_handleDataReceived(1);
00247 }
00248 }
00249 else
00250 {
00251
00252 bWakeUp = CdcToBufferFromHost();
00253 }
00254 TEST++;
00255 #endif
00256 break;
00257
00258 case USBVECINT_OUTPUT_ENDPOINT4:
00259 break;
00260 case USBVECINT_OUTPUT_ENDPOINT5:
00261 break;
00262 case USBVECINT_OUTPUT_ENDPOINT6:
00263 break;
00264 case USBVECINT_OUTPUT_ENDPOINT7:
00265 break;
00266 default:
00267 break;
00268 }
00269
00270 if (bWakeUp)
00271 {
00272 __bic_SR_register_on_exit(LPM3_bits);
00273 }
00274 }
00275
00276
00277
00278
00279
00280 BYTE SetupPacketInterruptHandler(VOID)
00281 {
00282 BYTE bTemp;
00283 BYTE bWakeUp = FALSE;
00284
00285 USBCTL |= FRSTE;
00286
00287 usbProcessNewSetupPacket:
00288
00289
00290 if((tSetupPacket.bmRequestType & USB_REQ_TYPE_INPUT) == USB_REQ_TYPE_INPUT)
00291 {
00292 USBCTL |= DIR;
00293 }
00294 else
00295 {
00296 USBCTL &= ~DIR;
00297 }
00298
00299 bStatusAction = STATUS_ACTION_NOTHING;
00300
00301
00302 for(bTemp=0; bTemp<USB_RETURN_DATA_LENGTH; bTemp++)
00303 {
00304 abUsbRequestReturnData[bTemp] = 0x00;
00305 }
00306
00307
00308 bWakeUp = usbDecodeAndProcessUsbRequest();
00309
00310
00311
00312 if((USBIFG & STPOWIFG) != 0x00)
00313 {
00314 USBIFG &= ~(STPOWIFG | SETUPIFG);
00315 goto usbProcessNewSetupPacket;
00316 }
00317 return bWakeUp;
00318 }
00319
00320
00321 VOID PWRVBUSoffHandler(VOID)
00322 {
00323 volatile unsigned int i;
00324 for (i =0; i < 1000; i++);
00325 if (!(USBPWRCTL & USBBGVBV))
00326 {
00327 USBKEYPID = 0x9628;
00328 bEnumerationStatus = 0x00;
00329 bFunctionSuspended = FALSE;
00330 USBCNF = 0;
00331 USBPLLCTL &= ~UPLLEN;
00332 USBPWRCTL &= ~(VBOFFIE + VBOFFIFG);
00333 USBKEYPID = 0x9600;
00334 }
00335 }
00336
00337
00338
00339 VOID PWRVBUSonHandler(VOID)
00340 {
00341 volatile unsigned int i;
00342 for (i =0; i < 1000; i++);
00343
00344 USBKEYPID = 0x9628;
00345 USBPWRCTL |= VBOFFIE;
00346 USBPWRCTL &= ~ (VBONIFG + VBOFFIFG);
00347 USBKEYPID = 0x9600;
00348 }
00349
00350
00351 VOID IEP0InterruptHandler(VOID)
00352 {
00353 USBCTL |= FRSTE;
00354 tEndPoint0DescriptorBlock.bOEPBCNT = 0x00;
00355
00356 if(bStatusAction == STATUS_ACTION_DATA_IN)
00357 {
00358 usbSendNextPacketOnIEP0();
00359 }
00360 else
00361 {
00362 tEndPoint0DescriptorBlock.bIEPCNFG |= EPCNF_STALL;
00363 }
00364 }
00365
00366
00367 VOID OEP0InterruptHandler(VOID)
00368 {
00369 USBCTL |= FRSTE;
00370 tEndPoint0DescriptorBlock.bIEPBCNT = 0x00;
00371
00372 if(bStatusAction == STATUS_ACTION_DATA_OUT)
00373 {
00374 usbReceiveNextPacketOnOEP0();
00375 if(bStatusAction == STATUS_ACTION_NOTHING)
00376 {
00377 switch(tSetupPacket.bRequest)
00378 {
00379 #ifdef _CDC_
00380 case USB_CDC_SET_LINE_CODING:
00381 Handler_SetLineCoding();
00382 break;
00383 #endif // _CDC_
00384 default:;
00385 }
00386 }
00387 }
00388 else
00389 {
00390 tEndPoint0DescriptorBlock.bOEPCNFG |= EPCNF_STALL;
00391 }
00392 }
00393
00394
00395
00396
00397