📄 usbhw.lst
字号:
DWORD USB_DMA_BufCnt (DWORD EPNum) {
DWORD ptr, val;
ptr = UDCA[EPAdr(EPNum)]; /* Current Descriptor */
if (ptr == 0) return (-1); /* DMA Invalid */
val = *((DWORD *)(ptr + 3*4)); /* Status Information */
return (val >> 16); /* Current Count */
}
#endif /* USB_DMA */
609
610
611 /*
612 * Get USB Last Frame Number
613 * Parameters: None
614 * Return Value: Frame Number
615 */
616
617 DWORD USB_GetFrame (void) {
618 1 DWORD val;
619 1
620 1 WrCmd(CMD_RD_FRAME);
621 1 val = RdCmdDat(DAT_RD_FRAME);
622 1 val = val | (RdCmdDat(DAT_RD_FRAME) << 8);
623 1
624 1 return (val);
625 1 }
626
627
628 /*
629 * USB Interrupt Service Routine
630 */
631
632 void USB_ISR (void) __irq {
633 1 DWORD disr, val, n, m;
634 1
635 1 disr = DEV_INT_STAT; /* Device Interrupt Status */
636 1
637 1 /* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */
638 1 if (disr & DEV_STAT_INT) {
639 2 WrCmd(CMD_GET_DEV_STAT);
640 2 val = RdCmdDat(DAT_GET_DEV_STAT); /* Device Status */
641 2 if (val & DEV_RST) { /* Reset */
642 3 USB_Reset();
643 3 #if USB_RESET_EVENT
644 3 USB_Reset_Event();
645 3 #endif
646 3 goto isr_end;
647 3 }
648 2 if (val & DEV_CON_CH) { /* Connect change */
649 3 #if USB_POWER_EVENT
USB_Power_Event(val & DEV_CON);
#endif
652 3 goto isr_end;
653 3 }
ARM COMPILER V2.53, usbhw 05/09/06 14:20:49 PAGE 11
654 2 if (val & DEV_SUS_CH) { /* Suspend/Resume */
655 3 if (val & DEV_SUS) { /* Suspend */
656 4 USB_Suspend();
657 4 #if USB_SUSPEND_EVENT
USB_Suspend_Event();
#endif
660 4 } else { /* Resume */
661 4 USB_Resume();
662 4 #if USB_RESUME_EVENT
USB_Resume_Event();
#endif
665 4 }
666 3 goto isr_end;
667 3 }
668 2 }
669 1
670 1 #if USB_SOF_EVENT
671 1 /* Start of Frame Interrupt */
672 1 if (disr & FRAME_INT) {
673 2 USB_SOF_Event();
674 2 }
675 1 #endif
676 1
677 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
685 1
686 1 /* Endpoint's Slow Interrupt */
687 1 if (disr & EP_SLOW_INT) {
688 2
689 2 while (EP_INT_STAT) { /* Endpoint Interrupt Status */
690 3
691 3 for (n = 0; n < USB_EP_NUM; n++) { /* Check All Endpoints */
692 4 if (EP_INT_STAT & (1 << n)) {
693 5 m = n >> 1;
694 5
695 5 EP_INT_CLR = 1 << n;
696 5 while ((DEV_INT_STAT & CDFULL_INT) == 0);
697 5 val = CMD_DATA;
698 5
699 5 if ((n & 1) == 0) { /* OUT Endpoint */
700 6 if (n == 0) { /* Control OUT Endpoint */
701 7 if (val & EP_SEL_STP) { /* Setup Packet */
702 8 if (USB_P_EP[0]) {
703 9 USB_P_EP[0](USB_EVT_SETUP);
704 9 continue;
705 9 }
706 8 }
707 7 }
708 6 if (USB_P_EP[m]) {
709 7 USB_P_EP[m](USB_EVT_OUT);
710 7 }
711 6 } else { /* IN Endpoint */
712 6 if (USB_P_EP[m]) {
713 7 USB_P_EP[m](USB_EVT_IN);
714 7 }
715 6 }
716 5 }
717 4 }
718 3 }
719 2 }
ARM COMPILER V2.53, usbhw 05/09/06 14:20:49 PAGE 12
720 1
721 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);
}
} 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 */
781 1
782 1 isr_end:
783 1 DEV_INT_CLR = disr;
784 1 VICVectAddr = 0; /* Acknowledge Interrupt */
785 1 }
ARM COMPILER V2.53, usbhw 05/09/06 14:20:49 PAGE 13
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN DATA (USB_DeviceStatus)
EXTERN CODE16 (USB_Reset_Event?T)
EXTERN CODE16 (USB_SOF_Event?T)
EXTERN DATA (USB_P_EP)
EXTERN CODE32 (USB_Reset_Event?A)
EXTERN CODE32 (USB_SOF_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':
55: DWORD EPAdr (DWORD EPNum) {
00000000 1C03 MOV R3,R0 ; EPNum
00000002 ---- Variable 'EPNum' assigned to Register 'R3' ----
00000002 ; SCOPE-START
58: 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' ----
59: 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
60: val += 1;
00000012 3101 ADD R1,#0x1
61: }
00000014 L_1:
62: return (val);
00000014 1C08 MOV R0,R1 ; val
00000016 ; SCOPE-END
63: }
ARM COMPILER V2.53, usbhw 05/09/06 14:20:49 PAGE 14
00000016 4770 BX R14
00000018 ENDP ; 'EPAdr?T'
*** CODE SEGMENT '?PR?WrCmd?T?usbhw':
72: void WrCmd (DWORD cmd) {
00000000 ---- Variable 'cmd' assigned to Register 'R0' ----
74: DEV_INT_CLR = CCEMTY_INT;
00000000 2210 MOV R2,#0x10
00000002 4800 LDR R1,=0xE0090008
00000004 600A STR R2,[R1,#0x0]
75: CMD_CODE = cmd;
00000006 1C01 MOV R1,R0 ; cmd
00000008 4800 LDR R0,=0xE0090010
0000000A 6001 STR R1,[R0,#0x0]
76: 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
77: }
00000016 4770 BX R14
00000018 ENDP ; 'WrCmd?T'
*** CODE SEGMENT '?PR?WrCmdDat?T?usbhw':
87: 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' ----
89: DEV_INT_CLR = CCEMTY_INT;
00000002 2310 MOV R3,#0x10
00000004 4800 LDR R1,=0xE0090008
00000006 600B STR R3,[R1,#0x0]
90: CMD_CODE = cmd;
00000008 1C01 MOV R1,R0 ; cmd
0000000A 4800 LDR R0,=0xE0090010
0000000C 6001 STR R1,[R0,#0x0]
91: while ((DEV_INT_STAT & CCEMTY_INT) == 0);
0000000E L_7:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -