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

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

?? chap_9.c

?? zlg開發套件ucos系統下讀寫e2prom源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
																	//讀取請求類型		get the request type
	if (bRecipient == USB_RECIPIENT_DEVICE							//對設備請求		the request of device	
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) {
		bEPPflags.bits.remote_wakeup = 1;							//置1遠程喚醒標志	set the flag of wakeup remove
		single_transmit(0, 0);										//返回一個空的數據表示執行完畢
	}																//indicate that transmit end by transmitting a empty packet	
	
	else if (bRecipient == USB_RECIPIENT_ENDPOINT					//對端點請求		get request of endpoint
		&& ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL) {
		endp = (INT8U)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
		if ((ControlData.DeviceRequest.wIndex & (INT8U)USB_ENDPOINT_DIRECTION_MASK) == 0){
			if (endp == 0)											
			    endp = -1;											//被請求的端點為控制OUT the requested endpoint is control OUT
		}
		
		D13_SetEndpointStatus(endp + 1,D13REG_EPSTS_STALL);			//禁止端點				stall  endpoint
		single_transmit(0, 0);										//返回一個空的數據表示執行完畢
	} else															//indicate that transmit end by transmitting a empty packet
		stall_ep0();					//沒有該請求,返回STALL
}										//the unknown request,transmit stall


/************************************************************************************************************************
** 函數名稱: set_address()					Name:		set_address()
** 功能描述: 設置地址						Function:	set address
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
************************************************************************************************************************/
void set_address(void)
{
	D13_SetAddressEnable((INT8U)(ControlData.DeviceRequest.wValue &
						 DEVICE_ADDRESS_MASK), 1);		//使能USB設備地址		 enable USB device address
	single_transmit(0, 0);								//發送一個空的數據響應   reponse by transmitting a empty packet 
}


/************************************************************************************************************************
** 函數名稱: get_descriptor()				Name:		get_descriptor()
** 功能描述: 獲取描述符						Function:	get descriptor
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
*************************************************************************************************************************/
void get_descriptor(void)
{
	INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue);			//讀取請求的描述符類型 get the request descriptor type

	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE){						//要獲取設備描述符	 want to get the device descriptor		
		code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
	
	}else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) {		//要獲取其它描述符   want to get other descriptor
		  		if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH){ 
					 ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;
				}
			    code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
			    														//發送描述符內容	transmit the content of descriptor	
	   	   }else
				stall_ep0();					//沒有該請求,返回STALL	the unknown request,transmit stall
}


/*************************************************************************************************************************
** 函數名稱: get_configuration()			Name:		get_configuration()
** 功能描述: 獲取USB事件的配置值			Function:	get the configuration value of USB events
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
*************************************************************************************************************************/
void get_configuration(void)
{
	INT8U c = bEPPflags.bits.configuration;	//取出配置值		get the configuration value
		
	single_transmit(&c, 1);					//發送配置值		transmit the configuration value
}

/************************************************************************************************************************
** 函數名稱: set_configuration()			Name:		set_configuration()
** 功能描述: 設置USB事件的配置值			Function:	set the configuration value of USB events						
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
*************************************************************************************************************************/
void set_configuration(void)
{
	if (ControlData.DeviceRequest.wValue == 0) {			
		//配置值不對,設備進入未配置狀態		the configuration value is error,device enter no configuration status
		single_transmit(0, 0);								//發向一個空包響應	respone by transmitting a empty packet
		bEPPflags.bits.configuration = 0;					//標記未配置		mark the USB be not configurated
		init_unconfig();
		
	} else if (ControlData.DeviceRequest.wValue == 1) {		//配置設備			configurate the device
		single_transmit(0, 0);								//發向一個空包響應	response by transmittign a empty packet
		init_unconfig();
		init_config();
		bEPPflags.bits.configuration = 1;					//標志已配置		mark the USB has be configurated
	} else
		stall_ep0();						//沒有該請求,返回STALL     the unknown request,transmit stall
}


/************************************************************************************************************************
** 函數名稱: get_interface()				Name:		get_interface()
** 功能描述: 獲取接口信息					Function:	get the information of interface
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
*************************************************************************************************************************/
void get_interface(void)
{
	INT8U txdat = 0;						//本設備只有一個接口	the device has only a interface
	single_transmit(&txdat, 1);				//發送一個字節			transmit a byte
}


/************************************************************************************************************************
** 函數名稱: set_interface()				Name:		set_interface()
** 功能描述: 設置接口信息					Function:	set the information of interface
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
************************************************************************************************************************/
void set_interface(void)
{
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
		single_transmit(0, 0);			   //回復一個空的數據表示執行完畢	respone by transmitting a empty packet
	else		
		stall_ep0();					   //沒有該請求,返回STALL			the unknown request,transmit stall		
}

/***********************************************************************************************************************
** 函數名稱: control_handler()				Name:		control_handler()
** 功能描述: 控制傳輸處理函數				Function:	the function of dealing with control transfer
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
************************************************************************************************************************/
void control_handler(void)
{
	INT8U type, req;

	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
												//讀取請求代碼			get the request code
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
	if (type == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[req])();		//標準請求處理			the normal request
	//else if (type == USB_VENDOR_REQUEST)		//廠商請求				the vector request
	//	(*VendorDeviceRequest[req])();
	//else if(type == USB_CLASS_REQUEST)
	//	(*ClassDeviceRequest[req])();			//類請求,如大容量類		class request,example mass class
	else
		stall_ep0();							//無效請求,返回STALL		the unknown request,transmit stall		
}

/************************************************************************************************************************
** 函數名稱: ep0_rxdone()					Name:		ep0_rxdone()
** 功能描述: 通過端點0接收數據				Function:	receive datat via endpoint 0
** 輸	 入: 無								Input:		NULL
** 輸	 出: 無								Output:		NULL
************************************************************************************************************************/
void ep0_rxdone(void)
{
	INT8U ep_last, i;
	INT8U req[sizeof(DEVICE_REQUEST)];						 //SETUP包接收緩沖區

	ep_last = D13_GetEndpointStatusWInteruptClear(EPINDEX4EP0_CONTROL_OUT);			
															 //清除控制OUT端點中斷寄存器標志,取得該端點處理狀態
															 //clear interrupt register flag of control out,get the endpoint status
	if (ep_last & D13REG_EPSTS_SETUP) {					 	 //如果收到了建立包(Setup包)	  if receive the SETUP packet
		ControlData.wLength = 0;							
		ControlData.wCount = 0;
		if(D13_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req) 
							!= sizeof(DEVICE_REQUEST) ) {
												 			 //從控制OUT端點讀8個字節失敗	  read 8 bytes fail from control out
			stall_ep0();									 //停止端點0					  stall endpoint 0
			bEPPflags.bits.control_state = USB_IDLE;		 //設置為等待狀態			      set idle status
			return;
		}
		/******* 以下語句通信中的解決大小端問題,使該函數與編譯器無關  resolve big-little endian ****/
		ControlData.DeviceRequest.bmRequestType = req[0];
		ControlData.DeviceRequest.bRequest	    = req[1];
		ControlData.DeviceRequest.wValue 	 	= req[3] * 256 + req[2]; 
		ControlData.DeviceRequest.wIndex        = req[5] * 256 + req[4];
		ControlData.DeviceRequest.wLength       = req[7] * 256 + req[6]; 
		
		/********  接收建立包成功 **********/
		D13_ClearBuffer(0);									 		 //清空接收緩沖區			  clear receive buffer	
		D13_AcknowledgeSETUP();								 		 //應答SETUP				  acknowledge SETUP
		ControlData.wLength = ControlData.DeviceRequest.wLength; 	 //取出要傳輸數據的總字節數
		ControlData.wCount = 0;
		if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) {
 																	 //如果是控制讀取		 	  control read 
 			 OSSemPost(pSetup_Event);								 //通知control_handler()處理Setup包
 			 														 //inform control_handler()	deal with SETUP packet		
			 bEPPflags.bits.control_state = USB_TRANSMIT;	         //設置為發送狀態    set transmit status
		}
		else{								 						 //如果是控制寫入	 control write
			  if (ControlData.DeviceRequest.wLength == 0) {
				  OSSemPost(pSetup_Event);							 //通知control_handler()處理Setup包
				  													 //inform control_handle() deal with SETUP packet
				  bEPPflags.bits.control_state = USB_IDLE;	       	 //設置為等待狀態    set idle status
			  }
			  else {
				    if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {	
																	 //數據長度出錯	   the length of data is error
					     bEPPflags.bits.control_state = USB_IDLE;	 //設置為等待狀態  set idele status
					     stall_ep0();								 //停止端點0	   stall endpoint 0
				    }
				    else
					    bEPPflags.bits.control_state = USB_RECEIVE;  //設置為接收狀態  set receive status
			  }// set command with data
		 }// else set command
	}// if setup packet

	/*****  下面為控制輸出的數據階段 data phase of control out ***************/
	else if (bEPPflags.bits.control_state == USB_RECEIVE) {	  	     //如果為接收狀態  receive status
			 i = D13_ReadEndpoint(0, EP0_PACKET_SIZE,
			 ControlData.dataBuffer + ControlData.wCount);	 	     //從端點0接收數據 receive data from endpoint 0
			 ControlData.wCount += i;
			 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {  	
			 	 OSSemPost(pSetup_Event);							 //通知control_handler()處理Setup包
			 	 													 //inform control_handle() deal with SETUP packet
				 bEPPflags.bits.control_state = USB_IDLE;	         //設置為等待狀態  set idle status
			 }
		 }else 
		  	 bEPPflags.bits.control_state = USB_IDLE;				 //設置等待狀態    set idle status
		 
	D13_ClearBuffer(0); 						//清除緩沖區0 clear ep0 buffer
}

/************************************************************************************************************************
** 函數名稱: ep0_txdone()						Name:		ep0_txdone()
** 功能描述: 通過端點索引 0 發送數據				Function:	send data via endpoint 0 
** 輸	 入: 無									Input:		NULL
** 輸	 出: 無									Output:		NULL
***********************************************************************************************************************/
void ep0_txdone(void)
{
	INT16 i = ControlData.wLength - ControlData.wCount;		//計算未發送的字節數   calculate the bytes that will be transmitted

	D13_GetEndpointStatusWInteruptClear(1); 				//清除中斷寄存器標志位 clear the interrupt flag of the interrupt register

	if (bEPPflags.bits.control_state != USB_TRANSMIT){		//非發送狀態		   if it is not the status of transmit,													
		single_transmit(0, 0);								//回復一個空包		   respone by transmitting a empty packet
		return;												//返回				   return
	}
	
	if( i >= EP0_PACKET_SIZE) {								//發送16個字節		   transmit 16 bytes
		D13_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;	
	}
	else if( i != 0) {										//發送所有字節 		   transmit all bytes
		D13_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;
		bEPPflags.bits.control_state = USB_IDLE;			//置狀態為等待狀態	   set idle status
	}
	else if (i == 0){
		D13_WriteEndpoint(1, 0, 0); 						//發送完畢,發0個字節   transmit zero bytes 
		bEPPflags.bits.control_state = USB_IDLE;			//置狀態為等待狀態	   set idle status
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美影院一区二区三区| 91精品办公室少妇高潮对白| 色狠狠综合天天综合综合| 蜜臀av一区二区| 日韩免费视频一区| 久久国产剧场电影| 国产精品丝袜久久久久久app| 国产自产v一区二区三区c| 久久亚洲私人国产精品va媚药| 丝袜亚洲另类欧美综合| 欧美一区二区三区免费| 激情深爱一区二区| 久久成人综合网| 国产aⅴ精品一区二区三区色成熟| 国产精品久久久久9999吃药| 欧美视频中文字幕| 欧美一区二区久久| 2019国产精品| 亚洲色图视频网| 国产日韩欧美一区二区三区乱码| 成人午夜激情视频| 日韩二区三区四区| 亚洲欧美另类图片小说| 日韩色视频在线观看| 91免费版在线| 国产福利一区在线| 爽好多水快深点欧美视频| 三级一区在线视频先锋| 久久99精品久久久久久动态图| 一区二区三区不卡视频在线观看| 久久午夜国产精品| 亚洲欧美偷拍卡通变态| 亚洲123区在线观看| 综合欧美一区二区三区| 午夜电影网亚洲视频| 亚洲午夜激情av| 综合网在线视频| 亚洲成人高清在线| 成人免费看黄yyy456| 欧美亚洲丝袜传媒另类| 亚洲精品一区二区三区在线观看| 欧美精品v日韩精品v韩国精品v| 色综合天天做天天爱| 国产91丝袜在线播放九色| 色菇凉天天综合网| 国产欧美一区二区三区沐欲| 午夜日韩在线观看| 91天堂素人约啪| 欧美www视频| 久久久久久一二三区| 国产色综合一区| 欧美激情在线一区二区| 欧美国产97人人爽人人喊| 五月综合激情网| 91在线观看成人| 国产喷白浆一区二区三区| 日韩高清不卡一区二区| 色先锋aa成人| 欧美日韩aaaaa| 日韩精品在线网站| 天堂久久一区二区三区| 99久久夜色精品国产网站| 99riav久久精品riav| 久久精品日产第一区二区三区高清版| 男女男精品网站| 成人av网站大全| 欧美三级日本三级少妇99| 欧美日韩一区在线观看| 国产精品国产a| 成人永久aaa| 国产三级一区二区| 国产91在线|亚洲| 亚洲国产精品成人综合| 国产伦精品一区二区三区视频青涩| 国产一二三精品| 久久综合国产精品| 久久99最新地址| 欧美电视剧在线观看完整版| 五月婷婷综合在线| 日韩一区二区高清| 久草精品在线观看| 久久综合资源网| 不卡一区二区三区四区| 国产精品卡一卡二| 99re66热这里只有精品3直播| 国产精品嫩草影院av蜜臀| 成年人网站91| 亚洲自拍偷拍图区| 国产精品一二三四| 色综合天天做天天爱| 亚洲色欲色欲www| 欧美日韩一卡二卡三卡| 视频一区二区三区中文字幕| 制服丝袜一区二区三区| 国产精品久久午夜| 91色porny蝌蚪| 亚洲成人你懂的| 亚洲精品在线电影| 波多野结衣视频一区| 91精品国产一区二区三区香蕉| 日韩精品一区第一页| 日韩你懂的在线观看| 国产综合久久久久久鬼色| 国产精品狼人久久影院观看方式| 97精品国产97久久久久久久久久久久| 亚洲男人的天堂av| 91精品欧美综合在线观看最新 | 国产成都精品91一区二区三| 国产精品久久久久一区| 欧美日本一区二区三区| 国产一区三区三区| 亚洲男人的天堂网| 欧美精品一区二区三区在线| 波多野结衣精品在线| 五月婷婷另类国产| 国产精品久久久久久久久久免费看| 欧美三级三级三级| 成人不卡免费av| 免费视频一区二区| 亚洲精品久久7777| 色悠久久久久综合欧美99| 五月天精品一区二区三区| 精品国产伦一区二区三区免费 | 欧美性受xxxx黑人xyx性爽| 首页国产欧美日韩丝袜| 中文字幕中文在线不卡住| 日韩一区二区中文字幕| 在线免费不卡视频| 亚洲一区二区三区爽爽爽爽爽 | 国产成人免费在线观看不卡| 午夜精品一区在线观看| 中文字幕一区二区三区不卡| av一本久道久久综合久久鬼色| 日韩电影网1区2区| 一区二区三区四区在线免费观看| 欧美精品一区二区三区蜜臀| 在线免费av一区| 91麻豆精品视频| 成人美女视频在线观看18| 精品伊人久久久久7777人| 亚洲福利一区二区| 亚洲精品高清在线观看| 国产精品三级av在线播放| 日韩欧美不卡在线观看视频| 精品视频在线免费观看| 色吧成人激情小说| 色网综合在线观看| 91看片淫黄大片一级| 91麻豆国产福利精品| 91片在线免费观看| 91美女在线看| 色欧美88888久久久久久影院| 成人av在线网| 94-欧美-setu| 99精品黄色片免费大全| 不卡一卡二卡三乱码免费网站| 成人av在线播放网址| 99久久精品免费| 91香蕉视频黄| 欧美曰成人黄网| 欧美老人xxxx18| 欧美日韩国产在线观看| 欧美精选午夜久久久乱码6080| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 色一情一乱一乱一91av| 成人免费视频视频在线观看免费| 国产a久久麻豆| 97久久超碰精品国产| 色综合色狠狠天天综合色| 日本韩国一区二区三区| 欧美美女直播网站| 欧美精品一区二区三区蜜桃| 久久久久久久免费视频了| 国产精品卡一卡二| 亚洲不卡一区二区三区| 丝袜亚洲精品中文字幕一区| 日本视频一区二区三区| 国产老妇另类xxxxx| 成人福利视频在线| 欧美三级日韩三级国产三级| 欧美系列亚洲系列| 精品国产乱码久久久久久蜜臀| 久久天天做天天爱综合色| 国产精品麻豆一区二区| 亚洲一区二区三区视频在线| 日本视频一区二区三区| 国产一区二三区| 色婷婷激情综合| 日韩免费看网站| 亚洲三级在线播放| 激情综合网av| 91在线视频18| 日韩一级免费观看| 综合色中文字幕| 国产一区二区免费在线| 日本韩国欧美一区二区三区| 日韩欧美在线一区二区三区| 国产精品免费aⅴ片在线观看| 午夜免费久久看| 91亚洲精华国产精华精华液|