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

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

?? ctrlrequest.c

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

#include <reg51.h>
#include <string.h>
#include "sotatype.h"
#include "usbdisk.h"
#include "device.h"
#include "CtrlRequest.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;       
}  

//----------------------------------------------------------------------------
// 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;
            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;                              

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
最新中文字幕一区二区三区| 国产精品一区一区三区| 亚洲免费毛片网站| 久久久久9999亚洲精品| 91精品视频网| 欧美一级欧美三级在线观看 | 色综合视频在线观看| 国产高清亚洲一区| 国产成人精品综合在线观看 | 国产精品888| 国产精品一二三在| 国产成人在线视频网站| 顶级嫩模精品视频在线看| 国产宾馆实践打屁股91| 成人综合在线观看| av成人老司机| 91久久线看在观草草青青| 欧美性淫爽ww久久久久无| 欧美日韩一本到| 欧美一区二区三区视频免费播放| 日韩一区二区三区在线视频| 性感美女极品91精品| 午夜伦理一区二区| 麻豆精品视频在线观看视频| 国产精品一区在线| 色综合婷婷久久| 欧美日韩的一区二区| 日韩三级精品电影久久久| 久久久久久久电影| 国产精品国产自产拍在线| 亚洲一区二三区| 美国毛片一区二区| 国产电影一区二区三区| 色综合久久综合| 日韩亚洲欧美高清| 中文在线资源观看网站视频免费不卡| 亚洲欧洲韩国日本视频| 天天射综合影视| 国产一区二区三区久久久| 色香色香欲天天天影视综合网| 欧美日韩免费视频| 精品国产三级a在线观看| 国产精品国产自产拍高清av | 首页国产欧美日韩丝袜| 国产在线精品不卡| 色吧成人激情小说| 精品欧美一区二区三区精品久久| 国产日韩欧美电影| 午夜精品一区二区三区免费视频| 日本 国产 欧美色综合| 成人18精品视频| 5566中文字幕一区二区电影| 国产亚洲综合在线| 亚洲第一主播视频| 国产91高潮流白浆在线麻豆| 欧美日韩一区成人| 国产日本欧美一区二区| 亚洲国产精品一区二区久久| 国内精品久久久久影院色| 日本乱码高清不卡字幕| 亚洲精品一区二区三区蜜桃下载 | 成人午夜激情片| 欧美巨大另类极品videosbest| 日本一区免费视频| 美女视频黄a大片欧美| 在线看不卡av| 久久精品水蜜桃av综合天堂| 天天影视网天天综合色在线播放| 懂色av一区二区在线播放| 欧美老年两性高潮| 中文字幕在线观看不卡| 久久99久久久欧美国产| 在线精品观看国产| 中文字幕av一区 二区| 久久99在线观看| 91精品视频网| 亚洲国产综合在线| 99久久久无码国产精品| 国产视频911| 久久超级碰视频| 欧美一区2区视频在线观看| 亚洲午夜羞羞片| 在线影视一区二区三区| 中文字幕制服丝袜成人av| 国产做a爰片久久毛片| 在线不卡免费欧美| 亚洲一区自拍偷拍| 91香蕉视频在线| 欧美国产一区视频在线观看| 国产一区二区导航在线播放| 精品免费国产二区三区 | 欧美色综合网站| 国产精品久久毛片| 粉嫩av一区二区三区在线播放| 精品久久一二三区| 捆绑紧缚一区二区三区视频| 在线播放亚洲一区| 亚洲国产精品久久人人爱| 色一情一伦一子一伦一区| 国产精品不卡在线| 99精品欧美一区二区蜜桃免费| 欧美激情一区在线观看| 国产成人午夜99999| 久久久九九九九| 国产精品一区二区三区四区| 欧美精品一区二区三区蜜桃视频| 精品一区二区三区久久| 精品国产乱码久久久久久蜜臀 | 精品写真视频在线观看| 精品久久一区二区三区| 国产精品自拍一区| 国产亚洲精品福利| 粉嫩嫩av羞羞动漫久久久| 国产片一区二区三区| 欧美tk丨vk视频| 国产在线不卡一卡二卡三卡四卡| 精品国产三级电影在线观看| 久久 天天综合| 国产欧美日韩亚州综合| 成人福利视频在线看| ...中文天堂在线一区| 在线一区二区三区做爰视频网站| 亚洲国产成人精品视频| 91精品蜜臀在线一区尤物| 久久成人免费网| 欧美极品少妇xxxxⅹ高跟鞋| 捆绑调教一区二区三区| 一本一道综合狠狠老| 亚洲综合免费观看高清完整版| 夫妻av一区二区| 国产精品久久久久国产精品日日| 99精品热视频| 日韩激情中文字幕| 精品对白一区国产伦| 国产成人在线免费| 亚洲乱码国产乱码精品精小说 | 在线精品亚洲一区二区不卡| 欧美性视频一区二区三区| 欧美日韩aaaaa| 26uuu国产一区二区三区| 国产日韩高清在线| 日韩伦理免费电影| 亚洲成人一区在线| 国产成人在线视频网址| 91麻豆国产精品久久| 欧美高清视频不卡网| 久久综合久久综合九色| 亚洲女与黑人做爰| 秋霞影院一区二区| av爱爱亚洲一区| 日韩一区二区在线免费观看| 国产日韩欧美麻豆| 日韩va亚洲va欧美va久久| 国产一区二区在线看| 91高清在线观看| 久久综合成人精品亚洲另类欧美| 亚洲欧美另类小说视频| 热久久一区二区| 在线免费观看日本一区| 久久久91精品国产一区二区精品 | 亚洲最大成人网4388xx| 久久99深爱久久99精品| 色狠狠色狠狠综合| 久久久久久久久久久久久夜| 亚洲与欧洲av电影| 国产白丝精品91爽爽久久 | 972aa.com艺术欧美| www国产精品av| 亚洲第一福利一区| 97se狠狠狠综合亚洲狠狠| 亚洲精品一区二区精华| 性感美女久久精品| 91老师片黄在线观看| 久久天天做天天爱综合色| 婷婷一区二区三区| 色综合久久久久久久久| 国产欧美一区二区精品仙草咪| 无吗不卡中文字幕| 在线精品观看国产| 日韩一区中文字幕| 懂色av噜噜一区二区三区av| 欧美成人一区二区三区片免费| 亚洲国产aⅴ成人精品无吗| 99久久国产综合精品女不卡| 久久综合久久久久88| 久久精品国产一区二区| 欧美日韩美少妇| 午夜电影网亚洲视频| 色94色欧美sute亚洲线路一久| 国产日产欧美一区二区三区| 国产揄拍国内精品对白| 欧美videossexotv100| 美国毛片一区二区| 欧美一区二区三区视频在线观看| 三级在线观看一区二区| 欧美私人免费视频| 亚洲精品精品亚洲| 色先锋久久av资源部| 亚洲欧洲综合另类在线| 成人午夜在线视频|