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

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

?? host_811.c

?? 基于Embest開發環境
?? 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
// 此函數完成setup/in/out事務的傳輸;   相當重要的usb 傳輸函數
//*****************************************************************************************


int usbXfer(BYTE usbaddr, BYTE endpoint, BYTE pid, BYTE iso, WORD wPayload, WORD wLen, BYTE *buffer)
{  
	//~~usbaddr設備號(udev的數組元素標號),endpoint是端點號,pid是包標識符
	//~~wlen是發送接收數據長度,buffer是數據緩沖區,wpayload是最大載荷,是811中緩沖區長度
	
	BYTE  	cmd, result, timeout, intr;		
	//~~cmd寫給EP0Control的值,result是ep0中斷后EP0Status的值,intr是讀取IntStatus的值
	
	BYTE  	xferLen, bufLen, data0, data1, dataX, addr;		//~~去掉xdata
	//~~xferlen是每次實際傳送的數據長度,data0/1是811中data0/1的緩沖區地址,
	//~~buflen記錄buffer中數據傳送到哪個位子了
	//~~addr記錄第二次以后的傳送是data0的buffer還是data1的buffur
	//~~datax是幫助addr確定本次傳送是data0的buffer中的數據還是data1的buffer中的數據
	
	//------------------------------------------------
	// 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
	//~~如果要傳輸的數據長度大于相應端點的最大包尺寸就先發送最大包長度的數據
	//------------------------------------------------
	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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91蜜桃网址入口| 欧美日韩高清在线| 香蕉乱码成人久久天堂爱免费| 精品日韩99亚洲| 色偷偷一区二区三区| 国产美女娇喘av呻吟久久| 一区二区三区四区亚洲| 久久久久久麻豆| 911精品国产一区二区在线| 99久久伊人精品| 国产永久精品大片wwwapp| 五月天精品一区二区三区| 日韩美女精品在线| 国产视频911| 欧美成人在线直播| 欧美放荡的少妇| 91久久奴性调教| 97se亚洲国产综合自在线| 国产美女在线精品| 久久精品国产一区二区| 亚洲va欧美va国产va天堂影院| 最新国产成人在线观看| 国产欧美日本一区二区三区| 亚洲精品一线二线三线| 日韩一区二区精品葵司在线| 欧美日韩一区视频| 欧美写真视频网站| 91国偷自产一区二区使用方法| 9久草视频在线视频精品| 国产成人免费网站| 国产精品66部| 国产精品一二三| 国内久久精品视频| 久久国产成人午夜av影院| 日韩综合一区二区| 日韩高清在线一区| 午夜精品久久久久久久久| 亚洲国产综合色| 亚洲午夜私人影院| 午夜精品在线视频一区| 午夜视频在线观看一区二区三区| 亚洲高清一区二区三区| 亚洲不卡av一区二区三区| 视频在线在亚洲| 色综合咪咪久久| 91麻豆免费视频| 欧美亚洲国产bt| 欧美另类高清zo欧美| 69堂精品视频| 亚洲精品一区二区三区99| 久久久五月婷婷| 国产精品久久久久影院老司| 自拍视频在线观看一区二区| 亚洲五月六月丁香激情| 日韩av网站免费在线| 久久精品72免费观看| 国产高清成人在线| 99r精品视频| 欧美高清性hdvideosex| 日韩欧美一二区| 久久久99精品免费观看不卡| 中文字幕在线观看一区二区| 一区二区三区高清不卡| 五月婷婷综合网| 国产一区二区看久久| 成人avav在线| 欧美男男青年gay1069videost | 亚洲精品网站在线观看| 亚洲一区二区三区中文字幕 | 亚洲在线免费播放| 天堂成人免费av电影一区| 精品一区二区av| av一区二区久久| 在线不卡一区二区| 国产亚洲精品福利| 一区二区三区欧美日| 免费欧美高清视频| a级高清视频欧美日韩| 欧美伦理影视网| 欧美精彩视频一区二区三区| 亚洲一区二区三区四区在线免费观看 | 欧美三级电影在线观看| 精品国产91洋老外米糕| 综合久久久久久| 麻豆专区一区二区三区四区五区| 成人av网址在线| 日韩免费电影网站| 亚洲人成人一区二区在线观看 | av资源网一区| 日韩欧美一区中文| 亚洲特级片在线| 久久精品久久精品| 欧美亚洲日本一区| 中文字幕欧美日韩一区| 性久久久久久久久| 波多野结衣亚洲| 精品国产一区二区三区忘忧草| 亚洲色图一区二区| 国产中文字幕精品| 欧美喷潮久久久xxxxx| 国产精品丝袜一区| 久久se这里有精品| 欧美日韩一区精品| 亚洲视频免费在线| 国产精品夜夜嗨| 日韩写真欧美这视频| 一区二区日韩av| 懂色av中文字幕一区二区三区| 日韩欧美不卡在线观看视频| 亚洲一级不卡视频| 91老师国产黑色丝袜在线| 久久久久久久久久久久久夜| 奇米色一区二区| 欧美午夜在线观看| 亚洲欧美一区二区在线观看| 国产麻豆成人传媒免费观看| 日韩美女一区二区三区| 日韩和欧美一区二区| 欧美日韩综合在线| 亚洲人妖av一区二区| www..com久久爱| 中文字幕欧美激情| 国产成人亚洲综合a∨婷婷图片| 精品国产91九色蝌蚪| 日本不卡不码高清免费观看| 欧美久久久久久蜜桃| 亚洲成av人片在线| 欧美日韩色一区| 亚洲第一久久影院| 欧美日韩精品电影| 亚洲成人777| 在线不卡一区二区| 蜜臀91精品一区二区三区 | 欧美一区二区在线不卡| 丝袜美腿亚洲一区| 欧美精品在线一区二区| 日本亚洲免费观看| 欧美mv日韩mv| 激情综合五月天| 国产网红主播福利一区二区| 国产风韵犹存在线视精品| 国产区在线观看成人精品| 高清国产午夜精品久久久久久| 国产精品欧美经典| 91在线视频18| 一区二区三区在线视频免费 | 成人免费观看男女羞羞视频| 国产精品久久久久一区| 91搞黄在线观看| 丝袜脚交一区二区| ww久久中文字幕| 东方aⅴ免费观看久久av| 亚洲欧洲性图库| 欧洲国内综合视频| 日本亚洲三级在线| 久久美女高清视频| 99久久婷婷国产| 亚洲成人7777| 久久免费视频一区| 91偷拍与自偷拍精品| 性久久久久久久久久久久| 欧美tk丨vk视频| 成人黄色网址在线观看| 亚洲国产日韩a在线播放性色| 欧美一级欧美一级在线播放| 国产乱码精品一品二品| 亚洲三级在线免费| 欧美一区二区三级| 高清在线观看日韩| 亚洲电影欧美电影有声小说| 精品国产3级a| 欧美性大战xxxxx久久久| 极品美女销魂一区二区三区免费 | 亚洲视频一二三| 欧美一区二区三区婷婷月色| 国产乱人伦偷精品视频免下载| 亚洲日本电影在线| 精品国产区一区| 色av成人天堂桃色av| 韩国女主播一区| 亚洲一区二区三区中文字幕 | 香蕉乱码成人久久天堂爱免费| 2017欧美狠狠色| 欧美亚洲综合色| 国产福利91精品一区| 日日夜夜免费精品视频| 国产精品久久久久影院| 日韩欧美中文字幕公布| 91色在线porny| 国产一区二区三区| 午夜精品久久久久久久| 国产精品高潮久久久久无| 日韩欧美国产1| 精品视频在线看| 成人一道本在线| 国内久久精品视频| 免费看日韩a级影片| 亚洲在线中文字幕| 18欧美亚洲精品| 精品盗摄一区二区三区|