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

📄 usbhw.lst

📁 将LPC2148通过自带的USB口配置为USB存储设备.
💻 LST
📖 第 1 页 / 共 5 页
字号:
  297          
  298          
  299          /*
  300           *  Enable USB Endpoint
  301           *    Parameters:      EPNum: Endpoint Number
  302           *                       EPNum.0..3: Address
  303           *                       EPNum.7:    Dir
  304           *    Return Value:    None
  305           */
  306          
  307          void USB_EnableEP (DWORD EPNum) {
  308   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  309   1      }
  310          
  311          
  312          /*
  313           *  Disable USB Endpoint
  314           *    Parameters:      EPNum: Endpoint Number
  315           *                       EPNum.0..3: Address
  316           *                       EPNum.7:    Dir
  317           *    Return Value:    None
  318           */
  319          
  320          void USB_DisableEP (DWORD EPNum) {
  321   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_DA));
  322   1      }
  323          
ARM COMPILER V2.50a,  usbhw                                                                04/04/06  11:13:56  PAGE 6   

  324          
  325          /*
  326           *  Reset USB Endpoint
  327           *    Parameters:      EPNum: Endpoint Number
  328           *                       EPNum.0..3: Address
  329           *                       EPNum.7:    Dir
  330           *    Return Value:    None
  331           */
  332          
  333          void USB_ResetEP (DWORD EPNum) {
  334   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  335   1      }
  336          
  337          
  338          /*
  339           *  Set Stall for USB Endpoint
  340           *    Parameters:      EPNum: Endpoint Number
  341           *                       EPNum.0..3: Address
  342           *                       EPNum.7:    Dir
  343           *    Return Value:    None
  344           */
  345          
  346          void USB_SetStallEP (DWORD EPNum) {
  347   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_ST));
  348   1      }
  349          
  350          
  351          /*
  352           *  Clear Stall for USB Endpoint
  353           *    Parameters:      EPNum: Endpoint Number
  354           *                       EPNum.0..3: Address
  355           *                       EPNum.7:    Dir
  356           *    Return Value:    None
  357           */
  358          
  359          void USB_ClrStallEP (DWORD EPNum) {
  360   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  361   1      }
  362          
  363          
  364          /*
  365           *  Read USB Endpoint Data
  366           *    Parameters:      EPNum: Endpoint Number
  367           *                       EPNum.0..3: Address
  368           *                       EPNum.7:    Dir
  369           *                     pData: Pointer to Data Buffer
  370           *    Return Value:    Number of bytes read
  371           */
  372          
  373          DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
  374   1        DWORD cnt, n;
  375   1      
  376   1        USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_RD_EN;
  377   1      
  378   1        do {
  379   2          cnt = RX_PLENGTH;
  380   2        } while ((cnt & PKT_RDY) == 0);
  381   1        cnt &= PKT_LNGTH_MASK;
  382   1      
  383   1        for (n = 0; n < (cnt + 3) / 4; n++) {
  384   2          *((__packed DWORD *)pData) = RX_DATA;
  385   2          pData += 4;
  386   2        }
  387   1      
  388   1        USB_CTRL = 0;
  389   1      
ARM COMPILER V2.50a,  usbhw                                                                04/04/06  11:13:56  PAGE 7   

  390   1        if (((EP_MSK_ISO >> EPNum) & 1) == 0) {   /* Non-Isochronous Endpoint */
  391   2          WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
  392   2          WrCmd(CMD_CLR_BUF);
  393   2        }
  394   1      
  395   1        return (cnt);
  396   1      }
  397          
  398          
  399          /*
  400           *  Write USB Endpoint Data
  401           *    Parameters:      EPNum: Endpoint Number
  402           *                       EPNum.0..3: Address
  403           *                       EPNum.7:    Dir
  404           *                     pData: Pointer to Data Buffer
  405           *                     cnt:   Number of bytes to write
  406           *    Return Value:    Number of bytes written
  407           */
  408          
  409          DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
  410   1        DWORD n;
  411   1      
  412   1        USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_WR_EN;
  413   1      
  414   1        TX_PLENGTH = cnt;
  415   1      
  416   1        for (n = 0; n < (cnt + 3) / 4; n++) {
  417   2          TX_DATA = *((__packed DWORD *)pData);
  418   2          pData += 4;
  419   2        }
  420   1      
  421   1        USB_CTRL = 0;
  422   1      
  423   1        WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
  424   1        WrCmd(CMD_VALID_BUF);
  425   1      
  426   1        return (cnt);
  427   1      }
  428          
  429          
  430          #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
                */
               
               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 */
ARM COMPILER V2.50a,  usbhw                                                                04/04/06  11:13:56  PAGE 8   

                     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
                *    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);
               }
               
               
ARM COMPILER V2.50a,  usbhw                                                                04/04/06  11:13:56  PAGE 9   

               /*
                *  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 */
               }
               
               
               /*
                *  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)
                */
               
               DWORD USB_DMA_BufCnt (DWORD EPNum) {
                 DWORD ptr, val;
               
ARM COMPILER V2.50a,  usbhw                                                                04/04/06  11:13:56  PAGE 10  

                 ptr = UDCA[EPAdr(EPNum)];                 /* Current Descriptor */
                 if (ptr == 0) return (-1);                /* DMA Invalid */
               
                 val = *((DWORD *)(ptr + 3*4));            /* Status Information */
               
                 return (val >> 16);                       /* Current Count */
               }
               
               
               #endif /* USB_DMA */
  598          
  599          

⌨️ 快捷键说明

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