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

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

?? chap_9.c

?? LPC2146 的USB 開發
?? C
?? 第 1 頁 / 共 2 頁
字號:
		0xA1,0x01,
			0x09,0x01,
			0xA1,0x00,
			0x05,0x09,
			0x19,0x01,
			0x29,0x03,
				0x15,0x00,
				0x25,0x01,
				
				0x95,0x03,
				0x75,0x01,
				0x81,0x02,
				
				0x95,0x01,
				0x75,0x05,
				0x81,0x01,
				
				0x05,0x01,
				0x09,0x30,
				0x09,0x31,
				0x09,0x38,
				0x15,0x81,
				0x25,0x7F,
				0x75,0x08,
				0x95,0x03,
			0x81,0x06,
			0xC0,
			0xC0
};

/***************************************************************************************************************
** 函數名稱: get_descriptor()						Name:  	  get_descriptor()
** 功能描述: 獲取描述符								Function: get the descriptor of the USB device 
****************************************************************************************************************/
void get_descriptor(void)
{	
	/* get the type of descriptor */							/* 取得描述符類型 */
	INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue);	
	INT8U bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
	
	if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
	{	/* get the device descriptor */							/* 獲取設備描述符 */
		code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));
	}
	
	else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
	{	 /* get other descriptors */							/* 獲取其它描述符 */
		 if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)
			 ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;

		 /* transmit content of the descripotrs */				/* 傳輸描述符內容 */
		 code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);
													
    	}else if(bRecipient== USB_RECIPIENT_INTERFACE)	//2007-03-20
    		{
    			code_transmit((INT8U *) Mouse_Descr,52);
    			bEPPflags.bits.hid_enumed=1;	
    		}														/* no the descriptor type, stall logical endpoint 0 */
		 stall_ep0();											/* 沒有要求的描述符,禁止邏輯端點0 */
}


/***************************************************************************************************************
** 函數名稱: get_configuration()					Name:  	  get_configuration()	
** 功能描述: 獲取配置							    Function: get the configuration value of the USB device
****************************************************************************************************************/
void get_configuration(void)
{
	INT8U c = bEPPflags.bits.configuration;						/* 取得配置值		get the configuration value */
		
	single_transmit(&c, 1);				   						/* 傳輸配置值		transmit configuration value */
}


/***************************************************************************************************************
** 函數名稱: set_configuration()					Name:  	  set_configuration()
** 功能描述: 設置配置								Function: set the configuration value of the USB device 
****************************************************************************************************************/
void set_configuration(void)
{
	if (ControlData.DeviceRequest.wValue == 0)
	{	/* the recieved data is error */
		single_transmit(0, 0);									/* 傳輸一個空包				transmit an empty packet */
		DISABLE();
		bEPPflags.bits.configuration = 0;						/* 標識設備未配置			flag the device not configured */
		ENABLE();
		init_unconfig();										/* 禁止除0外的所有邏輯端點  disable all endpoint except logical endpoint 0 */
	} 
	
	else if (ControlData.DeviceRequest.wValue == 1)
	{	/* configure the device */ 
		single_transmit(0, 0);									/* 傳輸一個空包				transmit an empty packet */
		init_unconfig();										/* 禁止除0外的所有邏輯端點  disable all endpoint except logical endpoint 0 */
		init_config();											/* 使能全部端點				enable all endpoint */
		DISABLE();
		bEPPflags.bits.configuration = 1;						/* 標識設備已被配置			flag the device configured */
		ENABLE();
	} else														/* no the descriptor type, stall logical endpoint 0 */
		stall_ep0();											/* 沒有要求的描述符,禁止邏輯端點0 */
}


/***************************************************************************************************************
** 函數名稱: get_interface()						Name	 : get_interface()
** 功能描述: 獲取接口信息							Function : get the information of the interface 
****************************************************************************************************************/
void get_interface(void)
{
	INT8U txdat = 0;											/* 只有一個接口				 there only is a interface */
	single_transmit(&txdat, 1);									/* 傳輸一個字節				 transmit a byte */
}


/***************************************************************************************************************
** 函數名稱: set_interface()						Name:  	  set_interface()
** 功能描述: 設置接口信息							Function: set the information of the interface 
****************************************************************************************************************/
void set_interface(void)
{
	if (ControlData.DeviceRequest.wValue == 0 && ControlData.DeviceRequest.wIndex == 0)
		single_transmit(0, 0);									/* 返回一個空包,表示執行成功       return an empty packet indicate perform sucessfully */
	else		
		stall_ep0();											/* 沒有要求的描述符,禁止邏輯端點0  no the request, stall logical endpoint 0 */		
}


void set_idle(void)
{
	single_transmit(0,0);
	}

/***************************************************************************************************************
** 函數名稱: HidClassRequest()		
** 功能描述: 設備類 請求入口函數列表
****************************************************************************************************************/
void (*HidClassRequest[])(void)={
	reserved,//	get_report,	//0
	reserved,//	get_idle,	//1
	reserved,//	get_protocol,	//2
	reserved,	//3
	reserved,	//4
	reserved,	//5
	reserved,	//6
	reserved,	//7
	reserved,	//8
	reserved,//	set_report,	//9
	set_idle,	//0A
	reserved,//set_protocol,	//0B
	reserved,	//0C
	reserved,	//0D
	reserved,	//0E
	reserved	//0F
};

/***************************************************************************************************************
** 函數名稱: control_handler()						Name	 : control_handler()
** 功能描述: 控制傳輸								Function : deal with control transfer 	
****************************************************************************************************************/
void control_handler(void)
{
	INT8U type, req;

	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
																/* 讀請求類型碼			read request type code */
	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
	if (type == USB_STANDARD_REQUEST)
		(*StandardDeviceRequest[req])();						/* 標準請求				standard request */
	//else if (type == USB_VENDOR_REQUEST)						/* 廠商請求				vendor request */
	//	(*VendorDeviceRequest[req])();
	//else if(type == USB_CLASS_REQUEST)
	//	(*ClassDeviceRequest[req])();							/* 類請求				class request */
	else if(type == USB_CLASS_REQUEST)
		(*HidClassRequest[req])();							/* 類請求				class request */
	
	else
		stall_ep0();											/* 沒有要求的描述符,禁止邏輯端點0  no the request, stall logical endpoint 0 */		
}


/***************************************************************************************************************
** 函數名稱: ep0_rxdone()							 Name	  : ep0_rxdone()
** 功能描述: 通過端點索引 0 接收數據				 Function : receive data by logic endpoint 0 
****************************************************************************************************************/
void ep0_rxdone(void)
{
	INT8U ep_last, i;
	INT8U req[sizeof(DEVICE_REQUEST)];

	ep_last = USB_SelectClrIntEndpoint(0);				 	/* 清除該端點的中斷		clear the interrupt of the endpoint */
	
	if (ep_last & USB_SETUPPACKET)
	{													 	/* 接收到SETUP包		if receive SETUP packet */
		ControlData.wLength = 0;			 		 
		ControlData.wCount = 0;
		if(USB_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),req)  
							!= sizeof(DEVICE_REQUEST)) 	 	/* 從端點 0 讀取數據	read data from endpoint 0 */
	    {
			USB_SetEndpointStatus(0, 1);				 	/* 禁止控制端點0		stall control endpoint 0 */
			USB_SetEndpointStatus(1, 1);			 	 	/* 禁止控制端點1		stall control endpoint 1 */
			bEPPflags.bits.control_state = USB_IDLE;	 	/* 標識空閑狀態			flag Idle status */
			return;
		}
		
		/****** receive SETUP packet sucessfully 接收 SETUP 包成功 ******/
		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]; 
		ControlData.wLength = ControlData.DeviceRequest.wLength;
		
		if (ControlData.DeviceRequest.bmRequestType & (INT8U)USB_ENDPOINT_DIRECTION_MASK) 
		{													/* 如果為控制讀	  if it is control read */
 			 bEPPflags.bits.setup_packet = 1;			  	/* 通知contorl_handler()處理SETUP包 inform control_handler() to process SETUP packet */
			 bEPPflags.bits.control_state = USB_TRANSMIT;
		}
		else
		{								 			 		/* 如果為控制寫   if it is control write */
			 if (ControlData.DeviceRequest.wLength == 0)
			 {
				 bEPPflags.bits.setup_packet = 1;		    /* 通知contorl_handler()處理SETUP包 inform control_handler() to process SETUP packet */		  
				 bEPPflags.bits.control_state = USB_IDLE;
			 }
			 else
			 {
				 if (ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
				 {	 /* data length is error */
					bEPPflags.bits.control_state = USB_IDLE;	
					USB_SetEndpointStatus(0, 1);			  	 	 /* 禁止控制端點0 		stall control endpoint 0 */
				 	USB_SetEndpointStatus(1, 1);			     	 /* 禁止控制端點1		stall control endpoint 1 */
				 }
				 else
					    bEPPflags.bits.control_state = USB_RECEIVE;  /* 標識接收狀態		flag receive status */
			 } // set command with data
		} // else set command
	} // if setup packet

	/****** control receive data phase 下面為控制接收(控制寫入)數據階段 *******/
	else if (bEPPflags.bits.control_state == USB_RECEIVE) 
	{																 /* 如果當前為接收狀態	if it is receive status */
		i = USB_ReadEndpoint(0, EP0_PACKET_SIZE,
			ControlData.dataBuffer + ControlData.wCount);			 /* 從端點 0 讀取數據	read from endpoint 0 */

		ControlData.wCount += i;
		if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
		{  		                                                     /* 完成接收數據		finish receiving data */
			bEPPflags.bits.setup_packet = 1;					     /* 通知contorl_handler()處理SETUP包  inform control_handler() to process SETUP packet */	
			bEPPflags.bits.control_state = USB_IDLE;
		}
	}
	else 
		bEPPflags.bits.control_state = USB_IDLE;	
}


/***************************************************************************************************************
** 函數名稱: ep0_txdone()								Name	 : ep0_txdone()
** 功能描述: 通過物理端點 0 發送數據					Function : tranmit data by physical endpoint 1
****************************************************************************************************************/
void ep0_txdone(void)
{
	INT16 i = ControlData.wLength - ControlData.wCount;

	USB_SelectClrIntEndpoint(1); 									/* 清除端點中斷標志			clear the endpoint interrupt flag bit */
		
	if (bEPPflags.bits.control_state != USB_TRANSMIT)	
	{																/* 非發送狀態				not transmit status */												
		single_transmit(0, 0);						
		return;														/* 直接返回					return */
	}
	
	if( i >= EP0_PACKET_SIZE) 
	{																/* 未發送字節數大于64   	the byte length is above 64 */
		USB_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
		ControlData.wCount += EP0_PACKET_SIZE;
		bEPPflags.bits.control_state = USB_TRANSMIT;	
	}
	else if( i != 0) 
	{																/* 發送所有未發送的字節		send all bytes */
		USB_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
		ControlData.wCount += i;
		bEPPflags.bits.control_state = USB_IDLE;					/* 置狀態為等待狀態			set Idle status */
	}
	else if (i == 0)
	{
		USB_WriteEndpoint(1, 0, 0); 								/* 完成發送,再發送一個空包	finish transmitting, send an empty packet */
		bEPPflags.bits.control_state = USB_IDLE;
	}

}

/*******************************************************************************************************
**                            End Of File
********************************************************************************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99精品久久久| 欧美国产精品v| 日本最新不卡在线| 欧美一区永久视频免费观看| 天天操天天干天天综合网| 欧美喷水一区二区| 久久精品国产精品青草| 精品国产欧美一区二区| 国产精品一区不卡| 亚洲欧洲在线观看av| 色狠狠av一区二区三区| 亚洲国产精品尤物yw在线观看| 欧美日韩国产精选| 日本午夜一区二区| 日本一区二区三区国色天香 | 日韩电影在线观看网站| 欧美一区二区免费观在线| 久久不见久久见免费视频7 | 91精品国产综合久久久久| 日韩制服丝袜av| 久久亚洲一级片| 91丨porny丨户外露出| 午夜日韩在线观看| 久久精品一区二区三区av| 日韩午夜在线影院| 不卡视频在线观看| 热久久一区二区| 国产精品萝li| 日韩一区二区在线看| 高清在线成人网| 日韩中文字幕亚洲一区二区va在线| 久久久久青草大香线综合精品| 色呦呦日韩精品| 国产一区二区三区免费看| 亚洲欧美日韩久久精品| 日韩精品资源二区在线| 色综合久久精品| 国产美女主播视频一区| 亚洲444eee在线观看| 中文字幕欧美区| 日韩亚洲欧美一区二区三区| 91视频免费观看| 国产一区二区三区观看| 亚洲成人自拍一区| 国产精品久久久99| 2020国产精品| 在线综合亚洲欧美在线视频| 99久久99久久精品免费看蜜桃| 久久精品免费观看| 日韩中文字幕麻豆| 亚洲一卡二卡三卡四卡| 一区二区中文字幕在线| 久久久精品日韩欧美| 91精品国产综合久久小美女| 日本久久电影网| av一区二区三区黑人| 国产成人自拍网| 国产在线精品国自产拍免费| 日韩影院精彩在线| 洋洋av久久久久久久一区| 中文字幕第一区| 久久精品视频一区二区三区| 欧美一区二区日韩| 日韩一区二区三区精品视频 | 色中色一区二区| av在线免费不卡| 成人免费观看视频| 国产精品主播直播| 国产主播一区二区| 狠狠色综合播放一区二区| 奇米亚洲午夜久久精品| 天天亚洲美女在线视频| 午夜精品免费在线观看| 亚洲精品菠萝久久久久久久| 亚洲色欲色欲www| 国产精品视频免费看| 中文字幕精品—区二区四季| 久久精品欧美日韩精品| 国产欧美日韩在线| 国产视频911| 国产精品久久久久久久午夜片| 国产欧美一区二区精品婷婷| 国产亚洲欧美色| 国产精品色眯眯| 中文字幕欧美一区| 一区二区日韩av| 爽好久久久欧美精品| 日韩va亚洲va欧美va久久| 日日夜夜免费精品视频| 日本在线不卡视频一二三区| 免费一级欧美片在线观看| 精品在线播放午夜| 国产酒店精品激情| 成人午夜av影视| 色综合久久久久久久久久久| 欧美在线视频不卡| 91麻豆精品国产91久久久久久久久| 日韩欧美激情一区| 国产日韩影视精品| ...中文天堂在线一区| 一区二区在线观看免费视频播放| 亚洲成人av资源| 蜜桃久久久久久久| 成人黄色网址在线观看| 色婷婷国产精品| 欧美一区二区三区色| 久久久久久久久久久久久久久99 | 免费不卡在线观看| 国产一区二区不卡| 一本一道久久a久久精品| 91麻豆精品国产91久久久久久| 国产亚洲欧美激情| 亚洲一二三级电影| 国内一区二区在线| 97精品电影院| 日韩精品一区二区三区老鸭窝| 欧美国产精品一区二区三区| 香蕉久久夜色精品国产使用方法 | 色吊一区二区三区| 91精品国产91热久久久做人人| 久久久久久久久免费| 一区二区三区四区五区视频在线观看| 五月开心婷婷久久| 国产成人综合在线| 欧美三级电影在线观看| 亚洲国产精华液网站w| 天天综合天天综合色| av在线不卡观看免费观看| 欧美一级片在线| 亚洲特级片在线| 韩国女主播成人在线| 在线亚洲一区二区| 久久久久久久久久看片| 日韩中文欧美在线| 色哟哟在线观看一区二区三区| 2024国产精品| 午夜成人免费电影| 91亚洲午夜精品久久久久久| 欧美精品一区二区三区高清aⅴ| 亚洲免费视频中文字幕| 国产一区二区不卡| 日韩一级片网站| 亚洲第一会所有码转帖| 成人午夜免费视频| 精品少妇一区二区三区在线播放| 亚洲妇女屁股眼交7| 成人综合婷婷国产精品久久蜜臀| 欧美一区二区久久| 亚洲一区二区三区中文字幕| 成人激情校园春色| 国产亚洲va综合人人澡精品| 蜜桃视频在线观看一区| 欧美日韩久久久一区| 亚洲精品久久嫩草网站秘色| 成人免费高清在线| 日本一区二区成人| 国产精品中文字幕一区二区三区| 日韩视频免费观看高清完整版 | 麻豆精品一区二区三区| 欧美日韩精品欧美日韩精品一综合| 亚洲视频免费看| 99视频精品全部免费在线| 国产欧美一区二区精品久导航| 激情文学综合网| 精品日韩欧美在线| 美女一区二区在线观看| 欧美高清性hdvideosex| 亚洲成人久久影院| 欧美日韩国产乱码电影| 天天操天天色综合| 91精品国产免费久久综合| 天天影视网天天综合色在线播放| 欧美日韩五月天| 日韩成人一级片| 欧美电影免费观看高清完整版在线 | 国产精品第13页| av电影在线观看完整版一区二区| 日本一区二区在线不卡| 成人av在线资源| 亚洲欧美日韩国产一区二区三区| 99视频在线观看一区三区| 亚洲日穴在线视频| 在线一区二区视频| 亚洲成人综合视频| 欧美一级高清片在线观看| 麻豆freexxxx性91精品| 久久精品一区二区三区不卡| 岛国av在线一区| 一区二区三区中文在线观看| 欧美无砖专区一中文字| 天天做天天摸天天爽国产一区| 日韩一区二区在线看| 国产伦精品一区二区三区在线观看| 国产欧美日韩精品一区| 97久久人人超碰| 首页国产欧美久久| 久久色成人在线| 91啪在线观看| 久久99精品久久久久婷婷| 国产欧美综合在线|