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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? usb_isr.c

?? C8051F320做的USB示波器。簡(jiǎn)單實(shí)現(xiàn)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//-----------------------------------------------------------------------------
// F32x_USB_ISR.c
//-----------------------------------------------------------------------------
// Copyright 2005 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// Source file for USB firmware. Includes top level ISR with Setup,
// and Endpoint data handlers.  Also includes routine for USB suspend,
// reset, and procedural stall.
//
//
// How To Test:    See Readme.txt
//
//
// FID:            32X000023
// Target:         C8051F32x
// Tool chain:     Keil C51 7.50 / Keil EVAL C51
//                 Silicon Laboratories IDE version 2.6
// Command Line:   See Readme.txt
// Project Name:   F32x_USB_Interrupt
//
//
// Release 1.3
//    -All changes by GP
//    -22 NOV 2005
//    -Changed revision number to match project revision
//    -Modified file to fit new formatting guidelines
//    -Changed file name from USB_ISR.c
//    -Removed extraneous code that was commented out
//    -Added USB Suspend code
//   
// Release 1.0
//    -Initial Revision (DM)
//    -08 NOV 2002
//

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include "c8051F320.h"#include "USB_Register.h"
#include "USB_Main.h"
#include "USB_Descriptor.h"

//-----------------------------------------------------------------------------
// Global Externs
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Global Variables
//-----------------------------------------------------------------------------

unsigned  char * usb_dptr;       /* pointer to first empty location in buffer (Rx) or to the first char to transmit (Tx) */
unsigned  char usb_ep0_dcntT;   /* data count to transmit */
unsigned  char usb_ep0_dcntR;   /* data count to receive */
unsigned  char usb_ep2_dcntT;   /* data count to transmit */
unsigned  char usb_ep2_dcntR;   /* data count to receive */


BYTE USB_State;                        // Holds the current USB State
                                       // def. in F32x_USB_Main.h

setup_buffer Setup;                    // Buffer for current device request

unsigned int DataSize;                 // Size of data to return
unsigned int DataSent;                 // Amount of data sent so far
BYTE* DataPtr;                         // Pointer to data to return

// Holds the status for each endpoint
BYTE Ep_Status[5] = {EP_IDLE, EP_IDLE, EP_IDLE, EP_IDLE, EP_IDLE};


BYTE receive_ep0;
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Usb_ISR
//-----------------------------------------------------------------------------
//
// Called after any USB type interrupt, this handler determines which type
// of interrupt occurred, and calls the specific routine to handle it.
//
//-----------------------------------------------------------------------------
void Usb_ISR(void) interrupt 8         // Top-level USB ISR{
   BYTE bCommon, bIn, bOut;
   POLL_READ_BYTE(CMINT, bCommon);     // Read all interrupt registers   POLL_READ_BYTE(IN1INT, bIn);        // this read also clears the register
   POLL_READ_BYTE(OUT1INT, bOut);
   {
      if (bCommon & rbRSUINT)          // Handle Resume interrupt
      {
         Usb_Resume();
      }      if (bCommon & rbRSTINT)          // Handle Reset interrupt
      {
         Usb_Reset();
      }      if (bIn & rbEP0)                 // Handle Setup packet received
      {                                // or packet transmitted if Endpoint 0
		 Handle_Setup();               // is transmit mode
      }      if (bIn & rbIN2)                 // Handle In Packet sent, put new data
      {                                // on endpoint 1 fifo
         Handle_In2();
      }      if (bOut & rbOUT2)               // Handle Out packet received, take data
      {                                // off endpoint 2 fifo
         Handle_Out2();
      }
	  if( bIn & rbIN3)
	  {
	  	 Handle_In3();
	  }
	  if (bOut & rbOUT3)
	  {
	  	 Handle_Out3();
	  }

      if (bCommon & rbSUSINT)          // Handle Suspend interrupt
      {
         Usb_Suspend();
      }
   }
}

//-----------------------------------------------------------------------------
// Support Routines for ISR
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// Usb_Reset
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// - Set state to default
// - Clear Usb Inhibit bit
//
//-----------------------------------------------------------------------------

void Usb_Reset(void)
{
   USB_State = DEV_DEFAULT;            // Set device state to default

   POLL_WRITE_BYTE(POWER, 0x01);       // Clear usb inhibit bit to enable USB
                                       // suspend detection

   Ep_Status[0] = EP_IDLE;             // Set default Endpoint Status
   Ep_Status[1] = EP_HALT;
   Ep_Status[2] = EP_HALT;
   Ep_Status[3] = EP_HALT;
   Ep_Status[4] = EP_HALT;
   receive_ep0	= 0;

}

//-----------------------------------------------------------------------------
// Handle_Setup
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// - Decode Incoming Setup requests
// - Load data packets on fifo while in transmit mode
//
//-----------------------------------------------------------------------------

void Handle_Setup(void)
{

   BYTE ControlReg,TempReg;            // Temporary storage for EP control register

   POLL_WRITE_BYTE(INDEX, 0);          // Set Index to Endpoint Zero
   POLL_READ_BYTE(E0CSR, ControlReg);  // Read control register

   if (Ep_Status[0] == EP_ADDRESS)     // Handle Status Phase of Set Address command
   {
      POLL_WRITE_BYTE(FADDR, Setup.wValue.c[LSB]);
      Ep_Status[0] = EP_IDLE;
   }

   if (ControlReg & rbSTSTL)           // If last packet was a sent stall, reset
   {                                   // STSTL bit and return EP0 to idle state
      POLL_WRITE_BYTE(E0CSR, 0);
      Ep_Status[0] = EP_IDLE;
      return;
   }

   if (ControlReg & rbSUEND)           // If last setup transaction was ended prematurely then set
   {                                   
      POLL_WRITE_BYTE(E0CSR, rbDATAEND);
      POLL_WRITE_BYTE(E0CSR, rbSSUEND); // Serviced Setup End bit and return EP0
      Ep_Status[0] = EP_IDLE;          // to idle state
   }

   if (Ep_Status[0] == EP_IDLE)        // If Endpoint 0 is in idle mode
   {
      if (ControlReg & rbOPRDY)        // Make sure that EP 0 has an Out Packet ready from host
      {                                // although if EP0 is idle, this should always be the case

		 if( receive_ep0 == 0)
		 {
	         Fifo_Read(FIFO_EP0, 8, (BYTE *)&Setup);
	                                        // Get Setup Packet off of Fifo, it is currently Big-Endian
	
	                                       // Compiler Specific - these next three statements swap the
	                                       // bytes of the setup packet words to Big Endian so they
	                                       // can be compared to other 16-bit values elsewhere properly
	
			 if(Setup.bmRequestType == 0xC0 )	//MYBDM命令
			 {
				command_buffer[0] = Setup.bmRequestType;
				command_buffer[1] = Setup.bRequest;
				command_buffer[2] = Setup.wValue.c[MSB];
				command_buffer[3] = Setup.wValue.c[LSB];
				command_buffer[4] = Setup.wIndex.c[MSB];
				command_buffer[5] = Setup.wIndex.c[LSB];
				command_buffer[6] = Setup.wLength.c[MSB];
				command_buffer[7] = Setup.wLength.c[LSB];
			
				
				DataPtr = command_buffer;					// Can have a maximum of 255 strings
				
				if (Ep_Status[0] != EP_STALL)
				{
					POLL_WRITE_BYTE(E0CSR, rbSOPRDY);         // Set Serviced Setup packet, put endpoint in transmit
					Ep_Status[0] = EP_TX;                     // mode and reset Data sent counter
					DataSent = 0;
				}
			 }
			 else if(Setup.bmRequestType == 0x40)
			 {
				command_buffer[0] = Setup.bmRequestType;
				command_buffer[1] = Setup.bRequest;
				command_buffer[2] = Setup.wValue.c[MSB];
				command_buffer[3] = Setup.wValue.c[LSB];
				command_buffer[4] = Setup.wIndex.c[MSB];
				command_buffer[5] = Setup.wIndex.c[LSB];
				command_buffer[6] = Setup.wLength.c[MSB];
				command_buffer[7] = Setup.wLength.c[LSB];
				usb_ep0_dcntR = command_buffer[6];
				if(usb_ep0_dcntR == 0)
				{
			          USB_ep0_rx(); /* the routine will not copy any data, but will launch command execution and status frame transmit */
	                /* this is cleaner as this code is in one place only */
	         	}
				else
				{
					receive_ep0 = 1;

					usb_dptr = command_buffer+6;  /* first 5 bytes stored already starting from position 1 */
					POLL_WRITE_BYTE(E0CSR, rbSOPRDY);         // Set Serviced Setup packet, put endpoint in transmit
	
					DataSent = 0;
			 	}
		        /* data to follow, set-up pointer */  
			 }
			 else
			 {
				 Setup.wValue.i = Setup.wValue.c[MSB] + 256*Setup.wValue.c[LSB];
		         Setup.wIndex.i = Setup.wIndex.c[MSB] + 256*Setup.wIndex.c[LSB];
		         Setup.wLength.i = Setup.wLength.c[MSB] + 256*Setup.wLength.c[LSB];
		
		
		         switch(Setup.bRequest)        // Call correct subroutine to handle each kind of
		         {                             // standard request
		            case GET_STATUS:
		               Get_Status();
		               break;
		            case CLEAR_FEATURE:
		               Clear_Feature();
		               break;
		            case SET_FEATURE:
		               Set_Feature();
		               break;
		            case SET_ADDRESS:
		               Set_Address();
		               break;
		            case GET_DESCRIPTOR:
		               Get_Descriptor();
		               break;
		            case GET_CONFIGURATION:
		               Get_Configuration();
		               break;
		            case SET_CONFIGURATION:
		               Set_Configuration();
		               break;
		            case GET_INTERFACE:
		               Get_Interface();
		               break;
		            case SET_INTERFACE:
		               Set_Interface();
		               break;
		            default:
		               Force_Stall();          // Send stall to host if invalid request
		               break;
		         }
			 }
		 }
		 else	//	receive_ep0 = 1;
		 {
		 	USB_ep0_rx();
		 }
      }
   }

   if (Ep_Status[0] == EP_TX)          // See if the endpoint has data to transmit to host
   {
      if (!(ControlReg & rbINPRDY))    // Make sure you don't overwrite last packet	Endpoint 0 transmit mode
      {
		 receive_ep0 = 0;
         POLL_READ_BYTE(E0CSR, ControlReg);	   // Read control register
                                       

         if ((!(ControlReg & rbSUEND)) || (!(ControlReg & rbOPRDY)))
                                       // Check to see if Setup End or Out Packet received, if so
                                       // do not put any new data on FIFO
         {
            TempReg = rbINPRDY;        // Add In Packet ready flag to E0CSR bitmask
                                       // Break Data into multiple packets if larger than Max Packet

            if (DataSize >= EP0_PACKET_SIZE)
            {
               Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE, (BYTE *)DataPtr);// Put Data on Fifo
               DataPtr  += EP0_PACKET_SIZE;                           // Advance data pointer
               DataSize -= EP0_PACKET_SIZE;                           // Decrement data size
               DataSent += EP0_PACKET_SIZE;                           // Increment data sent counter
            }
            else                       // If data is less than Max Packet size or zero
            {
               Fifo_Write(FIFO_EP0, DataSize, (BYTE *)DataPtr);       // Put Data on Fifo
               TempReg |= rbDATAEND;                                  // Add Data End bit to bitmask
               Ep_Status[0] = EP_IDLE;                                // Return EP 0 to idle state
            }

            if (DataSent == Setup.wLength.i)
                                        // This case exists when the host requests an even multiple of
                                        // your endpoint zero max packet size, and you need to exit
                                        // transmit mode without sending a zero length packet
            {
               TempReg |= rbDATAEND;    // Add Data End bit to mask

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级免费电影| 国产成人免费视频一区| 日韩电影免费在线| 精品一区二区三区久久| 成人激情综合网站| 欧美色区777第一页| 日韩欧美成人一区二区| 国产精品理论片| 亚洲高清久久久| 国产福利精品一区二区| 色综合久久88色综合天天| 欧美成人午夜电影| 亚洲欧美日韩国产综合在线| 日本亚洲电影天堂| 99精品国产视频| 精品奇米国产一区二区三区| 亚洲精品一二三| 精品一区二区三区在线观看国产 | 精品国一区二区三区| 亚洲国产精品二十页| 欧美群妇大交群的观看方式| 激情丁香综合五月| 91免费国产在线观看| 欧美日韩视频在线观看一区二区三区| 欧美r级电影在线观看| 亚洲精品高清视频在线观看| 国产在线精品一区二区夜色| 在线视频综合导航| 欧美经典一区二区三区| 日韩精品一级二级 | 国产女人18毛片水真多成人如厕| 亚洲成人你懂的| www.日韩av| 日韩免费视频一区| 亚洲韩国一区二区三区| 国产成人一级电影| 日韩三级中文字幕| 亚洲电影欧美电影有声小说| 成人中文字幕在线| 久久这里只有精品首页| 婷婷六月综合网| 色香蕉成人二区免费| 国产欧美日韩中文久久| 麻豆精品在线观看| 欧美日韩精品三区| 一区二区激情小说| 欧美精品国产精品| 偷拍一区二区三区| jvid福利写真一区二区三区| 精品奇米国产一区二区三区| 三级在线观看一区二区| 在线国产亚洲欧美| 亚洲三级小视频| 成人精品电影在线观看| 久久久国际精品| 久久99久久99精品免视看婷婷| 欧美高清激情brazzers| 亚洲一区二区三区爽爽爽爽爽| 91日韩一区二区三区| 中文久久乱码一区二区| 国产精品一区免费视频| 亚洲精品一区二区三区精华液 | 色婷婷久久久综合中文字幕| 亚洲综合视频在线观看| 成人中文字幕合集| 久久久亚洲午夜电影| 激情综合色播五月| 亚洲精品视频一区| 91亚洲资源网| 国产精品第一页第二页第三页| 丰满少妇久久久久久久| 中文字幕精品一区二区精品绿巨人 | 国产精品自在欧美一区| 亚洲精品在线电影| 狠狠色丁香婷综合久久| 精品国产免费久久| 国产一区视频网站| 久久久99久久精品欧美| 国产精品一区二区你懂的| 久久影视一区二区| 国产999精品久久| 中文字幕一区二区日韩精品绯色| 99久久久国产精品免费蜜臀| 亚洲免费视频成人| 欧美三级乱人伦电影| 日韩av电影天堂| 精品国产免费人成电影在线观看四季| 国产在线麻豆精品观看| 国产精品九色蝌蚪自拍| 日本高清无吗v一区| 亚洲欧洲日韩综合一区二区| 亚洲色图另类专区| 91亚洲男人天堂| 一区二区欧美视频| 欧美日韩电影在线| 免费成人在线影院| 国产亚洲欧美中文| 95精品视频在线| 亚洲国产精品久久艾草纯爱| 日韩女优视频免费观看| 国产一区 二区| 1000精品久久久久久久久| 欧美手机在线视频| 麻豆91在线播放免费| 国产亚洲午夜高清国产拍精品| av中文字幕一区| 五月天亚洲婷婷| 精品国产sm最大网站免费看| 国产91露脸合集magnet| 一区二区三区美女| 日韩女同互慰一区二区| 99热在这里有精品免费| 日本美女视频一区二区| 国产日韩精品一区二区三区| 一本色道久久综合狠狠躁的推荐| 日本一道高清亚洲日美韩| 国产精品三级av在线播放| 欧美亚洲动漫精品| 韩日精品视频一区| 亚洲综合免费观看高清完整版| 欧美xxxx在线观看| 91麻豆蜜桃一区二区三区| 欧美极品aⅴ影院| 中文字幕久久午夜不卡| 一本到一区二区三区| 免费成人美女在线观看| 国产精品久久久久影视| 在线电影院国产精品| 高清不卡一区二区在线| 午夜不卡av免费| 国产精品国产自产拍高清av王其| 在线播放亚洲一区| 成人伦理片在线| 美腿丝袜在线亚洲一区| 亚洲免费三区一区二区| xf在线a精品一区二区视频网站| 91久久香蕉国产日韩欧美9色| 国产裸体歌舞团一区二区| 亚洲成人久久影院| 国产精品欧美极品| 亚洲精品一线二线三线| 欧美久久免费观看| 91视视频在线观看入口直接观看www| 美洲天堂一区二卡三卡四卡视频| 玉足女爽爽91| 国产精品视频一区二区三区不卡| 日韩一区二区三区免费看 | 国产精品国产三级国产aⅴ入口 | 美女视频黄a大片欧美| 亚洲午夜在线观看视频在线| 国产精品国产三级国产aⅴ无密码| 麻豆91在线观看| 精品国产成人系列| 欧美日韩国产一级片| 99久久精品国产一区| 激情六月婷婷综合| 天天影视涩香欲综合网| 亚洲日穴在线视频| 欧美激情在线一区二区| 久久亚洲私人国产精品va媚药| 777亚洲妇女| 欧美日韩免费观看一区二区三区| 91同城在线观看| 成人国产在线观看| 国产成人小视频| 国产自产v一区二区三区c| 蜜桃视频一区二区三区| 日韩精品免费视频人成| 亚洲高清不卡在线观看| 一区二区三区精品视频| 亚洲乱码中文字幕综合| 国产精品久久久久四虎| 国产欧美日韩一区二区三区在线观看| 日韩欧美精品在线视频| 欧美刺激午夜性久久久久久久| 88在线观看91蜜桃国自产| 91精品国产一区二区人妖| 欧美女孩性生活视频| 欧美日韩久久久一区| 欧美日韩成人综合| 欧美美女一区二区在线观看| 精品视频在线免费看| 欧美男男青年gay1069videost| 欧美精品亚洲二区| 9191久久久久久久久久久| 欧美一区二区久久久| 日韩欧美在线网站| 欧美高清一级片在线观看| 日韩电影免费在线| 首页国产欧美日韩丝袜| 图片区日韩欧美亚洲| 午夜精品一区二区三区三上悠亚| 亚洲国产日韩精品| 午夜视黄欧洲亚洲| 久久精品理论片| 国产成人亚洲综合色影视| 波多野结衣一区二区三区 | 国产精品视频一二三区| 亚洲少妇30p| 亚洲成在人线免费|