📄 usbhw.lst
字号:
}
#endif /* USB_DMA */
604
605
606 /*
607 * Get USB Last Frame Number
608 * Parameters: None
609 * Return Value: Frame Number
610 */
611
612 DWORD USB_GetFrame (void) {
613 1 DWORD val;
614 1
615 1 WrCmd(CMD_RD_FRAME);
616 1 val = RdCmdDat(DAT_RD_FRAME);
617 1 val = val | (RdCmdDat(DAT_RD_FRAME) << 8);
618 1
619 1 return (val);
620 1 }
621
622
623 /*
624 * USB Interrupt Service Routine
625 */
626
627 void USB_ISR (void) __irq {
628 1 DWORD disr, eisr, val, n, m;
629 1
630 1 disr = DEV_INT_STAT; /* Device Interrupt Status */
631 1
632 1 /* Device Status Interrupt (Reset, Suspend/Resume, Connect change) */
633 1 if (disr & DEV_STAT_INT) {
634 2 WrCmd(CMD_GET_DEV_STAT);
635 2 val = RdCmdDat(DAT_GET_DEV_STAT); /* Device Status */
636 2 if (val & DEV_RST) { /* Reset */
637 3 USB_Reset();
638 3 #if USB_RESET_EVENT
639 3 USB_Reset_Event();
640 3 #endif
641 3 goto isr_end;
642 3 }
643 2 if (val & DEV_SUS_CH) { /* Suspend/Resume */
644 3 if (val & DEV_SUS) { /* Suspend */
645 4 USB_Suspend();
646 4 #if USB_SUSPEND_EVENT
647 4 USB_Suspend_Event();
648 4 #endif
649 4 } else { /* Resume */
650 4 USB_Resume();
651 4 #if USB_RESUME_EVENT
652 4 USB_Resume_Event();
653 4 #endif
ARM COMPILER V2.42b, usbhw 02/01/06 23:45:15 PAGE 11
654 4 }
655 3 goto isr_end;
656 3 }
657 2 if (val & DEV_CON_CH) { /* Connect change */
658 3 #if USB_POWER_EVENT
USB_Power_Event(val & DEV_CON);
#endif
661 3 goto isr_end;
662 3 }
663 2 }
664 1
665 1 #if USB_SOF_EVENT
/* Start of Frame Interrupt */
if (disr & FRAME_INT) {
USB_SOF_Event();
}
#endif
671 1
672 1 #if USB_ERROR_EVENT
/* Error Interrupt */
if (disr & ERR_INT) {
WrCmd(CMD_RD_ERR_STAT);
val = RdCmdDat(DAT_RD_ERR_STAT);
USB_Error_Event(val);
}
#endif
680 1
681 1 /* Endpoint's Slow Interrupt */
682 1 if (disr & EP_SLOW_INT) {
683 2
684 2 while (eisr = EP_INT_STAT) { /* Endpoint Interrupt Status */
685 3
686 3 for (n = 0; n < USB_EP_NUM; n++) { /* Check All Endpoints */
687 4 if (eisr & (1 << n)) {
688 5 m = n >> 1;
689 5
690 5 EP_INT_CLR = 1 << n;
691 5 while ((DEV_INT_STAT & CDFULL_INT) == 0);
692 5 val = CMD_DATA;
693 5 DEV_INT_CLR = CDFULL_INT;
694 5
695 5 if ((n & 1) == 0) { /* OUT Endpoint */
696 6 if (n == 0) { /* Control OUT Endpoint */
697 7 if (val & EP_SEL_STP) { /* Setup Packet */
698 8 if (USB_P_EP[0]) {
699 9 USB_P_EP[0](USB_EVT_SETUP);
700 9 continue;
701 9 }
702 8 }
703 7 }
704 6 if (USB_P_EP[m]) {
705 7 USB_P_EP[m](USB_EVT_OUT);
706 7 }
707 6 } else { /* IN Endpoint */
708 6 if (USB_P_EP[m]) {
709 7 USB_P_EP[m](USB_EVT_IN);
710 7 }
711 6 }
712 5 }
713 4 }
714 3 }
715 2 }
716 1
717 1 #if USB_DMA
if (DMA_INT_STAT & 0x00000001) { /* End of Transfer Interrupt */
ARM COMPILER V2.42b, usbhw 02/01/06 23:45:15 PAGE 12
eisr = EOT_INT_STAT;
for (n = 2; n < USB_EP_NUM; n++) { /* Check All Endpoints */
if (eisr & (1 << n)) {
m = n >> 1;
if ((n & 1) == 0) { /* OUT Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_OUT_DMA_EOT);
}
} else { /* IN Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_IN_DMA_EOT);
}
}
}
}
EOT_INT_CLR = eisr;
}
if (DMA_INT_STAT & 0x00000002) { /* New DD Request Interrupt */
eisr = NDD_REQ_INT_STAT;
for (n = 2; n < USB_EP_NUM; n++) { /* Check All Endpoints */
if (eisr & (1 << n)) {
m = n >> 1;
if ((n & 1) == 0) { /* OUT Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_OUT_DMA_NDR);
}
} else { /* IN Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_IN_DMA_NDR);
}
}
}
}
NDD_REQ_INT_CLR = eisr;
}
if (DMA_INT_STAT & 0x00000004) { /* System Error Interrupt */
eisr = SYS_ERR_INT_STAT;
for (n = 2; n < USB_EP_NUM; n++) { /* Check All Endpoints */
if (eisr & (1 << n)) {
m = n >> 1;
if ((n & 1) == 0) { /* OUT Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_OUT_DMA_ERR);
}
} else { /* IN Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_IN_DMA_ERR);
}
}
}
}
SYS_ERR_INT_CLR = eisr;
}
#endif /* USB_DMA */
777 1
778 1 isr_end:
779 1 DEV_INT_CLR = disr;
780 1 VICVectAddr = 0; /* Acknowledge Interrupt */
781 1 }
ARM COMPILER V2.42b, usbhw 02/01/06 23:45:15 PAGE 13
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN DATA (USB_DeviceStatus)
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_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 EPAdr?T
PUBLIC WrCmd?T
PUBLIC WrCmd?A
PUBLIC WrCmdDat?T
PUBLIC RdCmdDat?T
PUBLIC RdCmdDat?A
*** CODE SEGMENT '?PR?EPAdr?T?usbhw':
48: DWORD EPAdr (DWORD EPNum) {
00000000 1C03 MOV R3,R0 ; EPNum
00000002 ---- Variable 'EPNum' assigned to Register 'R3' ----
00000002 ; SCOPE-START
51: val = (EPNum & 0x0F) << 1;
00000002 1C19 MOV R1,R3 ; EPNum
00000004 200F MOV R0,#0xF
00000006 4001 AND R1,R0
00000008 0049 LSL R1,R1,#0x1
0000000A ---- Variable 'val' assigned to Register 'R1' ----
52: if (EPNum & 0x80) {
0000000A 1C18 MOV R0,R3 ; EPNum
0000000C 2280 MOV R2,#0x80
0000000E 4210 TST R0,R2 ; EPNum
00000010 D000 BEQ L_1 ; T=0x00000014
53: val += 1;
00000012 3101 ADD R1,#0x1
54: }
00000014 L_1:
55: return (val);
00000014 1C08 MOV R0,R1 ; val
ARM COMPILER V2.42b, usbhw 02/01/06 23:45:15 PAGE 14
00000016 ; SCOPE-END
56: }
00000016 4770 BX R14
00000018 ENDP ; 'EPAdr?T'
*** CODE SEGMENT '?PR?WrCmd?T?usbhw':
65: void WrCmd (DWORD cmd) {
00000000 ---- Variable 'cmd' assigned to Register 'R0' ----
67: CMD_CODE = cmd;
00000000 1C01 MOV R1,R0 ; cmd
00000002 4800 LDR R0,=0xE0090010
00000004 6001 STR R1,[R0,#0x0]
68: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
00000006 L_3:
00000006 4800 LDR R0,=0xE0090000
00000008 6800 LDR R0,[R0,#0x0]
0000000A 2110 MOV R1,#0x10
0000000C 4208 TST R0,R1
0000000E D0FA BEQ L_3 ; T=0x00000006
69: DEV_INT_CLR = CCEMTY_INT;
00000010 4800 LDR R0,=0xE0090008
00000012 6001 STR R1,[R0,#0x0]
70: }
00000014 4770 BX R14
00000016 ENDP ; 'WrCmd?T'
*** CODE SEGMENT '?PR?WrCmdDat?T?usbhw':
80: void WrCmdDat (DWORD cmd, DWORD val) {
00000000 1C0A MOV R2,R1 ; val
00000002 ---- Variable 'val' assigned to Register 'R2' ----
00000002 ---- Variable 'cmd' assigned to Register 'R0' ----
82: CMD_CODE = cmd;
00000002 1C01 MOV R1,R0 ; cmd
00000004 4800 LDR R0,=0xE0090010
00000006 6001 STR R1,[R0,#0x0]
83: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
00000008 L_7:
00000008 4800 LDR R0,=0xE0090000
0000000A 6800 LDR R0,[R0,#0x0]
0000000C 2110 MOV R1,#0x10
0000000E 4208 TST R0,R1
00000010 D0FA BEQ L_7 ; T=0x00000008
84: DEV_INT_CLR = CCEMTY_INT;
00000012 4800 LDR R0,=0xE0090008
00000014 6001 STR R1,[R0,#0x0]
85: CMD_CODE = val;
00000016 1C11 MOV R1,R2 ; val
00000018 4800 LDR R0,=0xE0090010
0000001A 6001 STR R1,[R0,#0x0]
86: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -