📄 usbhw.lst
字号:
600 /*
601 * Get USB Last Frame Number
602 * Parameters: None
603 * Return Value: Frame Number
604 */
605
606 DWORD USB_GetFrame (void) {
607 1 DWORD val;
608 1
609 1 WrCmd(CMD_RD_FRAME);
610 1 val = RdCmdDat(DAT_RD_FRAME);
611 1 val = val | (RdCmdDat(DAT_RD_FRAME) << 8);
612 1
613 1 return (val);
614 1 }
615
616
617 /*
618 * USB Interrupt Service Routine
619 */
620
621 void USB_ISR (void) __irq {
622 1 DWORD disr, val, n, m;
623 1
624 1 disr = DEV_INT_STAT; /* Device Interrupt Status */
625 1
626 1 /* Device Status Interrupt (Reset, Suspend/Resume, Connect change) */
627 1 if (disr & DEV_STAT_INT) {
628 2 WrCmd(CMD_GET_DEV_STAT);
629 2 val = RdCmdDat(DAT_GET_DEV_STAT); /* Device Status */
630 2 if (val & DEV_RST) { /* Reset */
631 3 USB_Reset();
632 3 #if USB_RESET_EVENT
633 3 USB_Reset_Event();
634 3 #endif
635 3 goto isr_end;
636 3 }
637 2 if (val & DEV_SUS_CH) { /* Suspend/Resume */
638 3 if (val & DEV_SUS) { /* Suspend */
639 4 USB_Suspend();
640 4 #if USB_SUSPEND_EVENT
641 4 USB_Suspend_Event();
642 4 #endif
643 4 } else { /* Resume */
644 4 USB_Resume();
645 4 #if USB_RESUME_EVENT
646 4 USB_Resume_Event();
647 4 #endif
648 4 }
649 3 goto isr_end;
650 3 }
651 2 if (val & DEV_CON_CH) { /* Connect change */
652 3 #if USB_POWER_EVENT
USB_Power_Event(val & DEV_CON);
ARM COMPILER V2.50a, usbhw 04/04/06 11:13:56 PAGE 11
#endif
655 3 goto isr_end;
656 3 }
657 2 }
658 1
659 1 #if USB_SOF_EVENT
/* Start of Frame Interrupt */
if (disr & FRAME_INT) {
USB_SOF_Event();
}
#endif
665 1
666 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
674 1
675 1 /* Endpoint's Slow Interrupt */
676 1 if (disr & EP_SLOW_INT) {
677 2
678 2 while (EP_INT_STAT) { /* Endpoint Interrupt Status */
679 3
680 3 for (n = 0; n < USB_EP_NUM; n++) { /* Check All Endpoints */
681 4 if (EP_INT_STAT & (1 << n)) {
682 5 m = n >> 1;
683 5
684 5 EP_INT_CLR = 1 << n;
685 5 while ((DEV_INT_STAT & CDFULL_INT) == 0);
686 5 val = CMD_DATA;
687 5
688 5 if ((n & 1) == 0) { /* OUT Endpoint */
689 6 if (n == 0) { /* Control OUT Endpoint */
690 7 if (val & EP_SEL_STP) { /* Setup Packet */
691 8 if (USB_P_EP[0]) {
692 9 USB_P_EP[0](USB_EVT_SETUP);
693 9 continue;
694 9 }
695 8 }
696 7 }
697 6 if (USB_P_EP[m]) {
698 7 USB_P_EP[m](USB_EVT_OUT);
699 7 }
700 6 } else { /* IN Endpoint */
701 6 if (USB_P_EP[m]) {
702 7 USB_P_EP[m](USB_EVT_IN);
703 7 }
704 6 }
705 5 }
706 4 }
707 3 }
708 2 }
709 1
710 1 #if USB_DMA
if (DMA_INT_STAT & 0x00000001) { /* End of Transfer Interrupt */
val = EOT_INT_STAT;
for (n = 2; n < USB_EP_NUM; n++) { /* Check All Endpoints */
if (val & (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);
ARM COMPILER V2.50a, usbhw 04/04/06 11:13:56 PAGE 12
}
} else { /* IN Endpoint */
if (USB_P_EP[m]) {
USB_P_EP[m](USB_EVT_IN_DMA_EOT);
}
}
}
}
EOT_INT_CLR = val;
}
if (DMA_INT_STAT & 0x00000002) { /* New DD Request Interrupt */
val = NDD_REQ_INT_STAT;
for (n = 2; n < USB_EP_NUM; n++) { /* Check All Endpoints */
if (val & (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 = val;
}
if (DMA_INT_STAT & 0x00000004) { /* System Error Interrupt */
val = SYS_ERR_INT_STAT;
for (n = 2; n < USB_EP_NUM; n++) { /* Check All Endpoints */
if (val & (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 = val;
}
#endif /* USB_DMA */
770 1
771 1 isr_end:
772 1 DEV_INT_CLR = disr;
773 1 VICVectAddr = 0; /* Acknowledge Interrupt */
774 1 }
ARM COMPILER V2.50a, usbhw 04/04/06 11:13:56 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':
44: DWORD EPAdr (DWORD EPNum) {
00000000 1C03 MOV R3,R0 ; EPNum
00000002 ---- Variable 'EPNum' assigned to Register 'R3' ----
00000002 ; SCOPE-START
47: 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' ----
48: 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
49: val += 1;
00000012 3101 ADD R1,#0x1
50: }
00000014 L_1:
51: return (val);
00000014 1C08 MOV R0,R1 ; val
ARM COMPILER V2.50a, usbhw 04/04/06 11:13:56 PAGE 14
00000016 ; SCOPE-END
52: }
00000016 4770 BX R14
00000018 ENDP ; 'EPAdr?T'
*** CODE SEGMENT '?PR?WrCmd?T?usbhw':
61: void WrCmd (DWORD cmd) {
00000000 ---- Variable 'cmd' assigned to Register 'R0' ----
63: DEV_INT_CLR = CCEMTY_INT;
00000000 2210 MOV R2,#0x10
00000002 4800 LDR R1,=0xE0090008
00000004 600A STR R2,[R1,#0x0]
64: CMD_CODE = cmd;
00000006 1C01 MOV R1,R0 ; cmd
00000008 4800 LDR R0,=0xE0090010
0000000A 6001 STR R1,[R0,#0x0]
65: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
0000000C L_3:
0000000C 4800 LDR R0,=0xE0090000
0000000E 6800 LDR R0,[R0,#0x0]
00000010 2110 MOV R1,#0x10
00000012 4208 TST R0,R1
00000014 D0FA BEQ L_3 ; T=0x0000000C
66: }
00000016 4770 BX R14
00000018 ENDP ; 'WrCmd?T'
*** CODE SEGMENT '?PR?WrCmdDat?T?usbhw':
76: 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' ----
78: DEV_INT_CLR = CCEMTY_INT;
00000002 2310 MOV R3,#0x10
00000004 4800 LDR R1,=0xE0090008
00000006 600B STR R3,[R1,#0x0]
79: CMD_CODE = cmd;
00000008 1C01 MOV R1,R0 ; cmd
0000000A 4800 LDR R0,=0xE0090010
0000000C 6001 STR R1,[R0,#0x0]
80: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
0000000E L_7:
0000000E 4800 LDR R0,=0xE0090000
00000010 6800 LDR R0,[R0,#0x0]
00000012 2110 MOV R1,#0x10
00000014 4208 TST R0,R1
00000016 D0FA BEQ L_7 ; T=0x0000000E
81: DEV_INT_CLR = CCEMTY_INT;
00000018 4800 LDR R0,=0xE0090008
0000001A 6001 STR R1,[R0,#0x0]
82: CMD_CODE = val;
0000001C 1C11 MOV R1,R2 ; val
0000001E 4800 LDR R0,=0xE0090010
00000020 6001 STR R1,[R0,#0x0]
83: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
00000022 L_11:
00000022 4800 LDR R0,=0xE0090000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -