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

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

?? usb.c

?? USBN9603的DEMO程序
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):

const USB_vendor_device_desc_t usb_vendor_dev_desc =
{
    sizeof(USB_vendor_device_desc_t),
    USB_DEVICE_DESCRIPTOR,
	0x0
    
};


/*=================================================================*
 *					String Descriptors 							   *
 *=================================================================*/

/*-------------------
* String descriptors 
*------------------*/
const struct {
    byte	bLength;
    byte	bDescriptorType;
    word	bstring;
} langid_str_desc = {sizeof(langid_str_desc), STRING_DESCRIPTOR, ENGLISH_US};

const struct {
    byte	bLength;
    byte	bDescriptorType;
    char	bstring[sizeof(MANUFACTURER_STR)];
} manufacturer_str_desc = {sizeof(manufacturer_str_desc), STRING_DESCRIPTOR, MANUFACTURER_STR};

const struct {
    byte	bLength;
    byte	bDescriptorType;
    char	bstring[sizeof(PRODUCT_STR)];
} product_str_desc = {sizeof(product_str_desc), STRING_DESCRIPTOR, PRODUCT_STR};

const struct {
    byte	bLength;
    byte	bDescriptorType;
    char	bstring[sizeof(VERSION_STR)];
} version_str_desc = {sizeof(version_str_desc), STRING_DESCRIPTOR, VERSION_STR};


/*------------------------------------------------------
* List of all string descriptors, Be sure that the order
* of the list is the same as String_index_t enum 
*------------------------------------------------------*/
const USB_string_desc_t *string_descs[] = {
    (USB_string_desc_t*)&langid_str_desc,
    (USB_string_desc_t*)&manufacturer_str_desc,
    (USB_string_desc_t*)&product_str_desc,
    (USB_string_desc_t*)&version_str_desc
};


void build_string_desc(USB_string_desc_t* dsc, byte* dsc_buff) 
{
	int i;	
	byte* dsc_buff_p;

	dsc_buff[0] = dsc->bLength;
	dsc_buff[1] = dsc->bDescriptorType;

	/*-------------------------------
	* make the string UNICODE encoded
	* each char is two bytes long
	*-------------------------------*/
	dsc_buff_p = (byte *)(dsc_buff+2);
	for(i=0;i<dsc->bLength; i++) 
	{
		*dsc_buff_p++ = dsc->bstring[i];
		*dsc_buff_p++ = 0x00;
	}

}


/*=================================================================*
 *					Standard device request handlers			   *
 *=================================================================*/


/*-------------------------------------------------------
* requests' sequence is according to USB 1.1 spec values 
*-------------------------------------------------------*/
const USB_req_handler_t usb_std_device_req[] =
{
    usb_dev_get_status,
    usb_dev_clear_feature,
    USB_req_reserved,
    usb_dev_set_feature,
    USB_req_reserved,
    usb_dev_set_address,
    usb_std_dev_get_descriptor,
    usb_std_dev_set_descriptor,
    usb_dev_get_config,
    usb_dev_set_config,
    usb_dev_get_interface,
    usb_dev_set_interface,
    usb_dev_sync_frame,
    USB_req_reserved,
    USB_req_reserved,
    USB_req_reserved
};
/*=================================================================*
 *					Vendor device request handlers				   *
 *=================================================================*/

const USB_req_handler_t usb_vendor_device_req[] =
{
	Gen_Parser,
    Bulk_Parser,
    Interrupt_Parser,
    Iso_Parser,
};


/*============================================================================
 *	
 *				Standard USB device request handlers
 *
 *============================================================================*/
/*----------------------------------------------------------------------------------------------
*	Prototype
*		void usb_dev_get_status(USB_request_t *req)
*
*	Parameters
*		req - pointer to struct of the received USB request
*
*	Returns
*		None
*
*	Description
*  		Handles the GET_STATUS device request from the USB host.
*
*  		The GET_STATUS device request can go to one of three recipients: the device,
*  		the current interface, or a particular endpoint.
*  		1. The device returns its self-powered status and its remote
*   	   wake-up status.
*  		2. The current interface returns, as defined in USB spec, 0.
*  		3. The selected endpoint returns its stall status.
*	
----------------------------------------------------------------------------------------------*/

void usb_dev_get_status(USB_request_t *req)
{
      
	byte ep_no = REQ_INDEX(req).endpoint.ep_num;
	
	if (DEVICE_STATE(device_status) == DEV_ATTACHED) 
	{
		STALL_EP0();
		return;
	}

	if (IS_REQ_VALUE_NOT_ZERO(req)) 
	{
		STALL_EP0();
		return;
	}
	if (REQ_LENGTH(req) != 2) 
	{
		STALL_EP0();
		return;
	}
	/*-----------------------
	* Clear all reserved bits
	*-----------------------*/
    device_buffers.status.msb.as_byte = 0;	
    switch (REQ_RECIPIENT(req)) 
	{
		case DEVICE_REQ:
			if (REQ_INDEX(req).as_bytes.lsb != 0) 
			{
				/*-------------------------------------
				 *device's behaviour is not specified
				 *------------------------------------*/
				STALL_EP0();
				return;
			}
			/*---------------------------------
			 *disable to request remote wakeup
			 *-------------------------------*/
			device_buffers.status.msb.device.wakeup = OFF;
			/*------------
			 *bus powered
			 *-----------*/
			device_buffers.status.msb.device.selfpowered = OFF; 
			break;
		case INTERFACE_REQ:
			if (REQ_INDEX(req).interface.inf_no != 0) 
			{
				/*------------------------------------
				* device's behaviour is not specified
				*------------------------------------*/
				STALL_EP0();
				return;
			}
			/*----------
			* Reserved 
			*---------*/
			device_buffers.status.msb.interface.value = 0;	
			break;
		case ENDPOINT_REQ:
			switch (ep_no) 
			{
				case ENDPOINT_0:
						device_buffers.status.msb.endpoint.stalled = (IS_EP0_STALLED)? ON : OFF;
					break;
				case ENDPOINT_1:
				case ENDPOINT_2:
				case ENDPOINT_3:
				case ENDPOINT_4:
				case ENDPOINT_5:
						device_buffers.status.msb.endpoint.stalled = (IS_EP_STALLED(ep_no))? ON : OFF;
					break;
				/*----------------------
				 * endpoints not in use
				 *---------------------*/
				case ENDPOINT_6:
				default: 
				/*--------------------
				*  undefined endpoint 
				*--------------------*/
					STALL_EP0();
					return;
			}
			break;
		case OTHER_REQ:
		default: 
		/*---------------------
		 * undefined recipient 
		 *-------------------*/
			STALL_EP0();
			return;
	}
	/*---------
	* Reserved 
	*---------*/
    device_buffers.status.lsb = 0;	
    send_control_data((byte *)&device_buffers.status, sizeof(USB_device_status_t));
}
/*----------------------------------------------------------------------------------------------
*	Prototype
*		void usb_dev_clear_feature(USB_request_t *req)
*
*	Parameters
*		req - pointer to struct of USB request
*
*	Returns
*		None
*
*	Description
*  		Handles the CLEAR_FEATURE device request from the USB host.
*
*  		The CLEAR_FEATURE device request can go to one of two recipients:
*  		the device, or a particular endpoint.
*  		1. The device returns a 0 length packet to complete the handshake with 
*     	   the host.
*  		2. The selected endpoint only respond to clear stall commands.
*		
----------------------------------------------------------------------------------------------*/
void usb_dev_clear_feature(USB_request_t *req)
{
  
	byte ep_no = REQ_INDEX(req).endpoint.ep_num;

	if (DEVICE_STATE(device_status) == DEV_ATTACHED) 
	{
		STALL_EP0();
		return;
	}
	if (REQ_LENGTH(req) != 0) 
	{
		STALL_EP0();
		return;
	}

    switch (REQ_RECIPIENT(req)) 
    {
		case DEVICE_REQ:
			/*--------------------------------
			 * wakeup feature is not supported
			 *------------------------------*/
			if (REQ_VALUE(req).feature.bSelector == DEVICE_REMOTE_WAKEUP)
			STALL_EP0();
			break;
		case INTERFACE_REQ:
			break;
		case ENDPOINT_REQ:
			/*-------------------------------------------
			 * clear stall state of appropriate endpoint
			 *-----------------------------------------*/
			if (REQ_VALUE(req).feature.bSelector != ENDPOINT_STALL ||
				ep_no >= ENDPOINT_LAST || usb_dev_endpoints[device_status.curAltSetting][ep_no] == NULL)
				STALL_EP0();
			else
			{
				(ep_no == ENDPOINT_0) ? CLEAR_STALL_EP0 : CLEAR_STALL_EP(ep_no);
				zero_length_data_response(ENDPOINT_0);
			}
			break;
		case OTHER_REQ:
		default:
			STALL_EP0();
			break;
    }
}
/*----------------------------------------------------------------------------------------------
*	Prototype
*		void usb_dev_set_feature(USB_request_t *req)
*
*	Parameters
*		req - pointer to struct of USB request
*
*	Returns
*		None
*
*	Description
*  		Handles the SET_FEATURE device request from the USB host.
*
*  		The SET_FEATURE device request can go to one of two recipients:
*  		the device, or a particular endpoint.
*  		1. The device responds to set remote wake-up commands 
*  		2. The selected endpoint responds to set stall commands.
*		
----------------------------------------------------------------------------------------------*/

void usb_dev_set_feature(USB_request_t *req)
{
    
	byte ep_no = REQ_INDEX(req).endpoint.ep_num;

	if (DEVICE_STATE(device_status) == DEV_ATTACHED) 
	{
		STALL_EP0();
		return;
	}
	if (REQ_LENGTH(req) != 0) 
	{
		STALL_EP0();
		return;
	}

    switch (REQ_RECIPIENT(req)) 
    {
		case DEVICE_REQ:
			if (REQ_VALUE(req).feature.bSelector == DEVICE_REMOTE_WAKEUP)
				/*--------------------------------
				 * remote wakeup is not supported
				 *-------------------------------*/
				STALL_EP0();
			break;
		case INTERFACE_REQ:
			break;
		case ENDPOINT_REQ:
			if (REQ_VALUE(req).feature.bSelector != ENDPOINT_STALL ||
				ep_no >= ENDPOINT_LAST || usb_dev_endpoints[device_status.curAltSetting][ep_no] == NULL)
				STALL_EP0();
			else
			{
				/*-----------------------------------------
				 * set appropriate endpoint to stall state 
				 *---------------------------------------*/
				(ep_no == ENDPOINT_0)? STALL_EP0() : STALL_EP(ep_no);
				zero_length_data_response(ENDPOINT_0);
			}
			break;
		case OTHER_REQ:
		default:
			STALL_EP0();
			break;
    }
}
/*----------------------------------------------------------------------------------------------
*	Prototype
*		void usb_dev_set_address(USB_request_t *req)
*
*	Parameters
*		req - pointer to struct of USB request
*
*	Returns
*		None
*
*	Description
*		Handles the SET_ADDRESS device request from the USB host.
----------------------------------------------------------------------------------------------*/

void usb_dev_set_address(USB_request_t *req)
{
	
	byte address;

	if (IS_REQ_INDEX_NOT_ZERO(req)) 
	{
		/*-----------------------------------------
		 * behavior of the device is not specified
		 *---------------------------------------*/
		STALL_EP0();
		return;
	}
	
	if (REQ_LENGTH(req) != 0x0) 
	{
		/*----------------------------------------
		* behavior of the device is not specified
		*---------------------------------------*/
		STALL_EP0();
		return;
	}
	
	if (DEVICE_STATE(device_status) == DEV_CONFIGURED)
	{
		/*---------------------------------------
		 *behavior of the device is not specified
		 *--------------------------------------*/
		STALL_EP0();
		return;
	}
	
	switch (REQ_RECIPIENT(req)) 
	{
		case DEVICE_REQ:
			/*------------------------
			 * ENABLE_DEFAULT_ADDRESS;
			 *-----------------------*/
			write_usb(EPC0, read_usb(EPC0) | DEF);
			/*-------------------------------------------------------
			 * The setting of device address is delayed in order to
			 * complete successfully the Status stage of this request
			 *------------------------------------------------------*/
			address = REQ_VALUE(req).as_bytes.lsb;
			/*-----------------------
			 * set new device address
			 *----------------------*/
			write_usb(FAR, address|AD_EN);
			/*---------------------------------
			* Enable answer to the set address 
			*--------------------------------*/
			if (REQ_VALUE(req).as_bytes.lsb == 0x0)
				SET_DEVICE_STATE(device_status, DEV_ATTACHED);
			else{
				SET_DEVICE_STATE(device_status, DEV_ADDRESS);
				/*------------------
				* Set usb board leds
				*------------------*/
				SET_ID_LEDS(GET_DIP_SW1());
				SET_USB_LED();
			}
			/*---------------------------------
			* enable zero length data responce
			*---------------------------------*/
			usbn9604_tx_enable(ENDPOINT_0);
			break;
		case INTERFACE_REQ:
		case ENDPOINT_REQ:
		case OTHER_REQ:
		default:
			STALL_EP0();
			break;
    }
}
/*----------------------------------------------------------------------------------------------
*	Prototype
*		void usb_std_dev_get_descriptor(USB_request_t *req)
*
*	Parameters
*		req - pointer to struct of USB request
*
*	Returns
*		None
*
*	Description
*		Handles the standard GET_DESCRIPTOR device request from the USB host.
----------------------------------------------------------------------------------------------*/

void usb_std_dev_get_descriptor(USB_request_t *req)
{
    int desc_length = 0;
    int desc_index = REQ_VALUE(req).descriptor.bDescriptorIndex;
    byte *desc_buf = NULL;
    int max_desc_length = REQ_LENGTH(req);


	switch (REQ_RECIPIENT(req)) 
	{
		case DEVICE_REQ:
			switch (REQ_VALUE(req).descriptor.bDescriptorType) 
			{
				case DEVICE_DESCRIPTOR:
					desc_length = usb_device_desc.bLength;
					desc_buf = (byte *)&usb_device_desc;
					break;
				case CONFIG_DESCRIPTOR:
					desc_length = usb_dev_long_config_desc.usb_dev_config_desc.wTotalLength;
					desc_buf = (byte *)&usb_dev_long_config_desc;
					break;
				case STRING_DESCRIPTOR:
					/*---------------------------------------------------------------
					 * String index 0 for all languages returns an array of two-byte
					 * LANGID codes supported by the device 
					 *-------------------------------------------------------------*/
					if (desc_index < STR_LAST_INDEX && desc_index >= 0)
					 {
						/*---------------------------------------------------------
						 * If the descriptor is longer than the wLength field,
						 * only the initial bytes of the descriptor are returned.
						 * If the descriptor is shorter than the wLength field,
						 * the device indicates the end of the control transfer
						 * by sending NULL character 
						 *-----------------------------------------------------*/

						desc_length = string_descs[desc_index]->bLength;
						desc_buf = (byte *)string_descs[desc_index];
						break;
					}
					/*----------------------------------------------- 
					 * In case of the wrong string index, stall EP0 
					 *---------------------------------------------*/
				default:
					STALL_EP0();
					return;
			}
			desc_length = (desc_length < max_desc_length)? desc_length : max_desc_length;
			if (desc_length%EP0_FIFO_SIZE)
				/*-------------------------------------
				* zero lada length will not be required

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美理论在线播放| 日韩国产一区二| 国产精品毛片久久久久久久| 精品国产成人系列| 久久综合999| 久久男人中文字幕资源站| 久久蜜桃一区二区| 国产色综合久久| 国产精品久线观看视频| 国产精品成人网| 老司机免费视频一区二区| 日本成人在线电影网| 奇米777欧美一区二区| 极品销魂美女一区二区三区| 国产在线麻豆精品观看| 粉嫩aⅴ一区二区三区四区| 成人av在线电影| 色先锋aa成人| 欧美高清视频www夜色资源网| 欧美高清性hdvideosex| 日韩精品一区二区三区视频播放| 欧美精品一区二区三区蜜桃视频| 美女精品自拍一二三四| 国产在线一区观看| 波多野结衣在线一区| 欧洲一区在线电影| 6080国产精品一区二区| 久久综合一区二区| 亚洲欧美欧美一区二区三区| 五月天国产精品| 国产精品69毛片高清亚洲| 色综合色综合色综合| 欧美日韩在线播放三区四区| 欧美zozo另类异族| 国产精品免费丝袜| 亚洲123区在线观看| 国产一区999| 色吊一区二区三区 | 久久综合久久综合九色| 中文字幕免费观看一区| 亚洲日本一区二区| 麻豆极品一区二区三区| 不卡的av在线播放| 在线播放日韩导航| 日本一区二区成人| 日本三级韩国三级欧美三级| 成人激情动漫在线观看| 91精品国产91热久久久做人人| 国产日韩欧美综合一区| 亚洲国产wwwccc36天堂| 国产成人精品在线看| 欧美丝袜自拍制服另类| 国产亚洲一二三区| 婷婷亚洲久悠悠色悠在线播放| 成人在线综合网站| 日韩欧美一二三| 亚洲一区在线电影| 国产91精品欧美| 欧美一区二视频| 亚洲欧洲日韩一区二区三区| 久久99这里只有精品| 在线观看www91| 国产精品免费丝袜| 国模冰冰炮一区二区| 欧美老肥妇做.爰bbww视频| 国产精品国产三级国产aⅴ入口| 日本免费新一区视频| 在线中文字幕不卡| 国产精品美女久久久久久久| 蓝色福利精品导航| 欧美老人xxxx18| 亚洲同性同志一二三专区| 国产一区二区免费看| 欧美一区日本一区韩国一区| 亚洲综合久久av| 99精品国产视频| 国产喷白浆一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| 在线观看免费亚洲| 最新国产精品久久精品| 国产精品原创巨作av| 日韩精品色哟哟| 欧美在线你懂得| 国产精品毛片无遮挡高清| 狠狠色综合日日| 日韩三级电影网址| 日韩国产欧美在线观看| 91极品美女在线| 亚洲欧美在线视频观看| 成人手机电影网| 国产色综合一区| 国产一区在线精品| 久久综合狠狠综合| 国内精品嫩模私拍在线| 欧美成人三级电影在线| 免费观看30秒视频久久| 91精品国产手机| 奇米精品一区二区三区在线观看| 欧美久久久久久久久久| 午夜激情一区二区三区| 欧美日本国产视频| 日韩国产在线一| 日韩精品一区二区在线观看| 免费观看在线综合| 日韩精品一区二区三区老鸭窝| 蜜臀久久99精品久久久画质超高清 | 舔着乳尖日韩一区| 欧美剧在线免费观看网站| 视频精品一区二区| 欧美一级电影网站| 狠狠色狠狠色综合系列| 26uuu精品一区二区 | 日韩精品自拍偷拍| 久久爱www久久做| 国产校园另类小说区| 国产sm精品调教视频网站| 国产日韩欧美亚洲| 99久久99久久精品国产片果冻 | 成人激情校园春色| 国产精品天干天干在观线| 色综合一个色综合| 亚洲www啪成人一区二区麻豆| 欧美精品久久一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 91电影在线观看| 无吗不卡中文字幕| 精品国产91久久久久久久妲己| 国产精品18久久久| 亚洲卡通欧美制服中文| 欧美日韩午夜在线| 久久99精品一区二区三区 | 国产成人av电影在线观看| 国产精品入口麻豆九色| 在线免费一区三区| 男女性色大片免费观看一区二区| 久久久电影一区二区三区| caoporn国产一区二区| 一区二区三区日本| 日韩久久久久久| 99精品欧美一区二区三区小说 | 石原莉奈一区二区三区在线观看 | 亚洲尤物视频在线| 精品少妇一区二区三区| 丁香婷婷深情五月亚洲| 亚洲高清免费在线| 久久久精品免费免费| 欧美午夜免费电影| 日韩网站在线看片你懂的| 成人综合日日夜夜| 日韩专区中文字幕一区二区| 国产亲近乱来精品视频| 欧美日韩国产一二三| 成人一区二区视频| 天天av天天翘天天综合网色鬼国产| 国产亚洲美州欧州综合国| 欧美午夜免费电影| 成人免费黄色大片| 蜜臀av在线播放一区二区三区| 中文字幕精品一区二区精品绿巨人| 欧美日韩中文字幕精品| 国产高清在线精品| 日韩精品亚洲一区| 亚洲男女一区二区三区| 国产欧美日韩在线观看| 777午夜精品免费视频| 91亚洲国产成人精品一区二三| 老司机午夜精品99久久| 亚洲一区二区三区三| 中文字幕一区二区三区蜜月| 精品久久久久一区| 911精品国产一区二区在线| 91视频免费播放| 成人免费视频一区二区| 久久国产精品免费| 天天色天天操综合| 亚洲一区二区在线播放相泽 | 久久99精品一区二区三区| 亚洲午夜在线电影| 综合色中文字幕| 中文字幕av一区二区三区| 2023国产精品视频| 91精品国产综合久久精品app| 色综合天天综合给合国产| 国产成人免费视频网站高清观看视频| 日韩电影在线一区| 亚洲一卡二卡三卡四卡五卡| 1024精品合集| 国产精品嫩草久久久久| 久久你懂得1024| 欧美精品一区二区三区四区| 日韩欧美一卡二卡| 91精品国产91久久久久久最新毛片 | 亚洲成va人在线观看| 一区二区在线观看免费| 1区2区3区国产精品| 一区在线中文字幕| 国产精品传媒在线| 中文字幕亚洲综合久久菠萝蜜| 国产精品妹子av| 国产精品久线在线观看|