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

📄 usbhw.lst

📁 在ATMEL芯片下的USB底层程序的开发
💻 LST
📖 第 1 页 / 共 5 页
字号:
  297          /*
  298           *  Set Stall for USB Endpoint
  299           *    Parameters:      EPNum: Endpoint Number
  300           *                       EPNum.0..3: Address
  301           *                       EPNum.7:    Dir
  302           *    Return Value:    None
  303           */
  304          
  305          void USB_SetStallEP (DWORD EPNum) {
  306   1        pUDP->UDP_CSR[EPNum & 0x0F] |=  AT91C_UDP_FORCESTALL;
  307   1      }
  308          
  309          
  310          /*
  311           *  Clear 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_ClrStallEP (DWORD EPNum) {
  319   1        pUDP->UDP_CSR[EPNum & 0x0F] &= ~AT91C_UDP_FORCESTALL;
  320   1      }
  321          /*
  322           *  Read USB Endpoint Data
  323           *    Parameters:      EPNum: Endpoint Number
ARM COMPILER V2.53,  usbhw                                                                 31/10/07  09:22:43  PAGE 6   

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

  390           */
  391          
  392          void USB_ISR (void) __irq {
  393   1        DWORD isr, csr, bkm, n;
  394   1      
  395   1        while (isr = pUDP->UDP_ISR) {
  396   2      
  397   2          /* End of Bus Reset Interrupt */
  398   2          if (isr & AT91C_UDP_ENDBUSRES) {
  399   3            USB_Reset();
  400   3      #if   USB_RESET_EVENT
  401   3            USB_Reset_Event();
  402   3      #endif
  403   3            pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
  404   3          }
  405   2      
  406   2          /* USB Suspend Interrupt */
  407   2          if (isr & AT91C_UDP_RXSUSP) {
  408   3            USB_Suspend();
  409   3      #if   USB_SUSPEND_EVENT
  410   3            USB_Suspend_Event();
  411   3      #endif
  412   3            pUDP->UDP_ICR = AT91C_UDP_RXSUSP;
  413   3          }
  414   2          /* USB Resume Interrupt */
  415   2          if (isr & AT91C_UDP_RXRSM) {
  416   3            USB_Resume();
  417   3      #if   USB_RESUME_EVENT
  418   3            USB_Resume_Event();
  419   3      #endif
  420   3            pUDP->UDP_ICR = AT91C_UDP_RXRSM;
  421   3          }
  422   2      
  423   2          /* External Resume Interrupt */
  424   2          if (isr & AT91C_UDP_EXTRSM) {
  425   3            USB_WakeUp();
  426   3      #if   USB_WAKEUP_EVENT
                     USB_WakeUp_Event();
               #endif
  429   3            pUDP->UDP_ICR = AT91C_UDP_EXTRSM;
  430   3          }
  431   2      
  432   2          /* Start of Frame Interrupt */
  433   2          if (isr & AT91C_UDP_SOFINT) {
  434   3      #if USB_SOF_EVENT
                     USB_SOF_Event();
               #endif
  437   3            pUDP->UDP_ICR = AT91C_UDP_SOFINT;
  438   3          }
  439   2      
  440   2          /* Endpoint Interrupts */
  441   2          for (n = 0; n < USB_EP_NUM; n++) {
  442   3            if (isr & (1 << n)) {
  443   4      
  444   4              csr = pUDP->UDP_CSR[n];
  445   4              /* Setup Packet Received Interrupt */
  446   4              if (csr & AT91C_UDP_RXSETUP) {
  447   5                if (USB_P_EP[n]) {
  448   6                  USB_P_EP[n](USB_EVT_SETUP);
  449   6                }
  450   5                /* Setup Flag is already cleared in USB_DirCtrlEP */
  451   5                /* pUDP->UDP_CSR[n] &= ~AT91C_UDP_RXSETUP; */
  452   5              }
  453   4      
  454   4              /* Data Packet Received Interrupt */
  455   4              bkm = RX_DATA_BK[RxDataBank[n]];
ARM COMPILER V2.53,  usbhw                                                                 31/10/07  09:22:43  PAGE 8   

  456   4              if (csr & bkm) {
  457   5                if (USB_P_EP[n]) {
  458   6                  USB_P_EP[n](USB_EVT_OUT);
  459   6                }
  460   5                pUDP->UDP_CSR[n] &= ~bkm;
  461   5                if (DualBankEP & (1 << n)) {
  462   6                  RxDataBank[n] ^= 1;
  463   6                }
  464   5              }
  465   4      
  466   4              /* Data Packet Sent Interrupt */
  467   4              if (csr & AT91C_UDP_TXCOMP) {
  468   5                pUDP->UDP_CSR[n] &= ~AT91C_UDP_TXCOMP;
  469   5                if (TxDataBank[n]) {
  470   6                  pUDP->UDP_CSR[n] |= AT91C_UDP_TXPKTRDY;
  471   6                  TxDataBank[n] = 0;
  472   6                }
  473   5                if (USB_P_EP[n]) {
  474   6                  USB_P_EP[n](USB_EVT_IN);
  475   6                }
  476   5              }
  477   4      
  478   4              /* STALL Packet Sent Interrupt */
  479   4              if (csr & AT91C_UDP_STALLSENT) {
  480   5                if ((csr & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) {
  481   6                  if (USB_P_EP[n]) {
  482   7                    USB_P_EP[n](USB_EVT_IN_STALL);
  483   7      /*            USB_P_EP[n](USB_EVT_OUT_STALL); */
  484   7                  }
  485   6                }
  486   5                pUDP->UDP_CSR[n] &= ~AT91C_UDP_STALLSENT;
  487   5              }
  488   4      
  489   4            }
  490   3          }
  491   2      
  492   2        }
  493   1        *AT91C_AIC_EOICR = 0;                     /* End of Interrupt */
  494   1      }
ARM COMPILER V2.53,  usbhw                                                                 31/10/07  09:22:43  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':
   45:   AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;
 00000000  2180      MOV         R1,#0x80
ARM COMPILER V2.53,  usbhw                                                                 31/10/07  09:22:43  PAGE 10  

 00000002  4800      LDR         R0,=0xFFFFFC00
 00000004  6001      STR         R1,[R0,#0x0]
   46:   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]
   50:                                           AT91C_AIC_PRIOR_HIGHEST;
 0000000C  2227      MOV         R2,#0x27
 0000000E  4800      LDR         R0,=0xFFFFF02C
 00000010  6002      STR         R2,[R0,#0x0]
   51:   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]
   52:   AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_UDP);
 00000018  4800      LDR         R0,=0xFFFFF120
 0000001A  6001      STR         R1,[R0,#0x0]
   56:   AT91C_BASE_PIOA->PIO_PER  = AT91C_PIO_PA16;
 0000001C  4800      LDR         R1,=0x10000
 0000001E  4800      LDR         R0,=0xFFFFF400
 00000020  6001      STR         R1,[R0,#0x0]
   57:   AT91C_BASE_PIOA->PIO_SODR = AT91C_PIO_PA16;
 00000022  4800      LDR         R0,=0xFFFFF430
 00000024  6001      STR         R1,[R0,#0x0]
   58:   AT91C_BASE_PIOA->PIO_OER  = AT91C_PIO_PA16;
 00000026  4800      LDR         R0,=0xFFFFF410
 00000028  6001      STR         R1,[R0,#0x0]
   59: }
 0000002A  4770      BX          R14
 0000002C          ENDP ; 'USB_Init?T'

⌨️ 快捷键说明

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