?? usbhw.lst
字號:
297 /*
298 * Set Stall for USB Endpoint
299 * Parameters: EPNum: Endpoint Number
300 * EPNum.0..3: Address
301 * EPNum.7: Dir
302 * Return Value: None
303 */
304
305 void USB_SetStallEP (DWORD EPNum) {
306 1 pUDP->UDP_CSR[EPNum & 0x0F] |= AT91C_UDP_FORCESTALL;
307 1 }
308
309
310 /*
311 * Clear Stall for USB Endpoint
312 * Parameters: EPNum: Endpoint Number
313 * EPNum.0..3: Address
314 * EPNum.7: Dir
315 * Return Value: None
316 */
317
318 void USB_ClrStallEP (DWORD EPNum) {
319 1 pUDP->UDP_CSR[EPNum & 0x0F] &= ~AT91C_UDP_FORCESTALL;
320 1 }
321 /*
322 * Read USB Endpoint Data
323 * Parameters: EPNum: Endpoint Number
ARM COMPILER V2.53, usbhw 02/11/07 08:22:50 PAGE 6
324 * EPNum.0..3: Address
325 * EPNum.7: Dir
326 * pData: Pointer to Data Buffer
327 * Return Value: Number of bytes read
328 */
329
330 DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
331 1 DWORD cnt, n;
332 1
333 1 EPNum &= 0x0F;
334 1 cnt = (pUDP->UDP_CSR[EPNum] >> 16) & 0x07FF;
335 1 for (n = 0; n < cnt; n++) {
336 2 *pData++ = (BYTE)pUDP->UDP_FDR[EPNum];
337 2 }
338 1 return (cnt);
339 1 }
340
341
342 /*
343 * Write USB Endpoint Data
344 * Parameters: EPNum: Endpoint Number
345 * EPNum.0..3: Address
346 * EPNum.7: Dir
347 * pData: Pointer to Data Buffer
348 * cnt: Number of bytes to write
349 * Return Value: Number of bytes written
350 */
351
352 DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
353 1 DWORD n;
354 1
355 1 EPNum &= 0x0F;
356 1 if (pUDP->UDP_CSR[EPNum] & AT91C_UDP_TXPKTRDY) {
357 2 if ((DualBankEP & (1 << EPNum)) && (TxDataBank[EPNum] == 0)) {
358 3 TxDataBank[EPNum] = 1;
359 3 } else {
360 3 return (0);
361 3 }
362 2 }
363 1 for (n = 0; n < cnt; n++) {
364 2 pUDP->UDP_FDR[EPNum] = *pData++;
365 2 }
366 1 pUDP->UDP_CSR[EPNum] |= AT91C_UDP_TXPKTRDY;
367 1
368 1 return (cnt);
369 1 }
370
371
372 /*
373 * Get USB Last Frame Number
374 * Parameters: None
375 * Return Value: Frame Number
376 */
377
378 DWORD USB_GetFrame (void) {
379 1 DWORD val;
380 1 while ((pUDP->UDP_NUM & (AT91C_UDP_FRM_OK | AT91C_UDP_FRM_ERR)) == 0);
381 1 if (pUDP->UDP_NUM & AT91C_UDP_FRM_OK) {
382 2 val = pUDP->UDP_NUM & AT91C_UDP_FRM_NUM;
383 2 } else {
384 2 val = 0xFFFFFFFF;
385 2 }
386 1 return (val);
387 1 }
388 /*
389 * USB Interrupt Service Routine
ARM COMPILER V2.53, usbhw 02/11/07 08:22:50 PAGE 7
390 */
391
392 void USB_ISR (void) __irq {
393 1 DWORD isr, csr, bkm, n;
394 1
395 1 while (isr = pUDP->UDP_ISR) {
396 2
397 2 /* End of Bus Reset Interrupt */
398 2 if (isr & AT91C_UDP_ENDBUSRES) {
399 3 USB_Reset();
400 3 #if USB_RESET_EVENT
401 3 USB_Reset_Event();
402 3 #endif
403 3 pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
404 3 }
405 2
406 2 /* USB Suspend Interrupt */
407 2 if (isr & AT91C_UDP_RXSUSP) {
408 3 USB_Suspend();
409 3 #if USB_SUSPEND_EVENT
410 3 USB_Suspend_Event();
411 3 #endif
412 3 pUDP->UDP_ICR = AT91C_UDP_RXSUSP;
413 3 }
414 2 /* USB Resume Interrupt */
415 2 if (isr & AT91C_UDP_RXRSM) {
416 3 USB_Resume();
417 3 #if USB_RESUME_EVENT
418 3 USB_Resume_Event();
419 3 #endif
420 3 pUDP->UDP_ICR = AT91C_UDP_RXRSM;
421 3 }
422 2
423 2 /* External Resume Interrupt */
424 2 if (isr & AT91C_UDP_EXTRSM) {
425 3 USB_WakeUp();
426 3 #if USB_WAKEUP_EVENT
USB_WakeUp_Event();
#endif
429 3 pUDP->UDP_ICR = AT91C_UDP_EXTRSM;
430 3 }
431 2
432 2 /* Start of Frame Interrupt */
433 2 if (isr & AT91C_UDP_SOFINT) {
434 3 #if USB_SOF_EVENT
USB_SOF_Event();
#endif
437 3 pUDP->UDP_ICR = AT91C_UDP_SOFINT;
438 3 }
439 2
440 2 /* Endpoint Interrupts */
441 2 for (n = 0; n < USB_EP_NUM; n++) {
442 3 if (isr & (1 << n)) {
443 4
444 4 csr = pUDP->UDP_CSR[n];
445 4 /* Setup Packet Received Interrupt */
446 4 if (csr & AT91C_UDP_RXSETUP) {
447 5 if (USB_P_EP[n]) {
448 6 USB_P_EP[n](USB_EVT_SETUP);
449 6 }
450 5 /* Setup Flag is already cleared in USB_DirCtrlEP */
451 5 /* pUDP->UDP_CSR[n] &= ~AT91C_UDP_RXSETUP; */
452 5 }
453 4
454 4 /* Data Packet Received Interrupt */
455 4 bkm = RX_DATA_BK[RxDataBank[n]];
ARM COMPILER V2.53, usbhw 02/11/07 08:22:50 PAGE 8
456 4 if (csr & bkm) {
457 5 if (USB_P_EP[n]) {
458 6 USB_P_EP[n](USB_EVT_OUT);
459 6 }
460 5 pUDP->UDP_CSR[n] &= ~bkm;
461 5 if (DualBankEP & (1 << n)) {
462 6 RxDataBank[n] ^= 1;
463 6 }
464 5 }
465 4
466 4 /* Data Packet Sent Interrupt */
467 4 if (csr & AT91C_UDP_TXCOMP) {
468 5 pUDP->UDP_CSR[n] &= ~AT91C_UDP_TXCOMP;
469 5 if (TxDataBank[n]) {
470 6 pUDP->UDP_CSR[n] |= AT91C_UDP_TXPKTRDY;
471 6 TxDataBank[n] = 0;
472 6 }
473 5 if (USB_P_EP[n]) {
474 6 USB_P_EP[n](USB_EVT_IN);
475 6 }
476 5 }
477 4
478 4 /* STALL Packet Sent Interrupt */
479 4 if (csr & AT91C_UDP_STALLSENT) {
480 5 if ((csr & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) {
481 6 if (USB_P_EP[n]) {
482 7 USB_P_EP[n](USB_EVT_IN_STALL);
483 7 /* USB_P_EP[n](USB_EVT_OUT_STALL); */
484 7 }
485 6 }
486 5 pUDP->UDP_CSR[n] &= ~AT91C_UDP_STALLSENT;
487 5 }
488 4
489 4 }
490 3 }
491 2
492 2 }
493 1 *AT91C_AIC_EOICR = 0; /* End of Interrupt */
494 1 }
ARM COMPILER V2.53, usbhw 02/11/07 08:22:50 PAGE 9
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (USB_Reset_Event?T)
EXTERN CODE16 (USB_Suspend_Event?T)
EXTERN CODE16 (USB_Resume_Event?T)
EXTERN DATA (USB_P_EP)
EXTERN CODE32 (USB_Reset_Event?A)
EXTERN CODE32 (USB_Suspend_Event?A)
EXTERN CODE32 (USB_Resume_Event?A)
*** PUBLICS:
PUBLIC USB_Init?T
PUBLIC USB_Connect?T
PUBLIC USB_Reset?T
PUBLIC USB_Reset?A
PUBLIC USB_Suspend?T
PUBLIC USB_Suspend?A
PUBLIC USB_Resume?T
PUBLIC USB_Resume?A
PUBLIC USB_WakeUp?T
PUBLIC USB_WakeUp?A
PUBLIC USB_WakeUpCfg?T
PUBLIC USB_SetAddress?T
PUBLIC USB_Configure?T
PUBLIC USB_ConfigEP?T
PUBLIC USB_DirCtrlEP?T
PUBLIC USB_EnableEP?T
PUBLIC USB_DisableEP?T
PUBLIC USB_ResetEP?T
PUBLIC USB_SetStallEP?T
PUBLIC USB_ClrStallEP?T
PUBLIC USB_ReadEP?T
PUBLIC USB_WriteEP?T
PUBLIC USB_GetFrame?T
PUBLIC USB_ISR?A
PUBLIC DualBankEP
PUBLIC RX_DATA_BK
PUBLIC pUDP
PUBLIC RxDataBank
PUBLIC TxDataBank
*** DATA SEGMENT '?CON?usbhw':
00000000 RX_DATA_BK:
00000000 BEGIN_INIT
00000000 00000002 DD 0x2
00000004 00000040 DD 0x40
00000008 END_INIT
00000008 DualBankEP:
00000008 BEGIN_INIT
00000008 06 DB 0x6
00000009 END_INIT
*** DATA SEGMENT '?DT0?usbhw':
00000000 pUDP:
00000000 BEGIN_INIT
00000000 FFFB0000 DD 0xFFFB0000
00000004 END_INIT
00000004 RxDataBank:
00000004 DS 4
00000008 TxDataBank:
00000008 DS 4
*** CODE SEGMENT '?PR?USB_Init?T?usbhw':
45: AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;
00000000 2180 MOV R1,#0x80
ARM COMPILER V2.53, usbhw 02/11/07 08:22:50 PAGE 10
00000002 4800 LDR R0,=0xFFFFFC00
00000004 6001 STR R1,[R0,#0x0]
46: AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);
00000006 4800 LDR R1,=0x800
00000008 4800 LDR R0,=0xFFFFFC10
0000000A 6001 STR R1,[R0,#0x0]
50: AT91C_AIC_PRIOR_HIGHEST;
0000000C 2227 MOV R2,#0x27
0000000E 4800 LDR R0,=0xFFFFF02C
00000010 6002 STR R2,[R0,#0x0]
51: AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned long) USB_ISR;
00000012 4A00 LDR R2,=USB_ISR?A ; USB_ISR?A
00000014 4800 LDR R0,=0xFFFFF0AC
00000016 6002 STR R2,[R0,#0x0]
52: AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_UDP);
00000018 4800 LDR R0,=0xFFFFF120
0000001A 6001 STR R1,[R0,#0x0]
56: AT91C_BASE_PIOA->PIO_PER = AT91C_PIO_PA16;
0000001C 4800 LDR R1,=0x10000
0000001E 4800 LDR R0,=0xFFFFF400
00000020 6001 STR R1,[R0,#0x0]
57: AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA16;
00000022 4800 LDR R0,=0xFFFFF430
00000024 6001 STR R1,[R0,#0x0]
58: AT91C_BASE_PIOA->PIO_OER = AT91C_PIO_PA16;
00000026 4800 LDR R0,=0xFFFFF410
00000028 6001 STR R1,[R0,#0x0]
59: }
0000002A 4770 BX R14
0000002C ENDP ; 'USB_Init?T'
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -