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

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

?? usbstdreq.c

?? Free Usb Stack for NXP LPC2xxx microcontrollers.
?? C
字號:
/*
	LPCUSB, an USB device driver for LPC microcontrollers	
	Copyright (C) 2006 Bertrik Sikken (bertrik@sikken.nl)

	Redistribution and use in source and binary forms, with or without
	modification, are permitted provided that the following conditions are met:

	1. Redistributions of source code must retain the above copyright
	   notice, this list of conditions and the following disclaimer.
	2. Redistributions in binary form must reproduce the above copyright
	   notice, this list of conditions and the following disclaimer in the
	   documentation and/or other materials provided with the distribution.
	3. The name of the author may not be used to endorse or promote products
	   derived from this software without specific prior written permission.

	THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
	IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
	OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
	IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 
	INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
	NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
	DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
	THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
	THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


/** @file
	Standard request handler.
	
	This modules handles the 'chapter 9' processing, specifically the
	standard device requests in table 9-3 from the universal serial bus
	specification revision 2.0
	
	Specific types of devices may specify additional requests (for example
	HID devices add a GET_DESCRIPTOR request for interfaces), but they
	will not be part of this module.

	@todo some requests have to return a request error if device not configured:
	@todo GET_INTERFACE, GET_STATUS, SET_INTERFACE, SYNCH_FRAME
	@todo this applies to the following if endpoint != 0:
	@todo SET_FEATURE, GET_FEATURE 
*/

#include "type.h"
#include "usbdebug.h"
#include "usbstruct.h"
#include "usbapi.h"

#define MAX_DESC_HANDLERS	4		/**< device, interface, endpoint, other */


/* general descriptor field offsets */
#define DESC_bLength					0	/**< length offset */
#define DESC_bDescriptorType			1	/**< descriptor type offset */	

/* config descriptor field offsets */
#define CONF_DESC_wTotalLength			2	/**< total length offset */
#define CONF_DESC_bConfigurationValue	5	/**< configuration value offset */	
#define CONF_DESC_bmAttributes			7	/**< configuration characteristics */

/* interface descriptor field offsets */
#define INTF_DESC_bAlternateSetting		3	/**< alternate setting offset */

/* endpoint descriptor field offsets */
#define ENDP_DESC_bEndpointAddress		2	/**< endpoint address offset */
#define ENDP_DESC_wMaxPacketSize		4	/**< maximum packet size offset */


/** Currently selected configuration */
static U8				bConfiguration = 0;
/** Installed custom request handler */
static TFnHandleRequest	*pfnHandleCustomReq = NULL;
/** Pointer to registered descriptors */
static const U8			*pabDescrip = NULL;


/**
	Registers a pointer to a descriptor block containing all descriptors
	for the device.

	@param [in]	pabDescriptors	The descriptor byte array
 */
void USBRegisterDescriptors(const U8 *pabDescriptors)
{
	pabDescrip = pabDescriptors;
}


/**
	Parses the list of installed USB descriptors and attempts to find
	the specified USB descriptor.
		
	@param [in]		wTypeIndex	Type and index of the descriptor
	@param [in]		wLangID		Language ID of the descriptor (currently unused)
	@param [out]	*piLen		Descriptor length
	@param [out]	*ppbData	Descriptor data
	
	@return TRUE if the descriptor was found, FALSE otherwise
 */
BOOL USBGetDescriptor(U16 wTypeIndex, U16 wLangID, int *piLen, U8 **ppbData)
{
	U8	bType, bIndex;
	U8	*pab;
	int iCurIndex;
	
	ASSERT(pabDescrip != NULL);

	bType = GET_DESC_TYPE(wTypeIndex);
	bIndex = GET_DESC_INDEX(wTypeIndex);
	
	pab = (U8 *)pabDescrip;
	iCurIndex = 0;
	
	while (pab[DESC_bLength] != 0) {
		if (pab[DESC_bDescriptorType] == bType) {
			if (iCurIndex == bIndex) {
				// set data pointer
				*ppbData = pab;
				// get length from structure
				if (bType == DESC_CONFIGURATION) {
					// configuration descriptor is an exception, length is at offset 2 and 3
					*piLen =	(pab[CONF_DESC_wTotalLength]) |
								(pab[CONF_DESC_wTotalLength + 1] << 8);
				}
				else {
					// normally length is at offset 0
					*piLen = pab[DESC_bLength];
				}
				return TRUE;
			}
			iCurIndex++;
		}
		// skip to next descriptor
		pab += pab[DESC_bLength];
	}
	// nothing found
	DBG("Desc %x not found!\n", wTypeIndex);
	return FALSE;
}


/**
	Configures the device according to the specified configuration index and
	alternate setting by parsing the installed USB descriptor list.
	A configuration index of 0 unconfigures the device.
		
	@param [in]		bConfigIndex	Configuration index
	@param [in]		bAltSetting		Alternate setting number
	
	@todo function always returns TRUE, add stricter checking?
	
	@return TRUE if successfully configured, FALSE otherwise
 */
static BOOL USBSetConfiguration(U8 bConfigIndex, U8 bAltSetting)
{
	U8	*pab;
	U8	bCurConfig, bCurAltSetting;
	U8	bEP;
	U16	wMaxPktSize;
	
	ASSERT(pabDescrip != NULL);

	if (bConfigIndex == 0) {
		// unconfigure device
		USBHwConfigDevice(FALSE);
	}
	else {
		// configure endpoints for this configuration/altsetting
		pab = (U8 *)pabDescrip;
		bCurConfig = 0xFF;
		bCurAltSetting = 0xFF;

		while (pab[DESC_bLength] != 0) {

			switch (pab[DESC_bDescriptorType]) {

			case DESC_CONFIGURATION:
				// remember current configuration index
				bCurConfig = pab[CONF_DESC_bConfigurationValue];
				break;

			case DESC_INTERFACE:
				// remember current alternate setting
				bCurAltSetting = pab[INTF_DESC_bAlternateSetting];
				break;

			case DESC_ENDPOINT:
				if ((bCurConfig == bConfigIndex) &&
					(bCurAltSetting == bAltSetting)) {
					// endpoint found for desired config and alternate setting
					bEP = pab[ENDP_DESC_bEndpointAddress];
					wMaxPktSize = 	(pab[ENDP_DESC_wMaxPacketSize]) |
									(pab[ENDP_DESC_wMaxPacketSize + 1] << 8);
					// configure endpoint
					USBHwEPConfig(bEP, wMaxPktSize);
				}
				break;

			default:
				break;
			}
			// skip to next descriptor
			pab += pab[DESC_bLength];
		}
		
		// configure device
		USBHwConfigDevice(TRUE);
	}

	return TRUE;
}


/**
	Local function to handle a standard device request
		
	@param [in]		pSetup		The setup packet
	@param [in,out]	*piLen		Pointer to data length
	@param [in,out]	ppbData		Data buffer.

	@return TRUE if the request was handled successfully
 */
static BOOL HandleStdDeviceReq(TSetupPacket *pSetup, int *piLen, U8 **ppbData)
{
	U8	*pbData = *ppbData;

	switch (pSetup->bRequest) {
	
	case REQ_GET_STATUS:
		// bit 0: self-powered
		// bit 1: remote wakeup = not supported
		pbData[0] = 0;
		pbData[1] = 0;
		*piLen = 2;
		break;
		
	case REQ_SET_ADDRESS:
		USBHwSetAddress(pSetup->wValue);
		break;

	case REQ_GET_DESCRIPTOR:
		DBG("D%x", pSetup->wValue);
		return USBGetDescriptor(pSetup->wValue, pSetup->wIndex, piLen, ppbData);

	case REQ_GET_CONFIGURATION:
		// indicate if we are configured
		pbData[0] = bConfiguration;
		*piLen = 1;
		break;

	case REQ_SET_CONFIGURATION:
		if (!USBSetConfiguration(pSetup->wValue & 0xFF, 0)) {
			DBG("USBSetConfiguration failed!\n");
			return FALSE;
		}
		// configuration successful, update current configuration
		bConfiguration = pSetup->wValue & 0xFF;	
		break;

	case REQ_CLEAR_FEATURE:
	case REQ_SET_FEATURE:
		if (pSetup->wValue == FEA_REMOTE_WAKEUP) {
			// put DEVICE_REMOTE_WAKEUP code here
		}
		if (pSetup->wValue == FEA_TEST_MODE) {
			// put TEST_MODE code here
		}
		return FALSE;

	case REQ_SET_DESCRIPTOR:
		DBG("Device req %d not implemented\n", pSetup->bRequest);
		return FALSE;

	default:
		DBG("Illegal device req %d\n", pSetup->bRequest);
		return FALSE;
	}
	
	return TRUE;
}


/**
	Local function to handle a standard interface request
		
	@param [in]		pSetup		The setup packet
	@param [in,out]	*piLen		Pointer to data length
	@param [in]		ppbData		Data buffer.

	@return TRUE if the request was handled successfully
 */
static BOOL HandleStdInterfaceReq(TSetupPacket	*pSetup, int *piLen, U8 **ppbData)
{
	U8	*pbData = *ppbData;

	switch (pSetup->bRequest) {

	case REQ_GET_STATUS:
		// no bits specified
		pbData[0] = 0;
		pbData[1] = 0;
		*piLen = 2;
		break;

	case REQ_CLEAR_FEATURE:
	case REQ_SET_FEATURE:
		// not defined for interface
		return FALSE;
	
	case REQ_GET_INTERFACE:	// TODO use bNumInterfaces
        // there is only one interface, return n-1 (= 0)
		pbData[0] = 0;
		*piLen = 1;
		break;
	
	case REQ_SET_INTERFACE:	// TODO use bNumInterfaces
		// there is only one interface (= 0)
		if (pSetup->wValue != 0) {
			return FALSE;
		}
		*piLen = 0;
		break;

	default:
		DBG("Illegal interface req %d\n", pSetup->bRequest);
		return FALSE;
	}

	return TRUE;
}


/**
	Local function to handle a standard endpoint request
		
	@param [in]		pSetup		The setup packet
	@param [in,out]	*piLen		Pointer to data length
	@param [in]		ppbData		Data buffer.

	@return TRUE if the request was handled successfully
 */
static BOOL HandleStdEndPointReq(TSetupPacket	*pSetup, int *piLen, U8 **ppbData)
{
	U8	*pbData = *ppbData;

	switch (pSetup->bRequest) {
	case REQ_GET_STATUS:
		// bit 0 = endpointed halted or not
		pbData[0] = (USBHwEPGetStatus(pSetup->wIndex) & EP_STATUS_STALLED) ? 1 : 0;
		pbData[1] = 0;
		*piLen = 2;
		break;
		
	case REQ_CLEAR_FEATURE:
		if (pSetup->wValue == FEA_ENDPOINT_HALT) {
			// clear HALT by unstalling
			USBHwEPStall(pSetup->wIndex, FALSE);
			break;
		}
		// only ENDPOINT_HALT defined for endpoints
		return FALSE;
	
	case REQ_SET_FEATURE:
		if (pSetup->wValue == FEA_ENDPOINT_HALT) {
			// set HALT by stalling
			USBHwEPStall(pSetup->wIndex, TRUE);
			break;
		}
		// only ENDPOINT_HALT defined for endpoints
		return FALSE;

	case REQ_SYNCH_FRAME:
		DBG("EP req %d not implemented\n", pSetup->bRequest);
		return FALSE;

	default:
		DBG("Illegal EP req %d\n", pSetup->bRequest);
		return FALSE;
	}
	
	return TRUE;
}


/**
	Default handler for standard ('chapter 9') requests
	
	If a custom request handler was installed, this handler is called first.
		
	@param [in]		pSetup		The setup packet
	@param [in,out]	*piLen		Pointer to data length
	@param [in]		ppbData		Data buffer.

	@return TRUE if the request was handled successfully
 */
BOOL USBHandleStandardRequest(TSetupPacket	*pSetup, int *piLen, U8 **ppbData)
{
	// try the custom request handler first
	if ((pfnHandleCustomReq != NULL) && pfnHandleCustomReq(pSetup, piLen, ppbData)) {
		return TRUE;
	}
	
	switch (REQTYPE_GET_RECIP(pSetup->bmRequestType)) {
	case REQTYPE_RECIP_DEVICE:		return HandleStdDeviceReq(pSetup, piLen, ppbData);
	case REQTYPE_RECIP_INTERFACE:	return HandleStdInterfaceReq(pSetup, piLen, ppbData);
	case REQTYPE_RECIP_ENDPOINT: 	return HandleStdEndPointReq(pSetup, piLen, ppbData);
	default: 						return FALSE;
	}
}


/**
	Registers a callback for custom device requests
	
	In USBHandleStandardRequest, the custom request handler gets a first
	chance at handling the request before it is handed over to the 'chapter 9'
	request handler.
	
	This can be used for example in HID devices, where a REQ_GET_DESCRIPTOR
	request is sent to an interface, which is not covered by the 'chapter 9'
	specification.
		
	@param [in]	pfnHandler	Callback function pointer
 */
void USBRegisterCustomReqHandler(TFnHandleRequest *pfnHandler)
{
	pfnHandleCustomReq = pfnHandler;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美熟乱第一页| 一本大道av伊人久久综合| 亚洲午夜在线观看视频在线| 日本一区二区免费在线| 久久日韩粉嫩一区二区三区 | 国产精品嫩草99a| 久久久国产一区二区三区四区小说| 欧美一级二级三级乱码| 欧美一区二区视频在线观看2020| 欧美片网站yy| 日韩精品一区二区三区蜜臀 | 中文字幕精品一区二区精品绿巨人 | 成人av网在线| 色素色在线综合| 欧美日本在线播放| 日韩欧美精品在线| 国产三级一区二区| 一区二区三区四区在线免费观看| 亚洲一区二区三区四区在线 | 国产一区二区三区在线观看免费视频 | 午夜欧美视频在线观看| 日韩一区精品字幕| 久久国产精品区| 成人黄色777网| 欧美在线视频日韩| 精品国产区一区| 亚洲欧洲精品成人久久奇米网| 亚洲精品国产第一综合99久久| 视频一区在线播放| 成人一二三区视频| 欧美午夜精品久久久久久孕妇| 日韩午夜精品视频| 自拍偷自拍亚洲精品播放| 日韩精品国产欧美| av亚洲精华国产精华| 欧美精三区欧美精三区| 国产欧美一区二区三区沐欲| 亚洲欧美福利一区二区| 激情另类小说区图片区视频区| 成人国产在线观看| 日韩欧美国产不卡| 亚洲国产一区二区三区| 国产精品香蕉一区二区三区| 亚洲一级二级三级| 免费高清不卡av| 99久久精品国产观看| 欧美一级高清片| 一区二区在线观看视频| 国产99久久久国产精品潘金| 欧美人与z0zoxxxx视频| 国产精品麻豆一区二区| 国产伦精品一区二区三区视频青涩| 在线观看国产91| 国产欧美日韩另类一区| 久久精品国产一区二区| 欧美高清www午色夜在线视频| 中文字幕中文在线不卡住| 国内精品免费**视频| 欧美一级爆毛片| 午夜伊人狠狠久久| 欧美日韩中文字幕一区| 最新久久zyz资源站| 国产精品一区二区久久精品爱涩 | 亚洲国产sm捆绑调教视频| 国产69精品一区二区亚洲孕妇| 日韩午夜激情av| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩精品一区二区| 亚洲一区二区偷拍精品| 色综合久久88色综合天天免费| 国产精品情趣视频| 不卡一区二区三区四区| 中文字幕av资源一区| 国产一区不卡精品| 久久男人中文字幕资源站| 日本视频一区二区| 日韩午夜av电影| 久久精品国产精品亚洲红杏| 精品国产一区二区精华| 久久99精品网久久| 久久久国产午夜精品| 岛国一区二区三区| 亚洲乱码中文字幕| 欧美调教femdomvk| 男男gaygay亚洲| 久久亚洲精品国产精品紫薇| 国产毛片精品视频| 国产精品国产馆在线真实露脸| 成人美女在线观看| 亚洲综合激情网| 91精品国产一区二区三区| 免费亚洲电影在线| 国产免费成人在线视频| 色综合久久久久网| 久久精品免费观看| 国产精品久久久久婷婷| 欧美日韩免费观看一区二区三区| 日本美女一区二区三区| 久久老女人爱爱| 一本大道久久a久久综合| 青青草精品视频| 欧美激情一区二区三区蜜桃视频 | 国产精品自在欧美一区| 亚洲日本电影在线| 欧美成人猛片aaaaaaa| 成年人国产精品| 日韩av一区二区在线影视| 久久精品夜色噜噜亚洲aⅴ| 色综合 综合色| 狠狠色综合色综合网络| 亚洲欧美偷拍三级| 精品三级av在线| 一本在线高清不卡dvd| 日本sm残虐另类| 国产精品三级电影| 3atv一区二区三区| 99riav一区二区三区| 美女看a上一区| 亚洲精品乱码久久久久久黑人 | 日韩免费一区二区| 色久综合一二码| 丁香激情综合五月| 麻豆国产精品一区二区三区| 亚洲女同一区二区| 国产欧美一二三区| 日韩精品一区二区三区视频播放| 色综合天天综合给合国产| 国产原创一区二区三区| 日韩高清中文字幕一区| 亚洲精品菠萝久久久久久久| 久久精品一区二区三区不卡牛牛| 91精品国产一区二区| 欧美三级电影精品| 99re成人在线| 国产aⅴ精品一区二区三区色成熟| 日本中文在线一区| 亚洲电影中文字幕在线观看| 国产精品第一页第二页第三页| 精品久久人人做人人爱| 欧美一区二区在线免费播放| 欧美美女喷水视频| 欧美色区777第一页| 91国内精品野花午夜精品| av福利精品导航| 岛国一区二区在线观看| 高清在线成人网| 国产精品一二三| 韩国成人福利片在线播放| 日韩精品电影在线| 蜜臀久久久99精品久久久久久| 亚洲成年人影院| 日韩主播视频在线| 偷拍一区二区三区| 日韩av中文在线观看| 日本欧美肥老太交大片| 麻豆精品一二三| 国产一区二区三区久久久 | 一本一道综合狠狠老| 色狠狠色狠狠综合| 精品视频在线免费看| 欧美久久一二三四区| 精品嫩草影院久久| 国产清纯白嫩初高生在线观看91 | 国产成人综合亚洲网站| 国产91高潮流白浆在线麻豆| 成人黄页在线观看| 91小视频免费看| 欧美日韩大陆一区二区| 日韩欧美在线123| 久久免费精品国产久精品久久久久 | 欧美日韩不卡一区| 日韩视频中午一区| 国产欧美日韩亚州综合 | 91麻豆蜜桃一区二区三区| 成人高清av在线| 精品视频一区三区九区| 日韩精品一区二区三区中文精品| 久久精品亚洲精品国产欧美kt∨| 久久伊人蜜桃av一区二区| 国产精品视频看| 天天综合天天做天天综合| 国产又粗又猛又爽又黄91精品| 97久久精品人人澡人人爽| 欧美日韩精品高清| 久久精品视频网| 亚洲一区二区av电影| 国内一区二区视频| 色94色欧美sute亚洲线路二| 精品国一区二区三区| 综合自拍亚洲综合图不卡区| 丝袜脚交一区二区| 91在线视频播放地址| 精品久久久久久无| 午夜视频一区二区| 成人激情免费电影网址| 精品国产乱码久久| 亚洲va韩国va欧美va| 一本色道亚洲精品aⅴ| 久久精品夜夜夜夜久久| 麻豆91精品91久久久的内涵|