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

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

?? usbex.c

?? 使用ch375和stc 51寫的usb鼠標的代碼
?? C
字號:
/*;CH372/CH375 USB device mode & external firmware
; U2(AT89C51) Program
;
; Website:  http://winchiphead.com
; Email:    tech@winchiphead.com
; Author:   W.ch 2003.12, 2005.03
;
;****************************************************************************
CH375 外部固件方式范例
這里僅處理標準請求和端點2的簡單讀寫

*/

/* MCS-51單片機C語言的示例程序 */
#pragma NOAREGS
#include <reg52.h>
#include "CH375INC.H"

typedef	union _REQUEST_PACK{
	unsigned char  buffer[8];
	struct{
		unsigned char	 bmReuestType;    	 //標準請求字
		unsigned char	 bRequest;		   	//請求代碼
		unsigned int     wValue;			//特性選擇高
		unsigned int     wIndx;				//索引
		unsigned int     wLength;				//數據長度
	}r;
} mREQUEST_PACKET,	*mpREQUEST_PACKET;

//設備描述符
unsigned char  code DevDes[]={
						0x12			//描述符大小			
					  , 0x01			//常數DEVICE
					 , 0x10				//USB規范版本信息
				     , 	0x01
					,   0xFF			//類別碼,
					,  0x80				//子類別碼	
					,   0x37			//協議碼
					,  0x08				//端點0的最大信息包大小
					,  0x48				//廠商ID
					,   0x43
					,   0x37			//產品ID	
					,   0x55
					,   0x00			//設備版本信息
					,   0x01
					,   0x00			//索引值	
					,   0x00
					,   0x00
					,   0x01			//可能配置的數目	
					,   00				//無意義
					,   00
					,   00
					,	00
					,	00
					,	00
					};
//配置描述符
unsigned char   code ConDes[]={			//配置描述符
					  0x09					//描述符大小
					,  0x02					//常數CONFIG
					,  0x27					//此配置傳回所有數據大小
					,  0x00					//
					,  0x01					//接口數
					,  0x01					//配置值
					,  0x00					//索引
					,  0x80					//電源設置
					,  0x40					//需要總線電源
										//接口描述符
					,  0x09					//描述符大小								
					,  0x04					//常數INTERFACE				
					,  0x00					//識別碼
					,  0x00					//代替數值
					,  0x03					//支持的端點數
					,  0xFF					//類別碼
					,  0x80					//子類別碼
					,  0x37					//協議碼
					,  0x00					//索引
										//端點描述符
					,  0x07					//述符大小
					,  0x05					//常數ENDPOINT
					,  0x82					//端點數目及方向
					,  0x02					//支持的傳輸類型
					,  0x40					//支持的最大信息包大小
					,  0x00
					,  0x00					//
				
					,  0x07
					,  0x05
					,  0x02
					,  0x02
					,  0x40
					,  0x00
					,  0x00
					
					,  0x07
					,  0x05
					,  0x81
					,  0x03
					,  0x08
					,  0x00
					,  0x01

					,  0x07
					,  0x05
					,  0x01
					,  0x02
					,  0x08
					,  0x00
					,  0x00
				};		//配置描述符
unsigned char  code LangDes[]={0x04,0x03,0x09,0x04};		//語言描述符
unsigned char  code SerDes[]={0x12,0x03,'C',0,'H',0,'3',0,'7',0,'5',0,'U',0,'S',0,'B',0};		//字符串描述符

unsigned char mVarSetupRequest;						//	;USB請求碼
unsigned char mVarSetupLength;					//		;后續數據長度
unsigned char  code * VarSetupDescr;						//	;描述符偏移地址

unsigned char VarUsbAddress	;					//

bit CH375FLAGERR;						//錯誤清0
bit	CH375CONFLAG;
					                     //配置標志

unsigned char volatile xdata CH375_CMD_PORT _at_ 0x7fff;		/* CH375命令端口的I/O地址 */
unsigned char volatile xdata CH375_DAT_PORT _at_ 0x3fff;		/* CH375數據端口的I/O地址 */

mREQUEST_PACKET  request;
sbit  CH375ACT  = P1^0;


/* 延時2微秒,不精確 */
void Delay1us(){
	;
}

void	Delay2us( )
{
	unsigned char i;
#define DELAY_START_VALUE	1  								/* 根據單片機的時鐘選擇初值,20MHz以下為0,30MHz以上為2 */
	for ( i=DELAY_START_VALUE; i!=0; i-- );
}

/* 延時50毫秒,不精確 */
void	Delay50ms( )
{
	unsigned char i, j;
	for ( i=200; i!=0; i-- ) for ( j=250; j!=0; j-- );
}

/* 將PC機的低字節在前的16位字數據轉換為C51的高字節在前的數據 */
//unsigned int	BIG_ENDIAN( unsigned int value )
//{
//	unsigned int  in, out;
//	in = value;
//	((unsigned char *)&out)[1] = ((unsigned char *)&in)[0];
//	((unsigned char *)&out)[0] = ((unsigned char *)&in)[1];
//	return( out );
//}

void CH375_WR_CMD_PORT( unsigned char cmd ) { 				 /* 向CH375的命令端口寫入命令,周期不小于4uS,如果單片機較快則延時 */
	//delay2us();
	CH375_CMD_PORT=cmd;
	Delay2us( );
}

void CH375_WR_DAT_PORT( unsigned char dat ) { 				 /* 向CH375的數據端口寫入數據,周期不小于1.5uS,如果單片機較快則延時 */
	CH375_DAT_PORT=dat;
	Delay1us();  											/* 因為MCS51單片機較慢所以實際上無需延時 */
}

unsigned char CH375_RD_DAT_PORT() {  						/* 從CH375的數據端口讀出數據,周期不小于1.5uS,如果單片機較快則延時 */
	Delay1us( );  										/* 因為MCS51單片機較慢所以實際上無需延時 */
	return( CH375_DAT_PORT );

}
/* CH375初始化子程序 */
void	CH375_Init( )
{
/* 設置USB工作模式, 必要操作 */
	CH375_WR_CMD_PORT( CMD_SET_USB_MODE );
	CH375_WR_DAT_PORT( 1 );  									/* 設置為使用內置固件的USB設備方式 */
	for ( ;; ) {  											/* 等待操作成功,通常需要等待10uS-20uS */
		if ( CH375_RD_DAT_PORT( )==CMD_RET_SUCCESS ) break;
	}

/* 下述啟用中斷,假定CH375連接在INT0 */
	IT0 = 0;  /* 置外部信號為低電平觸發 */
	IE0 = 0;  /* 清中斷標志 */
	EX0 = 1;  /* 允許CH375中斷 */
}
//*********************************************************

//*********************************************************
//端點0數據上傳
void mCh375Ep0Up(){
	unsigned char i,len;
	if(mVarSetupLength){												//長度不為0傳輸具體長度的數據
		if(mVarSetupLength<=8){
			len=mVarSetupLength;
			mVarSetupLength=0;
        }	//長度小于8則長輸要求的長度
		else{
			len=8;
			mVarSetupLength-=8;
		}							                        		//長度大于8則傳輸8個,切總長度減8
	    CH375_WR_CMD_PORT(CMD_WR_USB_DATA3);						//發出寫端點0的命令
       	CH375_WR_DAT_PORT(len);										//寫入長度
    	for(i=0;i!=len;i++)
        CH375_WR_DAT_PORT(request.buffer[i]);	              		//循環寫入數據
    }
	else{
		CH375_WR_CMD_PORT(CMD_WR_USB_DATA3);						//發出寫端點0的命令
		CH375_WR_DAT_PORT(0);					                   //上傳0長度數據,這是一個狀態階段
	}
}


//*********************************************************

//復制描述符以便上傳
void mCh375DesUp(){
	unsigned char k;        
	for (k=0; k!=8; k++ ) {
         request.buffer[k]=*VarSetupDescr;  								//依次復制8個描述符,
         VarSetupDescr++;
    }
}

/* CH375中斷服務程序INT0,使用寄存器組1 */
void	mCH375Interrupt( ) interrupt 0 using 1
{
	unsigned char InterruptStatus;
	unsigned char length, c1, len;
	unsigned char   *pBuf;
	unsigned char   mBuf[64];
	CH375_WR_CMD_PORT(CMD_GET_STATUS);  									/* 獲取中斷狀態并取消中斷請求 */
	InterruptStatus =CH375_RD_DAT_PORT();  									/* 獲取中斷狀態 */
	IE0 = 0;  																/* 清中斷標志,對應于INT0中斷 */
	switch(InterruptStatus){  // 分析中斷狀態
		case  USB_INT_EP2_OUT:  											// 批量端點下傳成功 
			pBuf=mBuf;																	//數據未處理
			CH375_WR_CMD_PORT(CMD_RD_USB_DATA);									//發出讀數據命令
			length=CH375_RD_DAT_PORT();											//首先讀出的是長度														
			for(len=0;len!=length;len++,pBuf++)*pBuf=CH375_RD_DAT_PORT();	//將數據讀入到緩沖區			 
			pBuf=mBuf;
// 演示回傳
			CH375_WR_CMD_PORT(CMD_WR_USB_DATA7);								//發出寫上傳端點命令
			CH375_WR_DAT_PORT(length);	
			for(len=0;len!=length;len++,pBuf++)CH375_WR_DAT_PORT(*pBuf);	//將數據寫入上傳端點
			break;
		case   USB_INT_EP2_IN:												 //批量端點上傳成功,未處理
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);								//釋放緩沖區
			break;
		case   USB_INT_EP1_IN:	 											//中斷端點上傳成功,未處理
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);								//釋放緩沖區
			break;
		case   USB_INT_EP1_OUT:	  											//中斷端點下傳成功,未處理
			CH375_WR_CMD_PORT(CMD_RD_USB_DATA);									//發出讀數據命令
			if(length=CH375_RD_DAT_PORT()){										//長度為0跳出
				for(len=0;len!=length;len++)c1=CH375_RD_DAT_PORT();					//取出下傳數據
			}
//			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);								//釋放緩沖區,如果前面沒有CMD_RD_USB_DATA命令則使用本命令
			break;
		case   USB_INT_EP0_SETUP: 											//控制端點建立成功
	    	CH375_WR_CMD_PORT(CMD_RD_USB_DATA);
			length=CH375_RD_DAT_PORT();
			for(len=0;len!=length;len++)request.buffer[len]=CH375_RD_DAT_PORT();  // 取出數據
			if(length==0x08){
			    mVarSetupLength=request.buffer[6]&0x7f;							//控制傳輸數據長度最大設置為128
				if((c1=request.r.bmReuestType)&0x40){         					 //廠商請求,未處理
				}
				if((c1=request.r.bmReuestType)&0x20){          					//類請求,未處理
				}
				if(!((c1=request.r.bmReuestType)&0x60)){          				//標準請求
					mVarSetupRequest=request.r.bRequest;							//暫存標準請求碼
					switch(request.r.bRequest){  // 分析標準請求
						case DEF_USB_CLR_FEATURE:									//清除特性
							if((c1=request.r.bmReuestType&0x1F)==0X02){					//不是端點不支持
								switch(request.buffer[4]){
									case 0x82:
										CH375_WR_CMD_PORT(CMD_SET_ENDP7);					//清除端點2上傳
										CH375_WR_DAT_PORT(0x8E);                			//發命令清除端點
										break;
									case 0x02:
										CH375_WR_CMD_PORT(CMD_SET_ENDP6);
										CH375_WR_DAT_PORT(0x80);							//清除端點2下傳
										break;
									case 0x81:
										CH375_WR_CMD_PORT(CMD_SET_ENDP5);					//清除端點1上傳
										CH375_WR_DAT_PORT(0x8E);
										break;
									case 0x01:
										CH375_WR_CMD_PORT(CMD_SET_ENDP4);					//清除端點1下傳
										CH375_WR_DAT_PORT(0x80);
										break;
									default:
										break;
								}
							}
							else{
								CH375FLAGERR=1;								//不支持的清除特性,置錯誤標志
							}
							break;
						case DEF_USB_GET_STATUS:								//獲得狀態
							request.buffer[0]=0;
							request.buffer[1]=0;								//上傳狀態
							break;
						case DEF_USB_SET_ADDRESS:								//設置地址
							VarUsbAddress=request.buffer[2];					//暫存USB主機發來的地址
							break;
						case DEF_USB_GET_DESCR: 								//獲得描述符
							if(request.buffer[3]==1)							//設備描述符上傳
								VarSetupDescr=DevDes;
							else if(request.buffer[3]==2)		 					//配置描述符上傳
								VarSetupDescr=ConDes;
							else if(request.buffer[3]==3) {
								if ( request.buffer[2]== 0 ) VarSetupDescr=LangDes;
								else VarSetupDescr=SerDes; 						//做字符串處理
							}
							mCh375DesUp();											//其余描述符不支持					          							
							break;
						case DEF_USB_GET_CONFIG:									//獲得配置
							request.buffer[0]=0;									//沒有配置則傳0
							if(CH375CONFLAG) request.buffer[0]=1;									//已經配置則傳1;這是在描述符里規定的
							break;
						case DEF_USB_SET_CONFIG:                 					//設置配置
							CH375CONFLAG=0;
							CH375ACT=1;
							if ( request.buffer[2] != 0 ) {
								CH375CONFLAG=1;											//設置配置標志
								CH375ACT=0;												//輸出配置完成信號
							}
							break;
						case DEF_USB_GET_INTERF:										//得到接口
							request.buffer[0]=1;									//上傳接口數,本事例只支持一個接口
							break;
						default :
							CH375FLAGERR=1;											//不支持的標準請求
							break;
					}
				}
			}
			else {  //不支持的控制傳輸,不是8字節的控制傳輸
				CH375FLAGERR=1;
			}
			if(!CH375FLAGERR) mCh375Ep0Up();										//沒有錯誤/調用數據上傳,,長度為0上傳為狀態
			else {
				CH375_WR_CMD_PORT(CMD_SET_ENDP3);								//設置端點1為STALL,指示一個錯誤
				CH375_WR_DAT_PORT(0x0F);
			}
			break;
		case   USB_INT_EP0_IN:													//控制端點上傳成功
			if(mVarSetupRequest==DEF_USB_GET_DESCR){								//描述符上傳
				mCh375DesUp();
				mCh375Ep0Up();															
			}
			else if(mVarSetupRequest==DEF_USB_SET_ADDRESS){							//設置地址
				CH375_WR_CMD_PORT(CMD_SET_USB_ADDR);
				CH375_WR_DAT_PORT(VarUsbAddress);								//設置USB地址,設置下次事務的USB地址
			}
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);								//釋放緩沖區
			break;
		case   USB_INT_EP0_OUT:													//控制端點下傳成功
			CH375_WR_CMD_PORT(CMD_RD_USB_DATA);									//發出讀數據命令
			if(length=CH375_RD_DAT_PORT()){										//長度為0跳出
				for(len=0;len!=length;len++)c1=CH375_RD_DAT_PORT();					//取出下傳數據
			}
			break;
		default:
			if((InterruptStatus&0x03)==0x03){									//總線復位
				CH375FLAGERR=0;													//錯誤清0
				CH375CONFLAG=0;													//配置清0
				mVarSetupLength=0;
				CH375ACT=1;														//清配置完成輸出
			}
			else{																//命令不支持
				;
			}
			CH375_WR_CMD_PORT (CMD_UNLOCK_USB);									//釋放緩沖區
			break;
	}
}

main( ) {
	Delay50ms( );	/* 延時等待CH375初始化完成,如果單片機由CH375提供復位信號則不必延時 */
	CH375_WR_CMD_PORT( CMD_RESET_ALL );			//似乎是他模擬了一次插拔
	Delay50ms( );Delay50ms( );Delay50ms( );Delay50ms( );Delay50ms( );
	CH375_Init( );  /* 初始化CH375 */
    EA=1;
    while(1);		/* 主程序 */
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区视频| 成人av在线影院| 国产午夜精品久久久久久久| 国产毛片精品视频| 亚洲色图在线播放| 日韩一区二区在线看| 成人精品视频.| 亚洲电影在线免费观看| 日韩欧美另类在线| 成人国产精品视频| 日韩av电影免费观看高清完整版 | 国产美女精品在线| 青青草国产成人av片免费| 国产精品久久久久桃色tv| 精品成人佐山爱一区二区| 制服丝袜成人动漫| 欧美性生活大片视频| 在线亚洲人成电影网站色www| 国产一区二区毛片| 久久国产尿小便嘘嘘尿| 久久99久久久欧美国产| 日韩不卡免费视频| 日本在线不卡一区| 天天综合色天天| 五月婷婷综合在线| 全国精品久久少妇| 久久精品国内一区二区三区 | 美女一区二区三区| 免费在线看一区| 九色综合狠狠综合久久| 久久精品国产精品亚洲红杏| 久草精品在线观看| 成人性视频免费网站| 欧美一区2区视频在线观看| 欧美成人女星排行榜| 国产91精品精华液一区二区三区| 国产一区999| 成人精品国产一区二区4080 | 亚洲国产成人porn| 不卡的看片网站| 麻豆视频一区二区| 国产精品视频在线看| 26uuu精品一区二区| 国产无一区二区| 亚洲精品高清在线| 久久黄色级2电影| 不卡一区中文字幕| 欧美肥妇bbw| 亚洲视频在线观看一区| 日本特黄久久久高潮| 风间由美性色一区二区三区| 在线免费观看不卡av| 欧美mv日韩mv亚洲| 亚洲一线二线三线视频| 国产精品一区二区在线看| 欧美三级中文字幕在线观看| 日韩精品中文字幕在线不卡尤物| 国产精品欧美久久久久无广告| 亚洲成人免费观看| 成人国产精品免费观看视频| 8v天堂国产在线一区二区| 久久午夜老司机| 秋霞电影一区二区| 欧美日韩一区二区在线观看| 国产精品区一区二区三| 国产乱码字幕精品高清av| 91精品久久久久久久99蜜桃| 中文字幕一区二区三区四区不卡| 狠狠v欧美v日韩v亚洲ⅴ| 3d动漫精品啪啪1区2区免费| 亚洲精品免费电影| 91视视频在线观看入口直接观看www | 欧美图片一区二区三区| 一区二区在线观看视频在线观看| 国产在线精品一区二区| 久久综合九色综合97婷婷| 韩国理伦片一区二区三区在线播放| 91精品国产aⅴ一区二区| 亚洲国产精品一区二区www | 粉嫩13p一区二区三区| 欧美经典一区二区| 成人黄色网址在线观看| 亚洲欧洲制服丝袜| 波多野结衣亚洲一区| 国产精品剧情在线亚洲| 一本大道综合伊人精品热热| 亚洲自拍偷拍网站| 欧美一级免费大片| 久久69国产一区二区蜜臀| 中文字幕二三区不卡| 色88888久久久久久影院野外| 亚洲综合一区二区| 欧美精品一区二区三区在线播放| 国产精品一二三四| 亚洲久本草在线中文字幕| 6080yy午夜一二三区久久| 国产精品综合一区二区| 亚洲天堂久久久久久久| 欧美一区二区久久| eeuss影院一区二区三区| 午夜久久电影网| 国产亚洲欧美日韩在线一区| 欧美视频在线不卡| 高清成人在线观看| 蜜臀av一区二区在线观看| 国产精品视频麻豆| 久久综合久久综合亚洲| 99久久精品免费精品国产| 美女网站色91| 亚洲成人av一区二区三区| 国产精品视频一二三| 欧美成人一区二区三区片免费 | 欧美一区二区免费观在线| av一区二区不卡| 国产+成+人+亚洲欧洲自线| 日本特黄久久久高潮| 夜色激情一区二区| 亚洲免费色视频| 国产精品乱码一区二区三区软件| 久久免费视频一区| 日韩欧美美女一区二区三区| 欧美精品成人一区二区三区四区| 色综合网站在线| 色哟哟国产精品| 91蜜桃婷婷狠狠久久综合9色| 成人av在线播放网址| 99re成人精品视频| 日本女人一区二区三区| 日韩中文字幕一区二区三区| 五月综合激情日本mⅴ| 亚洲国产欧美一区二区三区丁香婷| 亚洲精品国产一区二区精华液| 亚洲资源在线观看| 日韩av中文字幕一区二区| 日韩 欧美一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 韩国av一区二区三区四区| 日日摸夜夜添夜夜添国产精品| 午夜久久久影院| 国产美女精品在线| www.成人网.com| 欧美人伦禁忌dvd放荡欲情| 日韩亚洲欧美在线| 国产三级精品三级在线专区| 亚洲日韩欧美一区二区在线| 亚洲一区二区欧美激情| 久久66热偷产精品| 99国产精品久久久久久久久久| 欧美日韩国产另类不卡| 国产日产亚洲精品系列| 亚洲午夜日本在线观看| 国模无码大尺度一区二区三区| kk眼镜猥琐国模调教系列一区二区| 欧美日韩精品欧美日韩精品一| 日韩欧美高清在线| 亚洲免费av网站| 精品制服美女久久| 欧美在线你懂得| 中文字幕在线视频一区| 美女网站一区二区| 欧洲国产伦久久久久久久| 久久久久久久综合日本| 日本伊人精品一区二区三区观看方式| 大尺度一区二区| 国产亚洲欧美中文| 久久99精品网久久| 91精品国产综合久久婷婷香蕉| 日韩一区欧美一区| 福利一区二区在线观看| 久久综合久色欧美综合狠狠| 免费观看30秒视频久久| 欧美色图激情小说| 一区二区三区四区不卡在线| 成人sese在线| 国产精品丝袜一区| 国产成人免费视频网站 | 亚洲精品中文字幕乱码三区| 国产福利一区二区三区视频在线| 日韩美女在线视频| 免费人成在线不卡| 国产成人精品免费网站| 久久久亚洲精品一区二区三区| 强制捆绑调教一区二区| 精品国产91乱码一区二区三区| 久久99久久精品欧美| 久久青草国产手机看片福利盒子| 狠狠色狠狠色合久久伊人| 国产亚洲制服色| 91网站最新地址| 国产成人精品影视| 久久久高清一区二区三区| 国产高清在线观看免费不卡| 国产精品久久久99| 欧美午夜一区二区三区免费大片| 日精品一区二区三区| 国产女主播视频一区二区| 欧美性xxxxxxxx| 国产中文一区二区三区| 日韩毛片在线免费观看| 91精品国产综合久久香蕉的特点|