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

📄 usbhw.lst

📁 USB高性能读卡器源码。可灵活增删功能。
💻 LST
📖 第 1 页 / 共 5 页
字号:
  300   1                                  AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1  |
  301   1                                  AT91C_UDP_TXPKTRDY    | AT91C_UDP_FORCESTALL   |
  302   1                                  AT91C_UDP_STALLSENT);
  303   1        pUDP->UDP_RSTEP  |=   1 << EPNum;
  304   1        pUDP->UDP_RSTEP  &= ~(1 << EPNum);
  305   1        RxDataBank[EPNum] =   0;
  306   1        TxDataBank[EPNum] =   0;
  307   1      }
  308          
  309          
  310          /*
  311           *  Set Stall for USB Endpoint
  312           *    Parameters:      EPNum: Endpoint Number
  313           *                       EPNum.0..3: Address
  314           *                       EPNum.7:    Dir
  315           *    Return Value:    None
  316           */
  317          
  318          void USB_SetStallEP (DWORD EPNum) {
  319   1        pUDP->UDP_CSR[EPNum & 0x0F] |=  AT91C_UDP_FORCESTALL;
  320   1      }
  321          
  322          
  323          /*
ARM COMPILER V2.51a,  usbhw                                                                16/08/06  09:38:29  PAGE 6   

  324           *  Clear Stall for USB Endpoint
  325           *    Parameters:      EPNum: Endpoint Number
  326           *                       EPNum.0..3: Address
  327           *                       EPNum.7:    Dir
  328           *    Return Value:    None
  329           */
  330          
  331          void USB_ClrStallEP (DWORD EPNum) {
  332   1        pUDP->UDP_CSR[EPNum & 0x0F] &= ~AT91C_UDP_FORCESTALL;
  333   1      }
  334          
  335          
  336          /*
  337           *  Read USB Endpoint Data
  338           *    Parameters:      EPNum: Endpoint Number
  339           *                       EPNum.0..3: Address
  340           *                       EPNum.7:    Dir
  341           *                     pData: Pointer to Data Buffer
  342           *    Return Value:    Number of bytes read
  343           */
  344          
  345          DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
  346   1        DWORD cnt, n;
  347   1      
  348   1        EPNum &= 0x0F;
  349   1        cnt = (pUDP->UDP_CSR[EPNum] >> 16) & 0x07FF;
  350   1        for (n = 0; n < cnt; n++) {
  351   2          *pData++ = (BYTE)pUDP->UDP_FDR[EPNum];
  352   2        }
  353   1        return (cnt);
  354   1      }
  355          
  356          
  357          /*
  358           *  Write USB Endpoint Data
  359           *    Parameters:      EPNum: Endpoint Number
  360           *                       EPNum.0..3: Address
  361           *                       EPNum.7:    Dir
  362           *                     pData: Pointer to Data Buffer
  363           *                     cnt:   Number of bytes to write
  364           *    Return Value:    Number of bytes written
  365           */
  366          
  367          DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
  368   1        DWORD n;
  369   1      
  370   1        EPNum &= 0x0F;
  371   1        if (pUDP->UDP_CSR[EPNum] & AT91C_UDP_TXPKTRDY) {
  372   2          if ((DualBankEP & (1 << EPNum)) && (TxDataBank[EPNum] == 0)) {
  373   3            TxDataBank[EPNum] = 1;
  374   3          } else {
  375   3            return (0);
  376   3          }
  377   2        }
  378   1        for (n = 0; n < cnt; n++) {
  379   2          pUDP->UDP_FDR[EPNum] = *pData++;
  380   2        }
  381   1        pUDP->UDP_CSR[EPNum] |= AT91C_UDP_TXPKTRDY;
  382   1      
  383   1        return (cnt);
  384   1      }
  385          
  386          
  387          /*
  388           *  Get USB Last Frame Number
  389           *    Parameters:      None
ARM COMPILER V2.51a,  usbhw                                                                16/08/06  09:38:29  PAGE 7   

  390           *    Return Value:    Frame Number
  391           */
  392          
  393          DWORD USB_GetFrame (void) {
  394   1        DWORD val;
  395   1      
  396   1        while ((pUDP->UDP_NUM & (AT91C_UDP_FRM_OK | AT91C_UDP_FRM_ERR)) == 0);
  397   1        if (pUDP->UDP_NUM & AT91C_UDP_FRM_OK) {
  398   2          val = pUDP->UDP_NUM & AT91C_UDP_FRM_NUM;
  399   2        } else {
  400   2          val = 0xFFFFFFFF;
  401   2        }
  402   1      
  403   1        return (val);
  404   1      }
  405          
  406          
  407          
  408          /*
  409           *  USB Interrupt Service Routine
  410           */
  411          
  412          void USB_ISR (void) __irq {
  413   1        DWORD isr, csr, bkm, n;
  414   1      
  415   1        while (isr = pUDP->UDP_ISR) {
  416   2      
  417   2          /* End of Bus Reset Interrupt */
  418   2          if (isr & AT91C_UDP_ENDBUSRES) {
  419   3            USB_Reset();
  420   3      #if   USB_RESET_EVENT
  421   3            USB_Reset_Event();
  422   3      #endif
  423   3            pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
  424   3          }
  425   2      
  426   2          /* USB Suspend Interrupt */
  427   2          if (isr & AT91C_UDP_RXSUSP) {
  428   3            USB_Suspend();
  429   3      #if   USB_SUSPEND_EVENT
  430   3            USB_Suspend_Event();
  431   3      #endif
  432   3            pUDP->UDP_ICR = AT91C_UDP_RXSUSP;
  433   3          }
  434   2      
  435   2          /* USB Resume Interrupt */
  436   2          if (isr & AT91C_UDP_RXRSM) {
  437   3            USB_Resume();
  438   3      #if   USB_RESUME_EVENT
  439   3            USB_Resume_Event();
  440   3      #endif
  441   3            pUDP->UDP_ICR = AT91C_UDP_RXRSM;
  442   3          }
  443   2      
  444   2          /* External Resume Interrupt */
  445   2          if (isr & AT91C_UDP_EXTRSM) {
  446   3            USB_WakeUp();
  447   3      #if   USB_WAKEUP_EVENT
                     USB_WakeUp_Event();
               #endif
  450   3            pUDP->UDP_ICR = AT91C_UDP_EXTRSM;
  451   3          }
  452   2      
  453   2          /* Start of Frame Interrupt */
  454   2          if (isr & AT91C_UDP_SOFINT) {
  455   3      #if USB_SOF_EVENT
ARM COMPILER V2.51a,  usbhw                                                                16/08/06  09:38:29  PAGE 8   

                     USB_SOF_Event();
               #endif
  458   3            pUDP->UDP_ICR = AT91C_UDP_SOFINT;
  459   3          }
  460   2      
  461   2          /* Endpoint Interrupts */
  462   2          for (n = 0; n < USB_EP_NUM; n++) {
  463   3            if (isr & (1 << n)) {
  464   4      
  465   4              csr = pUDP->UDP_CSR[n];
  466   4      
  467   4              /* Setup Packet Received Interrupt */
  468   4              if (csr & AT91C_UDP_RXSETUP) {
  469   5                if (USB_P_EP[n]) {
  470   6                  USB_P_EP[n](USB_EVT_SETUP);
  471   6                }
  472   5                /* Setup Flag is already cleared in USB_DirCtrlEP */
  473   5                /* pUDP->UDP_CSR[n] &= ~AT91C_UDP_RXSETUP; */
  474   5              }
  475   4      
  476   4              /* Data Packet Received Interrupt */
  477   4              bkm = RX_DATA_BK[RxDataBank[n]];
  478   4              if (csr & bkm) {
  479   5                if (USB_P_EP[n]) {
  480   6                  USB_P_EP[n](USB_EVT_OUT);
  481   6                }
  482   5                pUDP->UDP_CSR[n] &= ~bkm;
  483   5                if (DualBankEP & (1 << n)) {
  484   6                  RxDataBank[n] ^= 1;
  485   6                }
  486   5              }
  487   4      
  488   4              /* Data Packet Sent Interrupt */
  489   4              if (csr & AT91C_UDP_TXCOMP) {
  490   5                pUDP->UDP_CSR[n] &= ~AT91C_UDP_TXCOMP;
  491   5                if (TxDataBank[n]) {
  492   6                  pUDP->UDP_CSR[n] |= AT91C_UDP_TXPKTRDY;
  493   6                  TxDataBank[n] = 0;
  494   6                }
  495   5                if (USB_P_EP[n]) {
  496   6                  USB_P_EP[n](USB_EVT_IN);
  497   6                }
  498   5              }
  499   4      
  500   4              /* STALL Packet Sent Interrupt */
  501   4              if (csr & AT91C_UDP_STALLSENT) {
  502   5                if ((csr & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) {
  503   6                  if (USB_P_EP[n]) {
  504   7                    USB_P_EP[n](USB_EVT_IN_STALL);
  505   7      /*            USB_P_EP[n](USB_EVT_OUT_STALL); */
  506   7                  }
  507   6                }
  508   5                pUDP->UDP_CSR[n] &= ~AT91C_UDP_STALLSENT;
  509   5              }
  510   4      
  511   4            }
  512   3          }
  513   2      
  514   2        }
  515   1      
  516   1        *AT91C_AIC_EOICR = 0;                     /* End of Interrupt */
  517   1      }
ARM COMPILER V2.51a,  usbhw                                                                16/08/06  09:38:29  PAGE 9   

ASSEMBLY LISTING OF GENERATED OBJECT CODE



*** EXTERNALS:
 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_WakeUp?A
 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         DualBankEP
 PUBLIC         RX_DATA_BK
 PUBLIC         pUDP
 PUBLIC         RxDataBank
 PUBLIC         TxDataBank



*** DATA SEGMENT '?CON?usbhw':
 00000000          RX_DATA_BK:
 00000000           BEGIN_INIT
 00000000  00000002  DD          0x2
 00000004  00000040  DD          0x40
 00000008           END_INIT
 00000008          DualBankEP:
 00000008           BEGIN_INIT
 00000008  06        DB          0x6
 00000009           END_INIT

*** DATA SEGMENT '?DT0?usbhw':
 00000000          pUDP:
 00000000           BEGIN_INIT
 00000000  FFFB0000  DD          0xFFFB0000
 00000004           END_INIT
 00000004          RxDataBank:
 00000004            DS          4
 00000008          TxDataBank:
 00000008            DS          4



*** CODE SEGMENT '?PR?USB_Init?T?usbhw':
   48:   AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;
 00000000  2180      MOV         R1,#0x80
ARM COMPILER V2.51a,  usbhw                                                                16/08/06  09:38:29  PAGE 10  

 00000002  4800      LDR         R0,=0xFFFFFC00
 00000004  6001      STR         R1,[R0,#0x0]
   49:   AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);
 00000006  4800      LDR         R1,=0x800
 00000008  4800      LDR         R0,=0xFFFFFC10
 0000000A  6001      STR         R1,[R0,#0x0]
   53:                                           AT91C_AIC_PRIOR_HIGHEST;
 0000000C  2227      MOV         R2,#0x27
 0000000E  4800      LDR         R0,=0xFFFFF02C
 00000010  6002      STR         R2,[R0,#0x0]
   54:   AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned long) USB_ISR;
 00000012  4A00      LDR         R2,=USB_ISR?A ; USB_ISR?A
 00000014  4800      LDR         R0,=0xFFFFF0AC
 00000016  6002      STR         R2,[R0,#0x0]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -