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

📄 usbhw.lst

📁 USB存储器
💻 LST
📖 第 1 页 / 共 5 页
字号:
               }
               
               
               #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 + -