⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbhw.lst

📁 NXP产品LPC23XX的开发板的源文件
💻 LST
📖 第 1 页 / 共 5 页
字号:
               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 + -