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

📄 usbhw.lst

📁 NXP产品LPC23XX的开发板的源文件
💻 LST
📖 第 1 页 / 共 5 页
字号:
  295   1        DEV_INT_CLR = EP_RLZED_INT;
  296   1      }
  297          
  298          
  299          /*
  300           *  Set Direction for USB Control Endpoint
  301           *    Parameters:      dir:   Out (dir == 0), In (dir <> 0)
  302           *    Return Value:    None
  303           */
  304          
  305          void USB_DirCtrlEP (DWORD dir) {
  306   1        dir;  /* Not needed */
  307   1      }
  308          
  309          
  310          /*
  311           *  Enable 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_EnableEP (DWORD EPNum) {
  319   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  320   1      }
  321          
  322          
  323          /*
ARM COMPILER V2.53,  usbhw                                                                 05/09/06  14:20:49  PAGE 6   

  324           *  Disable 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_DisableEP (DWORD EPNum) {
  332   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_DA));
  333   1      }
  334          
  335          
  336          /*
  337           *  Reset USB Endpoint
  338           *    Parameters:      EPNum: Endpoint Number
  339           *                       EPNum.0..3: Address
  340           *                       EPNum.7:    Dir
  341           *    Return Value:    None
  342           */
  343          
  344          void USB_ResetEP (DWORD EPNum) {
  345   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  346   1      }
  347          
  348          
  349          /*
  350           *  Set Stall for USB Endpoint
  351           *    Parameters:      EPNum: Endpoint Number
  352           *                       EPNum.0..3: Address
  353           *                       EPNum.7:    Dir
  354           *    Return Value:    None
  355           */
  356          
  357          void USB_SetStallEP (DWORD EPNum) {
  358   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_ST));
  359   1      }
  360          
  361          
  362          /*
  363           *  Clear Stall for USB Endpoint
  364           *    Parameters:      EPNum: Endpoint Number
  365           *                       EPNum.0..3: Address
  366           *                       EPNum.7:    Dir
  367           *    Return Value:    None
  368           */
  369          
  370          void USB_ClrStallEP (DWORD EPNum) {
  371   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  372   1      }
  373          
  374          
  375          /*
  376           *  Read USB Endpoint Data
  377           *    Parameters:      EPNum: Endpoint Number
  378           *                       EPNum.0..3: Address
  379           *                       EPNum.7:    Dir
  380           *                     pData: Pointer to Data Buffer
  381           *    Return Value:    Number of bytes read
  382           */
  383          
  384          DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
  385   1        DWORD cnt, n;
  386   1      
  387   1        USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_RD_EN;
  388   1      
  389   1        do {
ARM COMPILER V2.53,  usbhw                                                                 05/09/06  14:20:49  PAGE 7   

  390   2          cnt = RX_PLENGTH;
  391   2        } while ((cnt & PKT_RDY) == 0);
  392   1        cnt &= PKT_LNGTH_MASK;
  393   1      
  394   1        for (n = 0; n < (cnt + 3) / 4; n++) {
  395   2          *((__packed DWORD *)pData) = RX_DATA;
  396   2          pData += 4;
  397   2        }
  398   1      
  399   1        USB_CTRL = 0;
  400   1      
  401   1        if (((EP_MSK_ISO >> EPNum) & 1) == 0) {   /* Non-Isochronous Endpoint */
  402   2          WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
  403   2          WrCmd(CMD_CLR_BUF);
  404   2        }
  405   1      
  406   1        return (cnt);
  407   1      }
  408          
  409          
  410          /*
  411           *  Write USB Endpoint Data
  412           *    Parameters:      EPNum: Endpoint Number
  413           *                       EPNum.0..3: Address
  414           *                       EPNum.7:    Dir
  415           *                     pData: Pointer to Data Buffer
  416           *                     cnt:   Number of bytes to write
  417           *    Return Value:    Number of bytes written
  418           */
  419          
  420          DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
  421   1        DWORD n;
  422   1      
  423   1        USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_WR_EN;
  424   1      
  425   1        TX_PLENGTH = cnt;
  426   1      
  427   1        for (n = 0; n < (cnt + 3) / 4; n++) {
  428   2          TX_DATA = *((__packed DWORD *)pData);
  429   2          pData += 4;
  430   2        }
  431   1      
  432   1        USB_CTRL = 0;
  433   1      
  434   1        WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
  435   1        WrCmd(CMD_VALID_BUF);
  436   1      
  437   1        return (cnt);
  438   1      }
  439          
  440          
  441          #if USB_DMA
               
               
               /* DMA Descriptor Memory Layout */
               const DWORD DDAdr[2] = { DD_NISO_ADR, DD_ISO_ADR };
               const DWORD DDSz [2] = { 16,          20         };
               
               
               /*
                *  Setup USB DMA Transfer for selected Endpoint
                *    Parameters:      EPNum: Endpoint Number
                *                     pDD: Pointer to DMA Descriptor
                *    Return Value:    TRUE - Success, FALSE - Error
                */
               
ARM COMPILER V2.53,  usbhw                                                                 05/09/06  14:20:49  PAGE 8   

               BOOL USB_DMA_Setup(DWORD EPNum, USB_DMA_DESCRIPTOR *pDD) {
                 DWORD num, ptr, nxt, iso, n;
               
                 iso = pDD->Cfg.Type.IsoEP;                /* Iso or Non-Iso Descriptor */
                 num = EPAdr(EPNum);                       /* Endpoint's Physical Address */
               
                 ptr = 0;                                  /* Current Descriptor */
                 nxt = udca[num];                          /* Initial Descriptor */
                 while (nxt) {                             /* Go through Descriptor List */
                   ptr = nxt;                              /* Current Descriptor */
                   if (!pDD->Cfg.Type.Link) {              /* Check for Linked Descriptors */
                     n = (ptr - DDAdr[iso]) / DDSz[iso];   /* Descriptor Index */
                     DDMemMap[iso] &= ~(1 << n);           /* Unmark Memory Usage */
                   }
                   nxt = *((DWORD *)ptr);                  /* Next Descriptor */
                 }
               
                 for (n = 0; n < 32; n++) {                /* Search for available Memory */
                   if ((DDMemMap[iso] & (1 << n)) == 0) {
                     break;                                /* Memory found */
                   }
                 }
                 if (n == 32) return (FALSE);              /* Memory not available */
               
                 DDMemMap[iso] |= 1 << n;                  /* Mark Memory Usage */
                 nxt = DDAdr[iso] + n * DDSz[iso];         /* Next Descriptor */
               
                 if (ptr && pDD->Cfg.Type.Link) {
                   *((DWORD *)(ptr + 0))  = nxt;           /* Link in new Descriptor */
                   *((DWORD *)(ptr + 4)) |= 0x00000004;    /* Next DD is Valid */
                 } else {
                   udca[num] = nxt;                        /* Save new Descriptor */
                   UDCA[num] = nxt;                        /* Update UDCA in USB */
                 }
               
                 /* Fill in DMA Descriptor */
                 *(((DWORD *)nxt)++) =  0;                 /* Next DD Pointer */
                 *(((DWORD *)nxt)++) =  pDD->Cfg.Type.ATLE |
                                      (pDD->Cfg.Type.IsoEP << 4) |
                                      (pDD->MaxSize <<  5) |
                                      (pDD->BufLen  << 16);
                 *(((DWORD *)nxt)++) =  pDD->BufAdr;
                 *(((DWORD *)nxt)++) =  pDD->Cfg.Type.LenPos << 8;
                 if (iso) {
                   *((DWORD *)nxt) =  pDD->InfoAdr;
                 }
               
                 return (TRUE); /* Success */
               }
               
               
               /*
                *  Enable USB DMA Endpoint
                *    Parameters:      EPNum: Endpoint Number
                *                       EPNum.0..3: Address
                *                       EPNum.7:    Dir
                *    Return Value:    None
                */
               
               void USB_DMA_Enable (DWORD EPNum) {
                 EP_DMA_EN = 1 << EPAdr(EPNum);
               }
               
               
               /*
                *  Disable USB DMA Endpoint
ARM COMPILER V2.53,  usbhw                                                                 05/09/06  14:20:49  PAGE 9   

                *    Parameters:      EPNum: Endpoint Number
                *                       EPNum.0..3: Address
                *                       EPNum.7:    Dir
                *    Return Value:    None
                */
               
               void USB_DMA_Disable (DWORD EPNum) {
                 EP_DMA_DIS = 1 << EPAdr(EPNum);
               }
               
               
               /*
                *  Get USB DMA Endpoint Status
                *    Parameters:      EPNum: Endpoint Number
                *                       EPNum.0..3: Address
                *                       EPNum.7:    Dir
                *    Return Value:    DMA Status
                */
               
               DWORD USB_DMA_Status (DWORD EPNum) {
                 DWORD ptr, val;
               
                 ptr = UDCA[EPAdr(EPNum)];                 /* Current Descriptor */
                 if (ptr == 0) return (USB_DMA_INVALID);
               
                 val = *((DWORD *)(ptr + 3*4));            /* Status Information */
                 switch ((val >> 1) & 0x0F) {
                   case 0x00:                              /* Not serviced */
                     return (USB_DMA_IDLE);
                   case 0x01:                              /* Being serviced */
                     return (USB_DMA_BUSY);
                   case 0x02:                              /* Normal Completition */
                     return (USB_DMA_DONE);
                   case 0x03:                              /* Data Under Run */
                     return (USB_DMA_UNDER_RUN);
                   case 0x08:                              /* Data Over Run */
                     return (USB_DMA_OVER_RUN);
                   case 0x09:                              /* System Error */
                     return (USB_DMA_ERROR);
                 }
               
                 return (USB_DMA_UNKNOWN);
               }
               
               
               /*
                *  Get USB DMA Endpoint Current Buffer Address
                *    Parameters:      EPNum: Endpoint Number
                *                       EPNum.0..3: Address
                *                       EPNum.7:    Dir
                *    Return Value:    DMA Address (or -1 when DMA is Invalid)
                */
               
               DWORD USB_DMA_BufAdr (DWORD EPNum) {
                 DWORD ptr, val;
               
                 ptr = UDCA[EPAdr(EPNum)];                 /* Current Descriptor */
                 if (ptr == 0) return (-1);                /* DMA Invalid */
               
                 val = *((DWORD *)(ptr + 2*4));            /* Buffer Address */
               
                 return (val);                             /* Current Address */
               }
               
               
               /*
ARM COMPILER V2.53,  usbhw                                                                 05/09/06  14:20:49  PAGE 10  

                *  Get USB DMA Endpoint Current Buffer Count
                *   Number of transfered Bytes or Iso Packets
                *    Parameters:      EPNum: Endpoint Number
                *                       EPNum.0..3: Address
                *                       EPNum.7:    Dir
                *    Return Value:    DMA Count (or -1 when DMA is Invalid)
                */
               

⌨️ 快捷键说明

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