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

📄 usbhw.lst

📁 USB存储器
💻 LST
📖 第 1 页 / 共 5 页
字号:
  297           *    Return Value:    None
  298           */
  299          
  300          void USB_DirCtrlEP (DWORD dir) {
  301   1        dir;  /* Not needed */
  302   1      }
  303          
  304          
  305          /*
  306           *  Enable USB Endpoint
  307           *    Parameters:      EPNum: Endpoint Number
  308           *                       EPNum.0..3: Address
  309           *                       EPNum.7:    Dir
  310           *    Return Value:    None
  311           */
  312          
  313          void USB_EnableEP (DWORD EPNum) {
  314   1        WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
  315   1      }
  316          
  317          
  318          /*
  319           *  Disable USB Endpoint
  320           *    Parameters:      EPNum: Endpoint Number
  321           *                       EPNum.0..3: Address
  322           *                       EPNum.7:    Dir
  323           *    Return Value:    None
ARM COMPILER V2.42b,  usbhw                                                                02/01/06  23:45:15  PAGE 6   

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

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

               
                 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
                *    Parameters:      EPNum: Endpoint Number
                *                       EPNum.0..3: Address
                *                       EPNum.7:    Dir
                *    Return Value:    None
                */
ARM COMPILER V2.42b,  usbhw                                                                02/01/06  23:45:15  PAGE 9   

               
               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 */
               }
               
               
               /*
                *  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
ARM COMPILER V2.42b,  usbhw                                                                02/01/06  23:45:15  PAGE 10  

                *    Return Value:    DMA Count (or -1 when DMA is Invalid)
                */
               
               DWORD USB_DMA_BufCnt (DWORD EPNum) {
                 DWORD ptr, val;
               
                 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 */

⌨️ 快捷键说明

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