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

📄 usbhw.lst

📁 将LPC2148通过自带的USB口配置为USB存储设备.
💻 LST
📖 第 1 页 / 共 5 页
字号:
  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 + -