亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲精品一二三区| 激情伊人五月天久久综合| 亚洲18色成人| 国产精品一区专区| 欧美日韩日本视频| 国产精品不卡在线观看| 国产麻豆精品在线| 欧美一区永久视频免费观看| 亚洲精品少妇30p| 成人自拍视频在线观看| 日韩欧美国产午夜精品| 一区二区国产视频| 97久久精品人人做人人爽50路| 日韩女优av电影| 日韩专区中文字幕一区二区| 国产精品一区久久久久| 欧美视频在线一区二区三区 | 久久久久久久网| 日韩不卡在线观看日韩不卡视频| 色狠狠综合天天综合综合| 亚洲国产高清在线| 久久99久久久久久久久久久| 欧美精品日韩一区| 午夜精品aaa| 欧美性高清videossexo| 亚洲人成7777| 色综合色狠狠天天综合色| 国产精品黄色在线观看| 成人夜色视频网站在线观看| 国产片一区二区三区| 国产精品99久久久久久似苏梦涵| 日韩精品自拍偷拍| 久久国产尿小便嘘嘘尿| 精品国产露脸精彩对白| 石原莉奈一区二区三区在线观看| 欧美图片一区二区三区| 亚洲愉拍自拍另类高清精品| 欧美亚日韩国产aⅴ精品中极品| 亚洲精品视频在线观看免费| 欧美调教femdomvk| 日韩在线一区二区| 欧美sm极限捆绑bd| 国产麻豆视频精品| 国产精品少妇自拍| 成人精品小蝌蚪| 一区二区三区中文字幕| 欧美亚洲国产一区在线观看网站| 午夜视频一区在线观看| 日韩一区二区在线观看视频播放| 精品午夜一区二区三区在线观看| 久久午夜电影网| 97久久人人超碰| 水野朝阳av一区二区三区| 91麻豆精品国产91久久久久 | 豆国产96在线|亚洲| 中文字幕一区在线观看视频| 91福利社在线观看| 久久不见久久见免费视频7| 国产婷婷色一区二区三区| kk眼镜猥琐国模调教系列一区二区| 亚洲视频一区二区在线| 欧美精品一卡两卡| 国产黄色成人av| 亚洲一区av在线| 精品国产91亚洲一区二区三区婷婷| 成人一级片在线观看| 亚洲国产aⅴ成人精品无吗| 精品国产髙清在线看国产毛片 | 国产精品国产三级国产有无不卡| 色欧美乱欧美15图片| 蜜桃视频一区二区| 中文字幕一区在线观看| 日韩视频免费观看高清在线视频| 国产精品1024| 日韩和欧美的一区| 综合av第一页| 久久影院午夜论| 欧美日本一区二区三区四区 | 欧美日韩亚洲综合在线 | 欧美精品亚洲一区二区在线播放| 国产酒店精品激情| 视频一区二区三区中文字幕| 国产精品精品国产色婷婷| 欧美一区欧美二区| 91视频国产观看| 久99久精品视频免费观看| 一级特黄大欧美久久久| 久久亚洲二区三区| 制服丝袜亚洲精品中文字幕| 95精品视频在线| 国产伦理精品不卡| 日本成人在线网站| 亚洲欧美另类综合偷拍| 国产亲近乱来精品视频| 欧美v国产在线一区二区三区| 99久久精品一区| 成人免费av资源| 国产激情一区二区三区四区 | 日欧美一区二区| 亚洲自拍偷拍欧美| 亚洲男人天堂av| 亚洲欧洲一区二区三区| 国产欧美一区二区三区沐欲| 7777精品伊人久久久大香线蕉完整版| 99久久精品免费| 成人国产在线观看| 成人精品免费视频| 成人18精品视频| 成人avav影音| 99国产精品久久久久久久久久 | 久久蜜桃av一区二区天堂| 日韩一区二区三区观看| 97aⅴ精品视频一二三区| 丁香啪啪综合成人亚洲小说| 国产xxx精品视频大全| 国产成人亚洲精品狼色在线| 国产精品一二二区| 国产91露脸合集magnet| 大桥未久av一区二区三区中文| 成人在线视频一区| av日韩在线网站| 色综合激情五月| 欧美日韩在线一区二区| 欧美精品v国产精品v日韩精品 | 欧美裸体bbwbbwbbw| 在线91免费看| 日韩女优制服丝袜电影| 久久久久久免费毛片精品| 中文字幕精品一区二区精品绿巨人| 欧美国产综合色视频| 成人欧美一区二区三区小说| 亚洲一区免费视频| 美脚の诱脚舐め脚责91 | 中文字幕在线一区二区三区| 亚洲女人小视频在线观看| 亚洲成av人片| 久久99精品国产91久久来源| 国产高清久久久| 91丝袜国产在线播放| 欧美精选午夜久久久乱码6080| 精品少妇一区二区三区免费观看 | 丁香一区二区三区| 色婷婷综合激情| 日韩小视频在线观看专区| 久久蜜桃av一区二区天堂| 亚洲老司机在线| 久久99精品国产麻豆婷婷| 97国产一区二区| 日韩一区二区电影| 日韩理论片在线| 日本视频在线一区| 成人av免费在线观看| 欧美一区二区三区系列电影| 欧美国产一区二区| 婷婷成人综合网| 成人av网站在线观看免费| 欧美一区二区三区电影| 国产精品三级av在线播放| 视频一区欧美精品| 99精品国产99久久久久久白柏| 日韩一区二区在线免费观看| 亚洲免费在线观看视频| 久久精品国产77777蜜臀| 色婷婷亚洲综合| 国产嫩草影院久久久久| 日一区二区三区| 色噜噜夜夜夜综合网| 337p日本欧洲亚洲大胆精品| 亚洲综合久久久久| www.欧美.com| www国产精品av| 亚洲va欧美va人人爽午夜| 粉嫩绯色av一区二区在线观看| 日韩一区二区三区免费看| 亚洲一区二区三区四区五区黄 | 国产一区三区三区| 欧美久久一区二区| 亚洲一区二区在线免费观看视频 | 国产精品99久久久久久似苏梦涵 | 欧美一区二区视频在线观看2020| 综合婷婷亚洲小说| 高清shemale亚洲人妖| 欧美tickling网站挠脚心| 婷婷久久综合九色综合绿巨人| 99re成人在线| 亚洲欧洲色图综合| 岛国一区二区三区| 国产日本一区二区| 国产麻豆视频精品| 精品国产不卡一区二区三区| 免费久久99精品国产| 欧美日韩亚洲综合在线| 亚洲综合精品久久| 欧美午夜片在线观看| 亚洲香蕉伊在人在线观| 欧美怡红院视频| 亚洲午夜久久久久久久久久久| 欧洲一区在线观看| 日韩精品电影一区亚洲| 欧美人动与zoxxxx乱|