亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ctrlrequest.c

?? 增強型51單片機fs7821sd卡、mmc卡讀寫程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
**********************************************************************************************
* Project:	TK7821
* File:		CtrlRequest.c
* Contents: 
*           
*
* $Date: 02/25/05    Jason    v0.1
*        05/12/05    Mingo    v0.2   www.fameg.com
*
* Copyright (c) 2005 Fameg, Inc. All rights reserved
***********************************************************************************************
*/

#include <reg51.h>
#include <stdio.h>
#include <string.h>
#include "sotatype.h"
#include "usbdisk.h"
#include "device.h"
#include "CtrlRequest.h"
#include "ScsiCmd.h"

void InitBulkPipe();

/*************************************************
   Global Variables
*************************************************/
BYTE xdata UsbBuf[USB_BUFFER_SIZE];
xdata PSOTA_USB_REQUEST pSotaUsbRequest;
xdata BYTE CtrlPktSize;

/*************************************************
   Local Variables
*************************************************/
static xdata SOTA_USB_REQUEST SotaUsbRequest;
static xdata BYTE UsbAddr = 0;
static xdata BYTE TestModeParam;

/* H/W b1 only support ep0~2 so we add this variable to pass chapter9 */
static bit EP3Halt = 0;

//----------------------------------------------------------------------------
// EP Index to Register Offset 
//  Note: Return value 0xff = Invalid EP Index
//                     0x00 = EP0 
//----------------------------------------------------------------------------
BYTE CtrlEPIndex2RegOffset(BYTE Index)
{
  BYTE Offset = 0xff;
    
  if ( (Index == 0) || (Index==0x80) )
    Offset = 0;  
  switch(Index)  
  {
    case EP1IN_NUMBER:
         Offset = EP1_TXCSR;
         break;	
 
    case EP2OUT_NUMBER:
         Offset = EP2_RXCSR;  
         break;   
 
    default:
         break;  
  }    
  return Offset;       
}  

//----------------------------------------------------------------------------
// Clear Halt Feature
//----------------------------------------------------------------------------
void CtrlClearHaltFeature()
{
  // EP0
  pSotaUsbRequest->HaltStatus = false;  
  // EP1
  ClearRegBit(USB_BASE + EP1_TXCSR, ~EN_TX1_STL);
  // EP2
  ClearRegBit(USB_BASE + EP2_RXCSR, BulkStallMask);
}  

//----------------------------------------------------------------------------
// Prepare status report data
//   Note: Unexpected condition, return false
//----------------------------------------------------------------------------
bool CtrlStatusReport(BYTE Recipient, BYTE Index, PBYTE Data)
{
  bit Rc = true;
  Data[1] = 0; // Reserved  
  
  switch(Recipient)
  {
    case 0x80:    // Device
    case 0x81:    // Interface
         Data[0] = 0;
         break;
         
    case 0x82:    // Endpoint
         {
           BYTE Offset = CtrlEPIndex2RegOffset(Index); 
           Data[0] = 0;
           
           if (Offset != 0xff)
           {
             if (Offset)
             {
               if (CSRRead(USB_BASE + Offset) &  0x02) 
                 Data[0] = 0x01;
             } 
             else
             { 
               if (pSotaUsbRequest->HaltStatus)
                 Data[0] = 0x01; 
             }    
           }
           break;
        }   
         
    default:
         Rc = false;
         break;          
  }  

  return Rc; 
}  

//----------------------------------------------------------------------------
// Get Status Request 
//----------------------------------------------------------------------------
void CtrlReqGetStatus()
{
  BYTE Token = pSotaUsbRequest->Token;
      
  switch(Token)
  {
    case SETUP_TOKEN:
         pSotaUsbRequest->LoadInDataOk = true;
         CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
         break;

    case IN_TOKEN:
         {
           PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
           BYTE i;
           BYTE Len = (BYTE)(pReq->wLength);
           BYTE Data[2];
           BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];

           BYTE Recipient = pReq->bmRequestType;
           
           if (pSotaUsbRequest->LoadInDataOk)
           {
             if (Len > 2)
               Len = 2;
             if (!CtrlStatusReport(Recipient, Index, Data))  
               Len = 0;                  
             CSRWrite(USB_BASE + EP0_TXCNT, Len);
             for (i = 0; i < Len; i++)
               CSRWrite(USB_BASE + EP0_TXDATA, Data[i]);
             CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
             pSotaUsbRequest->LoadInDataOk = false;
           }  
           CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
           break;   
         }

    case IN_OK_TOKEN:
         CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
         CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
         break;

    case OUT_TOKEN:
    default:
         // Ctrl Read End
         pSotaUsbRequest->InProgress = false;
         break;          
  }  
}

//--------------------------------------------------------------------
// Clear Feature Request
//--------------------------------------------------------------------
static bit FeatureCleared = 0;

void ClrFeatureEP()
{
    PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
    BYTE RegValue;
    BYTE wValue = (BYTE)ConvertEndian16(pReq->wValue);
    bit ReqAccept = true;
    bit ClrEP0 = false;
    bit ClrEP1 = false;
    bit ClrEP2 = false;
                                            
    if(wValue == ENDPOINT_HALT)
    {
        if((pReq->bmRequestType == 0x00)|| // Recipient = Device
           (pReq->bmRequestType == 0x01) ) // Recipient = Interface
        {
            RegValue = CSRRead(USB_BASE + EP0_RXCSR);
            if(RegValue & EN_RX0_STL)
                ClrEP0 = true;

            RegValue = CSRRead(USB_BASE + EP0_TXCSR);
            if(RegValue & EN_TX0_STL)
                ClrEP0 = true;

            RegValue = CSRRead(USB_BASE + EP1_TXCSR);
            if(RegValue & EN_TX1_STL)
                ClrEP1 = true;

            RegValue = CSRRead(USB_BASE + EP2_RXCSR);
            if(RegValue & EN_RX2_STL)
                ClrEP2 = true;
        }
        else if(pReq->bmRequestType == 0x02) // Recipient = EndPoint
        {
            BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];

            if((Index == 0)||(Index == 0x80)) // Clear EP0
                ClrEP0 = true;

            else if(Index == EP1IN_NUMBER)
                ClrEP1 = true;

            else if(Index == EP2OUT_NUMBER)
                ClrEP2 = true;

            else
                ReqAccept = false;
        }
        else
            ReqAccept = false;

        // Clear Endpoint Toggle Feature 
        RegValue = CSRRead(USB_BASE + EPCTL);
        if(ClrEP0)  RegValue |= CLR_EP0_TOG;
        if(ClrEP1)  RegValue |= CLR_EP1_TOG;
        if(ClrEP2)  RegValue |= CLR_EP2_TOG;
        CSRWrite(USB_BASE + EPCTL, RegValue);

        if(ClrEP0)
        {
            pSotaUsbRequest->HaltStatus = false;

            RegValue = CSRRead(USB_BASE + EP0_RXCSR); 
            RegValue &= ~EN_RX0_STL; 
            CSRWrite(USB_BASE + EP0_RXCSR, RegValue);

            RegValue = CSRRead(USB_BASE + EP0_TXCSR); 
            RegValue &= ~EN_TX0_STL; 
            CSRWrite(USB_BASE + EP0_TXCSR, RegValue);
        }

        if(ClrEP1 | ClrEP2)
        {
            RegValue = CSRRead(USB_BASE + EP1_TXCSR);
            RegValue &= ~EN_TX1_STL;
            CSRWrite(USB_BASE + EP1_TXCSR, RegValue);

            RegValue = CSRRead(USB_BASE + EP2_RXCSR);
            RegValue &= ~(EN_RX2_STL | EN_RX2);
            CSRWrite(USB_BASE + EP2_RXCSR, RegValue);
        }

        FeatureCleared = 1;
    }
    
    if(ReqAccept)
    {
        CSRWrite(USB_BASE + EP0_TXCNT, 0);
        CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);
    }
    else
        CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);
}

void BulkReportHandle();

void CtrlReqClearFeature()
{
    BYTE Token = pSotaUsbRequest->Token;
    
    switch(Token)
    {
        case SETUP_TOKEN:
            FeatureCleared = 0;
            CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);
            break;
                  
        case IN_TOKEN:
            ClrFeatureEP();
            break;
        
        case OUT_TOKEN:
        case IN_OK_TOKEN:
        default:
            pSotaUsbRequest->InProgress = false;
            if(FeatureCleared)
            {
                if(ScsiCmdSTALLed)
                {
                    BulkReportHandle();
                    ScsiCmdSTALLed = false;
                }
            }
            break;
    }
}

//----------------------------------------------------------------------------
// Set USB Test Mode.
//----------------------------------------------------------------------------
void CtrlSetTestMode(BYTE TestItem)
{
  BYTE TestModeReg;

  if ((((UINT32)HwId() << 16) | HwVersion()) >= 0x60340100)
    TestModeReg = USB_TEST_MODE1;
  else
    TestModeReg = USB_TEST_MODE0;

  switch (TestItem)
  {
     case TEST_J:
          CSRWrite(USB_BASE + TestModeReg, SET_TM_J);
          break; 
                     
     case TEST_K:
          CSRWrite(USB_BASE + TestModeReg, SET_TM_K);
          break; 
                     
     case TEST_SE0_NAK:
          CSRWrite(USB_BASE + TestModeReg, SET_TM_SE0_NAK);
          break; 
                     
     case TEST_PACKET:
          while (true)
          {
            BYTE i;

            CSRWrite(USB_BASE + TestModeReg, SET_TM_PKT);
            for (i = 0; i < 120; i++); // Delay about 111us under 11MHz
            CSRWrite(USB_BASE + TestModeReg, 0);
          }
          break; 
                     
     case TEST_FORCE_ENABLE:
          // Not Support.                     
     default:
          TestModeParam = NO_TEST_PARAM;       
          break;
  }  	
}		

//----------------------------------------------------------------------------
// Check USB Test Mode Parameters.
//----------------------------------------------------------------------------
bool CtrlChkTestMode(PUSB_REQUEST pReq, PBYTE Param)
{
  bit Rc = false;
  	
  if (pReq->bmRequestType == 0)
  {
    if (((TDataCast *)&(pReq->wIndex))->ucByte[0] == 0)
    {
      if (pReq->wLength == 0)
      {
        *Param = (BYTE)(pReq->wIndex);
        Rc = true;		
      }  
    }  
  }  	
               
  return Rc;           
}

//----------------------------------------------------------------------------
// Set Feature Request,Only Support EP0 ~ EP3. 
//----------------------------------------------------------------------------
void CtrlReqSetFeature()
{
  BYTE Token = pSotaUsbRequest->Token;
    
  switch(Token)
  {
    case SETUP_TOKEN:
           CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0_STL);    
           TestModeParam = NO_TEST_PARAM;
           break;
                  
    case IN_TOKEN:
         {
           PUSB_REQUEST pReq = &(pSotaUsbRequest->Request);
           bit ReqAccept = false;
           BYTE Value = (BYTE)ConvertEndian16(pReq->wValue);
                                            
           if (ENDPOINT_HALT == Value)
           {
             if (pReq->bmRequestType == 0x02)
             {
               BYTE Index = ((TDataCast *)&(pReq->wIndex))->ucByte[0];
               BYTE Offset = CtrlEPIndex2RegOffset(Index);
                              
               if (Offset == 0xff)               
                 ReqAccept = false;    
               else
               {
               	 ReqAccept = true;
                 if (Offset)
                   CSRWrite(USB_BASE + Offset, 0x02);
                 else                                 // Set EP0                
                   pSotaUsbRequest->HaltStatus = true;                              
               }   
             }
           }
           if (TEST_MODE == Value)
             ReqAccept = CtrlChkTestMode(pReq, &TestModeParam);
                      	
           if (DEVICE_REMOTE_WAKEUP == Value) 
           {
             // Not Support Yet!
             ReqAccept = true;		
           }	
           
           if (ReqAccept)
           {
             CSRWrite(USB_BASE + EP0_TXCNT, 0);
             CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0);    
           }  
           else
             CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL);    
           break;
         }  
 
    case IN_OK_TOKEN:
         CSRWrite(USB_BASE + EP0_RXCSR, EN_RX0);    
         CSRWrite(USB_BASE + EP0_TXCSR, EN_TX0_STL); 
       

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性欧美巨大黑白大战| 久久伊人蜜桃av一区二区| 日韩亚洲欧美一区二区三区| 久久中文字幕电影| 午夜精品一区在线观看| 成人手机在线视频| 欧美va亚洲va国产综合| 午夜婷婷国产麻豆精品| 99久久久久免费精品国产| 欧美xxxxxxxx| 免费人成网站在线观看欧美高清| 99久久国产免费看| 国产亚洲精久久久久久| 另类成人小视频在线| 欧美老年两性高潮| 伊人性伊人情综合网| 99国产精品久久| 国产蜜臀97一区二区三区| 经典三级一区二区| 欧美www视频| 老司机精品视频导航| 91麻豆精品国产91久久久更新时间| 亚洲欧美经典视频| 91看片淫黄大片一级| 国产精品久久午夜夜伦鲁鲁| 国产成人亚洲精品青草天美| 久久你懂得1024| 国产精品亚洲专一区二区三区| 91麻豆精品国产自产在线观看一区| 亚洲成av人片一区二区三区| 欧美日韩在线播放一区| 一区二区三区欧美亚洲| 在线视频一区二区三| 亚洲视频 欧洲视频| 91免费国产视频网站| 亚洲一区二区三区视频在线播放| 日本韩国欧美国产| 一区二区三区中文免费| 在线观看区一区二| 亚洲一区二区三区不卡国产欧美| 欧美午夜精品理论片a级按摩| 亚洲一卡二卡三卡四卡| 欧美人牲a欧美精品| 蜜臀av性久久久久av蜜臀妖精| 精品嫩草影院久久| 国产精品一区免费视频| 国产精品女同一区二区三区| 色综合视频一区二区三区高清| 亚洲一级电影视频| 日韩女同互慰一区二区| 国产成人午夜精品影院观看视频 | 一区二区三区在线看| 色婷婷综合中文久久一本| 亚洲国产日韩一级| 精品国产一区二区在线观看| 不卡的av在线播放| 亚洲愉拍自拍另类高清精品| 日韩一级高清毛片| 成人午夜在线免费| 亚洲国产综合视频在线观看| 欧美一区二区三区喷汁尤物| 国产高清亚洲一区| 一区二区三区影院| 日韩欧美一卡二卡| av网站一区二区三区| 日韩成人免费看| 国产精品久久久久三级| 91精品婷婷国产综合久久竹菊| 国产一区二区在线观看视频| 亚洲美女免费在线| 日韩亚洲欧美中文三级| 91亚洲精品久久久蜜桃| 另类小说综合欧美亚洲| 亚洲欧美日韩在线| 久久综合久久综合久久综合| 欧美三日本三级三级在线播放| 国产成人精品影院| 日韩影院免费视频| 亚洲激情综合网| 亚洲国产高清不卡| 日韩午夜小视频| 欧美性受xxxx黑人xyx性爽| 国产激情一区二区三区四区| 水野朝阳av一区二区三区| 亚洲欧美日韩国产综合| 久久久久亚洲综合| 日韩一区二区精品在线观看| 91丨porny丨国产| 国产在线精品国自产拍免费| 婷婷久久综合九色综合绿巨人| 国产精品国模大尺度视频| 日韩久久精品一区| 欧美日韩精品电影| 在线观看免费成人| 色综合天天综合狠狠| 成人精品一区二区三区四区| 九一九一国产精品| 蜜桃一区二区三区在线观看| 天天亚洲美女在线视频| 一级特黄大欧美久久久| 亚洲人成7777| 亚洲美女淫视频| 亚洲美女免费视频| 亚洲精品一卡二卡| 亚洲免费在线观看视频| 亚洲日本电影在线| 国产精品福利一区二区| 成人免费一区二区三区在线观看| 久久久久国产精品麻豆ai换脸| 精品久久人人做人人爽| 精品国产区一区| 精品日韩一区二区三区免费视频| 日韩欧美激情一区| 日韩欧美国产麻豆| 日韩欧美一区中文| 久久综合av免费| 日本一区二区免费在线| 欧美经典一区二区| 国产精品久久久久久久浪潮网站| 日本一区二区三区四区| 国产精品麻豆欧美日韩ww| 国产精品毛片大码女人| 中文字幕一区二区三区在线观看| 综合av第一页| 亚洲综合色区另类av| 午夜国产精品影院在线观看| 日本视频中文字幕一区二区三区| 久久国产免费看| 国产69精品久久久久777| www.欧美精品一二区| 色婷婷激情久久| 欧美日韩国产精品成人| 欧美大片在线观看一区二区| 久久综合久久99| 国产精品污网站| 亚洲无线码一区二区三区| 奇米四色…亚洲| 懂色中文一区二区在线播放| 色先锋资源久久综合| 91精品国产综合久久久久久久久久 | 国产精品国产三级国产普通话三级| 国产精品第13页| 亚洲高清一区二区三区| 经典三级视频一区| 色视频欧美一区二区三区| 91精品国模一区二区三区| 国产片一区二区三区| 亚洲一本大道在线| 激情伊人五月天久久综合| 99久久精品国产毛片| 欧美一区二区三区在线观看视频| 欧美韩国日本综合| 天堂蜜桃91精品| 成人aa视频在线观看| 欧美日本国产视频| 国产精品传媒入口麻豆| 青青青伊人色综合久久| 91小视频在线观看| 精品国精品自拍自在线| 亚洲黄色录像片| 国产揄拍国内精品对白| 欧美日韩一区视频| 亚洲国产成人在线| 久久99热这里只有精品| 91久久一区二区| 日本一区二区三区国色天香 | 91精品国产乱| 亚洲视频一区二区在线观看| 极品少妇xxxx精品少妇偷拍| 欧美三级韩国三级日本一级| 欧美国产一区二区| 麻豆久久久久久| 欧美亚洲综合网| 亚洲欧洲中文日韩久久av乱码| 激情综合网av| 日韩女优av电影| 午夜不卡av在线| 色综合av在线| 亚洲人成在线播放网站岛国| 国产成人精品免费在线| 欧美tickling网站挠脚心| 午夜精品久久久久| 欧美最猛性xxxxx直播| 中文字幕一区二区三区精华液 | 精品一区二区三区在线播放视频 | 99久久精品免费| 欧美国产综合色视频| 国产成人99久久亚洲综合精品| 日韩久久免费av| 精品中文字幕一区二区小辣椒| 欧美一卡2卡3卡4卡| 亚洲一区中文在线| 色就色 综合激情| 亚洲最新视频在线观看| 99精品偷自拍| 亚洲一区在线看| 欧美酷刑日本凌虐凌虐| 日本亚洲天堂网| 日韩精品专区在线| 国产美女一区二区|