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

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

?? host_811.c

?? 基于Embest開發(fā)環(huán)境
?? C
?? 第 1 頁 / 共 3 頁
字號:
//#include "host_811.h"
#include "44b.h"
#include <stdlib.h>

#include "USB_SYS.h"
//*****************************************************************************************
// SL811H Modules (major routines only): 
//*****************************************************************************************
// 1) usbXfer()		: handles usd data transfer, SETUP,IN, OUT
// 2) ep0Xfer()		: handles endpoint zero control pipe
// 3) DataRW()		: handles data endpoint transfer pipe
// 4) EnumUsbDev() 	: device enum(HID/HUB), excl. multi-interface
// 6) speed_detect(): SL811H slave device attach/speed detect
// 7) slave_detect(): Main loop control between SL811H & EZUSB & GUI


//*****************************************************************************************
//variables
//*****************************************************************************************
//
BYTE 		 	DBUF[512];		// at 0x2000 for general descriptors data//~~~做什么用的?
BYTE		 	remainder;		// Remaining byte in a USB transfer
pUSBDEV 	 	uDev[MAX_DEV];	// Multiple USB devices attributes, Max 5 devices//~~Max 2 吧?
pDevDesc  	 	pDev;			// Device descriptor struct
pCfgDesc 	 	pCfg;			// Configuration descriptor struct
pIntfDesc 	 	pIfc;			// Interface descriptor struct
pEPDesc 	 	pEnp;			// Endpoint descriptor struct
pStrDesc 	 	pStr;			// String descriptor struct

//*****************************************************************************************
// Boolean Logic Defines//~~arm不支持布爾類型,用byte類型代替
//*****************************************************************************************
BYTE  	SLAVE_FOUND;				// Slave USB device found
BYTE  	SLAVE_ENUMERATED;			// slave USB device enumeration done
BYTE  	FULL_SPEED;					// Full-Speed = TRUE, Low-Speed = FALSE
BYTE 	BULK_OUT_DONE;				// Set when EZUSB's OUT1 hostcmd xfer is done
BYTE 	DESC_XFER;					// Set when there is data for EZUSB's IN1 desc xfer
BYTE 	DATA_XFER;					// Set when there is data for EZUSB's IN3 data xfer
BYTE 	DATA_XFER_OUT;				// Set when there is data for EZUSB's OUT3 data xfer
BYTE 	CONFIG_DONE;				// Set when EZUSB completes its enumeration process.
BYTE 	TIMEOUT_ERR;				// timeout error during data endpoint transfer
BYTE	DATA_STOP;					// device unplugged during data transfer
BYTE	DATA_INPROCESS;				// set when we are in a data pipe transfer
BYTE	pLS_HUB;					// indicate previous command is a LS device on hub

BYTE   bData1;					//~~標識是data0還是data1


//*****************************************************************************************
// Byte Read from SL811H
// a = register address
// return = data in register
//*****************************************************************************************

BYTE SL811Read(BYTE a)
{  
	SL811H_ADDR = a;			
	return (SL811H_DATA);
}

//*****************************************************************************************
// Byte Write to SL811H
// a = register address
// d = data to be written to this register address
//*****************************************************************************************

void SL811Write(BYTE a, BYTE d)
{  
	SL811H_ADDR = a;	
	SL811H_DATA = d;
}

//*****************************************************************************************
// Buffer Read from SL811H
// addr = buffer start address
// s    = return buffer address where data are to be save/read
// c	= buffer data length
//*****************************************************************************************

void SL811BufRead(BYTE addr, BYTE *s, BYTE c)
{	
	SL811H_ADDR = addr;	
   	while (c--) 
   		{
   		USB_Delay(1);
		*s++ = SL811H_DATA;}
}

//*****************************************************************************************
// Buffer Write  to SL811H
// addr = buffer start address
// s    = buffer address where data are to be written
// c	= buffer data length
//*****************************************************************************************

void SL811BufWrite(BYTE addr, BYTE *s, BYTE c)
{	
	SL811H_ADDR = addr;	
   	while (c--) 
		{
		USB_Delay(1);
		SL811H_DATA = *s++;}
}


//*****************************************************************************************
// UsbReset during enumeration of device attached directly to SL811HS
//*****************************************************************************************

void USBReset()
{
	BYTE tmp;
    tmp =  SL811Read(CtrlReg);       
 	SL811Write(CtrlReg,tmp|0x08);
	USB_Delay(5);			
    SL811Write(CtrlReg,tmp);    
}

//*****************************************************************************************
// usbXfer:
// successful transfer = return TRUE
// fail transfer = return FALSE
// 此函數(shù)完成setup/in/out事務(wù)的傳輸;   相當重要的usb 傳輸函數(shù)
//*****************************************************************************************


int usbXfer(BYTE usbaddr, BYTE endpoint, BYTE pid, BYTE iso, WORD wPayload, WORD wLen, BYTE *buffer)
{  
	//~~usbaddr設(shè)備號(udev的數(shù)組元素標號),endpoint是端點號,pid是包標識符
	//~~wlen是發(fā)送接收數(shù)據(jù)長度,buffer是數(shù)據(jù)緩沖區(qū),wpayload是最大載荷,是811中緩沖區(qū)長度
	
	BYTE  	cmd, result, timeout, intr;		
	//~~cmd寫給EP0Control的值,result是ep0中斷后EP0Status的值,intr是讀取IntStatus的值
	
	BYTE  	xferLen, bufLen, data0, data1, dataX, addr;		//~~去掉xdata
	//~~xferlen是每次實際傳送的數(shù)據(jù)長度,data0/1是811中data0/1的緩沖區(qū)地址,
	//~~buflen記錄buffer中數(shù)據(jù)傳送到哪個位子了
	//~~addr記錄第二次以后的傳送是data0的buffer還是data1的buffur
	//~~datax是幫助addr確定本次傳送是data0的buffer中的數(shù)據(jù)還是data1的buffer中的數(shù)據(jù)
	
	//------------------------------------------------
	// Default setting for usb trasnfer
	//------------------------------------------------
	bufLen = dataX = timeout = 0;					//reset all
	data0 = EP0_Buf;								// DATA0 buffer address
	data1 = data0 + (BYTE)wPayload;				// DATA1 buffer address
	DATA_STOP =	TIMEOUT_ERR = FALSE;		// set default conditions//~~本來為bool類型

	//------------------------------------------------
	// Define data transfer payload
	//~~如果要傳輸?shù)臄?shù)據(jù)長度大于相應(yīng)端點的最大包尺寸就先發(fā)送最大包長度的數(shù)據(jù)
	//------------------------------------------------
	if (wLen >= wPayload)  							// select proper data payload
		xferLen = wPayload;							// limit to wPayload size 
	else											// else take < payload len
		xferLen = wLen;								//	

	//------------------------------------------------
	// For IN token
	//------------------------------------------------
	if (pid==PID_IN)								// for current IN tokens
	{												
			if(FULL_SPEED)								
			cmd = sDATA0_RD;	// FS/FS on Hub, sync to sof//~~原來為sDATA0_RD
		else										// LS, no sync to sof for IN
			cmd = DATA0_RD;	
			//Uart_Printf("%x\n",cmd);						
	}
	//------------------------------------------------
	// For OUT token
	//------------------------------------------------
	else if(pid==PID_OUT)							// for OUT tokens
	{  	
		if(xferLen)									// only when there are	
			
			SL811BufWrite(data0,buffer,xferLen); 	// data to transfer on USB

		if(FULL_SPEED)								
			cmd = sDATA0_WR;	// FS/FS on Hub, sync to sof//~~原來為sDATA0_WR
		else										// LS, no sync to sof for OUT
			cmd = DATA0_WR;							
		// implement data toggle
		bData1 = uDev[usbaddr].bData1[endpoint];//~~bdata1是bool型,標示data0還是data1
    uDev[usbaddr].bData1[endpoint] = (uDev[usbaddr].bData1[endpoint] ? 0 : 1); // DataToggle
		if(bData1)
          cmd |= 0x40;                              // Set Data1 bit in command
	}
	//------------------------------------------------
	// For SETUP/OUT token
	//------------------------------------------------
	else											// for current SETUP/OUT tokens
	{  	
		if(xferLen)	
		SL811BufWrite(data0,buffer,xferLen); 	// data to transfer on USB
		
		if(FULL_SPEED)								
			cmd = sDATA0_WR;		// FS/FS on Hub, sync to sof//~~原來為sDATA0_WR
		else										// LS, no sync to sof for OUT
			cmd = DATA0_WR;							
	}

	//------------------------------------------------
	// Isochronous data transfer setting
	//------------------------------------------------
	if (iso) 
		cmd |= ISO_BIT;                     		// if iso setup ISO mode

	//------------------------------------------------
	// For EP0's IN/OUT token data, start with DATA1
	// Control Endpoint0's status stage.
	// For data endpoint, IN/OUT data, start ????
	//------------------------------------------------
	if (endpoint == 0 && pid != PID_SETUP) 			// for Ep0's IN/OUT token
				//~~端點0時說明是控制傳輸,并且不是setup包,那么肯定先傳輸data1
		cmd |= 0x40; 								// always set DATA1
        //Uart_Printf("%x\n",cmd);
	//------------------------------------------------
	// Arming of USB data transfer for the first pkt
	//------------------------------------------------
	SL811Write(EP0Status,((endpoint&0x0F)|pid));	// PID + EP address
	SL811Write(EP0Counter,usbaddr);					// USB address
	SL811Write(EP0Address,data0);					// buffer address, start with "data0"
	SL811Write(EP0XferLen,xferLen);					// data transfer length
	SL811Write(IntStatus,INT_CLEAR); 				// clear interrupt status
	SL811Write(EP0Control,cmd);						// Enable ARM and USB transfer start here
    //Uart_Printf("%x\n",SL811Read(EP0Control));
	//------------------------------------------------
	// Main loop for completing a wLen data trasnfer
	//------------------------------------------------
	while(TRUE)
	{   
		//---------------Wait for done interrupt//~~此處用的是查詢方式---------
		while(TRUE)												// always ensure requested device is
		{														// inserted at all time, then you will
			intr = SL811Read(IntStatus);// wait for interrupt to be done, and 
			//Uart_Printf("%x",intr);
			if((intr & USB_RESET) || (intr & INSERT_REMOVE))	// proceed to parse result from slave 
			{													// device.
				DATA_STOP = TRUE;								// if device is removed, set DATA_STOP
				return FALSE;									// flag true, so that main loop will 
			}													// know this condition and exit gracefully
			if(intr & USB_A_DONE)								
				break;											// interrupt done !!!
		}

		SL811Write(IntStatus,INT_CLEAR); 						// clear interrupt status
		result 	  = SL811Read(EP0Status);
		//Uart_Printf("%x\n",result);						// read EP0status register

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美精品一区二区三区四区 | 国产精品一品视频| 在线播放视频一区| 日韩经典一区二区| 精品免费国产二区三区| 国内精品伊人久久久久av一坑| 亚洲精品在线观看网站| 国产精品一级在线| 亚洲色图20p| 欧美日韩一区二区三区在线看| 亚洲国产精品久久不卡毛片| 日本一区二区三级电影在线观看 | 欧美日韩一二区| 亚洲成av人在线观看| 欧美日韩中文国产| 91精品在线麻豆| 极品少妇xxxx精品少妇偷拍| 国产成人在线影院| 久热成人在线视频| 视频在线观看一区二区三区| 亚洲精品va在线观看| 国产精品传媒视频| 亚洲欧洲日产国产综合网| 久久综合五月天婷婷伊人| 欧美一区二区国产| 制服丝袜亚洲色图| 欧美色综合天天久久综合精品| 成人动漫中文字幕| 国产成人亚洲综合a∨婷婷图片 | 亚洲欧洲成人av每日更新| 久久亚洲捆绑美女| 26uuu精品一区二区三区四区在线| 欧美美女一区二区在线观看| 欧美色图12p| 欧美亚洲综合另类| 欧美性受xxxx黑人xyx性爽| 色综合色狠狠综合色| 99亚偷拍自图区亚洲| eeuss国产一区二区三区| 成人一区在线观看| 不卡的电影网站| 成人av中文字幕| 成人av网址在线观看| www.一区二区| 色综合久久综合网欧美综合网| 97国产精品videossex| 一本大道久久a久久精品综合| 97se亚洲国产综合在线| 一本一道久久a久久精品 | 久久免费看少妇高潮| 久久人人97超碰com| 国产片一区二区三区| 国产精品久久久久桃色tv| 中文字幕中文字幕中文字幕亚洲无线| 中文字幕欧美一| 午夜精品久久久| 久久国产精品99久久人人澡| 国产乱色国产精品免费视频| 成人精品国产免费网站| 色婷婷久久久久swag精品| 欧美午夜精品一区| 欧美一级免费大片| 日本一区二区三区四区| 亚洲欧美偷拍另类a∨色屁股| 亚洲男人的天堂在线观看| 香蕉加勒比综合久久| 久久99国产精品免费| 国产sm精品调教视频网站| 色婷婷综合久久久中文字幕| 欧美精品亚洲二区| 国产肉丝袜一区二区| 一区二区三区在线观看国产| 日本在线播放一区二区三区| 国产麻豆视频精品| 91久久精品一区二区二区| 欧美一级日韩不卡播放免费| 国产亚洲制服色| 一区二区久久久| 久久99九九99精品| 91污片在线观看| 日韩欧美高清dvd碟片| 国产精品大尺度| 久久国产精品第一页| 色香蕉成人二区免费| 日韩一区二区三区三四区视频在线观看| 26uuu国产电影一区二区| 成人免费在线播放视频| 奇米亚洲午夜久久精品| 99久久er热在这里只有精品66| 在线免费观看一区| 欧美精品一区二区三区蜜桃| 亚洲精品免费在线观看| 精彩视频一区二区| 欧美日韩中文字幕一区| 欧美激情一区三区| 热久久一区二区| 91国产丝袜在线播放| 久久精品视频一区| 日韩电影免费一区| 在线日韩av片| 中文字幕在线观看不卡视频| 精品在线播放免费| 欧美日韩亚洲不卡| 中文字幕五月欧美| 国产裸体歌舞团一区二区| 欧美日韩一区二区三区四区| 国产精品女同一区二区三区| 麻豆成人久久精品二区三区小说| 一本久久a久久精品亚洲| 国产欧美一区二区精品久导航| 蜜桃av一区二区在线观看| 欧美视频一二三区| 亚洲蜜臀av乱码久久精品蜜桃| 国产高清久久久| 日韩女优制服丝袜电影| 亚洲成a人v欧美综合天堂下载| 日本道在线观看一区二区| 亚洲天堂中文字幕| 成人午夜短视频| 久久久99精品免费观看| 精品一区二区免费在线观看| 欧美人妖巨大在线| 亚洲一区二区精品3399| 91麻豆高清视频| 国产精品久久久久久久裸模| 国产酒店精品激情| 欧美精品一区二区三区蜜桃视频| 日韩在线播放一区二区| 欧美男生操女生| 亚洲成人午夜影院| 欧美日产在线观看| 日本中文字幕不卡| 日韩欧美激情四射| 国精产品一区一区三区mba视频 | 免费观看久久久4p| 91精品蜜臀在线一区尤物| 婷婷久久综合九色综合绿巨人| 在线观看一区二区精品视频| 亚洲一区二区三区视频在线播放 | 国产精品美女久久福利网站| 国产成人午夜精品影院观看视频 | 日韩一区二区在线观看视频播放| 日韩在线观看一区二区| 91精品免费在线| 狠狠狠色丁香婷婷综合激情| 26uuu欧美| www.亚洲人| 亚洲制服丝袜一区| 91麻豆精品国产91久久久使用方法 | 中文字幕日韩一区| 色综合中文字幕国产| 中文字幕在线观看不卡视频| 色综合视频在线观看| 亚洲第一狼人社区| 日韩亚洲欧美高清| 国产福利精品一区| 亚洲欧美中日韩| 欧美熟乱第一页| 捆绑调教一区二区三区| 久久亚洲一区二区三区明星换脸| 成人看片黄a免费看在线| 亚洲欧美日韩一区二区三区在线观看| 色成年激情久久综合| 同产精品九九九| 久久精品这里都是精品| 色综合视频一区二区三区高清| 午夜精品福利一区二区三区蜜桃| 日韩精品一区二区三区视频播放 | 亚洲女人****多毛耸耸8| 91精品在线一区二区| 国产99久久精品| 亚洲国产成人精品视频| 精品福利一区二区三区免费视频| 懂色av中文一区二区三区| 亚洲免费成人av| 26uuu亚洲综合色欧美 | 欧美日韩中文字幕一区| 国产一区二区电影| 亚洲电影中文字幕在线观看| 精品久久久久一区| 91欧美一区二区| 奇米亚洲午夜久久精品| 亚洲免费av网站| 久久久蜜臀国产一区二区| 色婷婷国产精品| 国产黄色91视频| 秋霞成人午夜伦在线观看| 中文字幕制服丝袜一区二区三区| 5858s免费视频成人| caoporn国产精品| 国内久久精品视频| 午夜视黄欧洲亚洲| 综合电影一区二区三区| 欧美成人高清电影在线| 色综合久久88色综合天天免费| 精品一区二区三区欧美| 亚洲在线成人精品| 中文字幕国产一区二区| 欧美成人三级在线| 欧美日免费三级在线|