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

📄 ctrlrequest.lst

📁 增强型51单片机fs7821sd卡、mmc卡读写程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE CTRLREQUEST
OBJECT MODULE PLACED IN .\Output\CtrlRequest.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CtrlRequest.c OPTIMIZE(9,SPEED) BROWSE INCDIR(Include) DEFINE(READER) DEBUG
                    - OBJECTEXTEND PRINT(.\Output\CtrlRequest.lst) OBJECT(.\Output\CtrlRequest.obj)

stmt level    source

   1          /*
   2          **********************************************************************************************
   3          * Project:      TK7821
   4          * File:         CtrlRequest.c
   5          * Contents: 
   6          *           
   7          *
   8          * $Date: 02/25/05    Jason    v0.1
   9          *        05/12/05    Mingo    v0.2   www.fameg.com
  10          *
  11          * Copyright (c) 2005 Fameg, Inc. All rights reserved
  12          ***********************************************************************************************
  13          */
  14          
  15          #include <reg51.h>
  16          #include <stdio.h>
  17          #include <string.h>
  18          #include "sotatype.h"
  19          #include "usbdisk.h"
  20          #include "device.h"
  21          #include "CtrlRequest.h"
  22          #include "ScsiCmd.h"
  23          
  24          void InitBulkPipe();
  25          
  26          /*************************************************
  27             Global Variables
  28          *************************************************/
  29          BYTE xdata UsbBuf[USB_BUFFER_SIZE];
  30          xdata PSOTA_USB_REQUEST pSotaUsbRequest;
  31          xdata BYTE CtrlPktSize;
  32          
  33          /*************************************************
  34             Local Variables
  35          *************************************************/
  36          static xdata SOTA_USB_REQUEST SotaUsbRequest;
  37          static xdata BYTE UsbAddr = 0;
  38          static xdata BYTE TestModeParam;
  39          
  40          /* H/W b1 only support ep0~2 so we add this variable to pass chapter9 */
  41          static bit EP3Halt = 0;
  42          
  43          //----------------------------------------------------------------------------
  44          // EP Index to Register Offset 
  45          //  Note: Return value 0xff = Invalid EP Index
  46          //                     0x00 = EP0 
  47          //----------------------------------------------------------------------------
  48          BYTE CtrlEPIndex2RegOffset(BYTE Index)
  49          {
  50   1        BYTE Offset = 0xff;
  51   1          
  52   1        if ( (Index == 0) || (Index==0x80) )
  53   1          Offset = 0;  
  54   1        switch(Index)  
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 2   

  55   1        {
  56   2          case EP1IN_NUMBER:
  57   2               Offset = EP1_TXCSR;
  58   2               break; 
  59   2       
  60   2          case EP2OUT_NUMBER:
  61   2               Offset = EP2_RXCSR;  
  62   2               break;   
  63   2       
  64   2          default:
  65   2               break;  
  66   2        }    
  67   1        return Offset;       
  68   1      }  
  69          
  70          //----------------------------------------------------------------------------
  71          // Clear Halt Feature
  72          //----------------------------------------------------------------------------
  73          void CtrlClearHaltFeature()
  74          {
  75   1        // EP0
  76   1        pSotaUsbRequest->HaltStatus = false;  
  77   1        // EP1
  78   1        ClearRegBit(USB_BASE + EP1_TXCSR, ~EN_TX1_STL);
  79   1        // EP2
  80   1        ClearRegBit(USB_BASE + EP2_RXCSR, BulkStallMask);
  81   1      }  
  82          
  83          //----------------------------------------------------------------------------
  84          // Prepare status report data
  85          //   Note: Unexpected condition, return false
  86          //----------------------------------------------------------------------------
  87          bool CtrlStatusReport(BYTE Recipient, BYTE Index, PBYTE Data)
  88          {
  89   1        bit Rc = true;
  90   1        Data[1] = 0; // Reserved  
  91   1        
  92   1        switch(Recipient)
  93   1        {
  94   2          case 0x80:    // Device
  95   2          case 0x81:    // Interface
  96   2               Data[0] = 0;
  97   2               break;
  98   2               
  99   2          case 0x82:    // Endpoint
 100   2               {
 101   3                 BYTE Offset = CtrlEPIndex2RegOffset(Index); 
 102   3                 Data[0] = 0;
 103   3                 
 104   3                 if (Offset != 0xff)
 105   3                 {
 106   4                   if (Offset)
 107   4                   {
 108   5                     if (CSRRead(USB_BASE + Offset) &  0x02) 
 109   5                       Data[0] = 0x01;
 110   5                   } 
 111   4                   else
 112   4                   { 
 113   5                     if (pSotaUsbRequest->HaltStatus)
 114   5                       Data[0] = 0x01; 
 115   5                   }    
 116   4                 }
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 3   

 117   3                 break;
 118   3              }   
 119   2               
 120   2          default:
 121   2               Rc = false;
 122   2               break;          
 123   2        }  
 124   1      
 125   1        return Rc; 
 126   1      }  
 127          
 128          //----------------------------------------------------------------------------
 129          // Get Status Request 
 130          //----------------------------------------------------------------------------
 131          void CtrlReqGetStatus()
 132          {
 133   1        BYTE Token = pSotaUsbRequest->Token;
 134   1            
 135   1        switch(Token)
 136   1        {
 137   2          case SETUP_TOKEN:
 138   2               pSotaUsbRequest->LoadInDataOk = true;
 139   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
 140   2               break;
 141   2      
 142   2          case IN_TOKEN:
 143   2               {
 144   3                 PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
 145   3                 BYTE i;
 146   3                 BYTE Len = (BYTE)(pReq->wLength);
 147   3                 BYTE Data[2];
 148   3                 BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
 149   3      
 150   3                 BYTE Recipient = pReq->bmRequestType;
 151   3                 
 152   3                 if (pSotaUsbRequest->LoadInDataOk)
 153   3                 {
 154   4                   if (Len > 2)
 155   4                     Len = 2;
 156   4                   if (!CtrlStatusReport(Recipient, Index, Data))  
 157   4                     Len = 0;                  
 158   4                   CSRWrite(USB_BASE + EP0_TXCNT, Len);
 159   4                   for (i = 0; i < Len; i++)
 160   4                     CSRWrite(USB_BASE + EP0_TXDATA, Data[i]);
 161   4                   CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
 162   4                   pSotaUsbRequest->LoadInDataOk = false;
 163   4                 }  
 164   3                 CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 165   3                 break;   
 166   3               }
 167   2      
 168   2          case IN_OK_TOKEN:
 169   2               CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
 170   2               CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
 171   2               break;
 172   2      
 173   2          case OUT_TOKEN:
 174   2          default:
 175   2               // Ctrl Read End
 176   2               pSotaUsbRequest->InProgress = false;
 177   2               break;          
 178   2        }  
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 4   

 179   1      }
 180          
 181          //--------------------------------------------------------------------
 182          // Clear Feature Request
 183          //--------------------------------------------------------------------
 184          static bit FeatureCleared = 0;
 185          
 186          void ClrFeatureEP()
 187          {
 188   1          PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
 189   1          BYTE RegValue;
 190   1          BYTE wValue = (BYTE)ConvertEndian16(pReq->wValue);
 191   1          bit ReqAccept = true;
 192   1          bit ClrEP0 = false;
 193   1          bit ClrEP1 = false;
 194   1          bit ClrEP2 = false;
 195   1                                                  
 196   1          if(wValue == ENDPOINT_HALT)
 197   1          {
 198   2              if((pReq->bmRequestType == 0x00)|| // Recipient = Device
 199   2                 (pReq->bmRequestType == 0x01) ) // Recipient = Interface
 200   2              {
 201   3                  RegValue = CSRRead(USB_BASE + EP0_RXCSR);
 202   3                  if(RegValue & EN_RX0_STL)
 203   3                      ClrEP0 = true;
 204   3      
 205   3                  RegValue = CSRRead(USB_BASE + EP0_TXCSR);
 206   3                  if(RegValue & EN_TX0_STL)
 207   3                      ClrEP0 = true;
 208   3      
 209   3                  RegValue = CSRRead(USB_BASE + EP1_TXCSR);
 210   3                  if(RegValue & EN_TX1_STL)
 211   3                      ClrEP1 = true;
 212   3      
 213   3                  RegValue = CSRRead(USB_BASE + EP2_RXCSR);
 214   3                  if(RegValue & EN_RX2_STL)
 215   3                      ClrEP2 = true;
 216   3              }
 217   2              else if(pReq->bmRequestType == 0x02) // Recipient = EndPoint
 218   2              {
 219   3                  BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
 220   3      
 221   3                  if((Index == 0)||(Index == 0x80)) // Clear EP0
 222   3                      ClrEP0 = true;
 223   3      
 224   3                  else if(Index == EP1IN_NUMBER)
 225   3                      ClrEP1 = true;
 226   3      
 227   3                  else if(Index == EP2OUT_NUMBER)
 228   3                      ClrEP2 = true;
 229   3      
 230   3                  else
 231   3                      ReqAccept = false;
 232   3              }
 233   2              else
 234   2                  ReqAccept = false;
 235   2      
 236   2              // Clear Endpoint Toggle Feature 
 237   2              RegValue = CSRRead(USB_BASE + EPCTL);
 238   2              if(ClrEP0)  RegValue |= CLR_EP0_TOG;
 239   2              if(ClrEP1)  RegValue |= CLR_EP1_TOG;
 240   2              if(ClrEP2)  RegValue |= CLR_EP2_TOG;
C51 COMPILER V7.02b   CTRLREQUEST                                                          02/01/2007 10:35:43 PAGE 5   

 241   2              CSRWrite(USB_BASE + EPCTL, RegValue);
 242   2      
 243   2              if(ClrEP0)
 244   2              {
 245   3                  pSotaUsbRequest->HaltStatus = false;
 246   3      
 247   3                  RegValue = CSRRead(USB_BASE + EP0_RXCSR); 
 248   3                  RegValue &= ~EN_RX0_STL; 
 249   3                  CSRWrite(USB_BASE + EP0_RXCSR, RegValue);
 250   3      
 251   3                  RegValue = CSRRead(USB_BASE + EP0_TXCSR); 
 252   3                  RegValue &= ~EN_TX0_STL; 
 253   3                  CSRWrite(USB_BASE + EP0_TXCSR, RegValue);
 254   3              }
 255   2      
 256   2              if(ClrEP1 | ClrEP2)
 257   2              {
 258   3                  RegValue = CSRRead(USB_BASE + EP1_TXCSR);
 259   3                  RegValue &= ~EN_TX1_STL;
 260   3                  CSRWrite(USB_BASE + EP1_TXCSR, RegValue);
 261   3      
 262   3                  RegValue = CSRRead(USB_BASE + EP2_RXCSR);
 263   3                  RegValue &= ~(EN_RX2_STL | EN_RX2);
 264   3                  CSRWrite(USB_BASE + EP2_RXCSR, RegValue);
 265   3              }
 266   2      
 267   2              FeatureCleared = 1;
 268   2          }
 269   1          
 270   1          if(ReqAccept)
 271   1          {
 272   2              CSRWrite(USB_BASE + EP0_TXCNT, 0);
 273   2              CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
 274   2          }
 275   1          else
 276   1              CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
 277   1      }
 278          
 279          void BulkReportHandle();
 280          
 281          void CtrlReqClearFeature()
 282          {
 283   1          BYTE Token = pSotaUsbRequest->Token;
 284   1          
 285   1          switch(Token)
 286   1          {
 287   2              case SETUP_TOKEN:
 288   2                  FeatureCleared = 0;
 289   2                  CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
 290   2                  break;
 291   2                        
 292   2              case IN_TOKEN:
 293   2                  ClrFeatureEP();

⌨️ 快捷键说明

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