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

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

?? usbdlib.c

?? vxworks嵌入式實時系統的 usb底層驅動代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* usbdLib.c - USBD functional interface *//* Copyright 2000-2001 Wind River Systems, Inc. *//*Modification history--------------------01f,18sep01,wef  merge from wrs.tor2_0.usb1_1-f for veloce01e,08aug01,dat  Removing warnings01d,26jan00,rcb  Redefine <bandwidth> parameter to usbdPipeCreate() to		 express the number of bytes per second or bytes per frame		 depending on type of pipe.01c,29nov99,rcb  Increase frame number fields to 32-bits in 		 usbdCurrentFrameGet().01b,07sep99,rcb  Add management callbacks and set-bus-state API.01a,03jun99,rcb  First.*//*DESCRIPTIONImplements the USBD functional interface.  Functions are provided to invokeeach of the underlying USBD URBs (request blocks).In order to use the USBD, it is first necessary to invoke usbdInitialize().Multiple calls to usbdInitialize() may be nested so long as a correspondingnumber of calls to usbdShutdown() are also made.  This allows multiple USBDclients to be written independently and without concern for coordinating theinitialization of the independent clients.After calling usbdInitialize(), a typical system will call usbdHcdAttach()at least one time in order to attach a USB HCD (Host Controller Driver) to the USBD.  The call to usbdHcdAttach() is not typically made by normal USBDclients.  Rather, this call is generally made by a "super client" or bysystem initialization code.  After the USBD has been initialized and at least one HCD has been attached,then normal USBD operation may begin.  Normal USBD clients must registerwith the USBD by calling usbdClientRegister().	In response to this call, theUSBD allocates per-client data structures and a client callback task.Callbacks for each client are invoked from this client-unique task.  Thisimproves the USBD's ability to shield clients from one-another and to helpensure the real-time response for all clients.After a client has registered, it will most often also register for dynamicattachment notification using usbdDynamicAttachRegister().  This functionallows a special client callback routine to be invoked each time a USB deviceis attached or removed from the system.  In this way, clients may discover thereal-time attachment and removal of devices.Finally, clients may use a combination of the USBD configuration and transferfunctions to configure and exchange data with USB devices.*//* includes */#include "usb/usbPlatform.h"#include "string.h"#include "usb/ossLib.h" 	/* OS services */#include "usb/usbQueueLib.h"#include "usb/usbdLib.h"	/* our API */#include "usb/usbdCoreLib.h"	/* interface to USBD core library *//* defines */#define MAX_SYNCH_SEM	    8		/* Max simultaneous requests which */					/* can be synchronized */#define SYNCH_SEM_TIMEOUT   1000	/* Time to wait for synch sem to be */					/* released during shutdown *//* locals */LOCAL int initCount = 0;		/* init nesting count */LOCAL BOOL ossInitialized = FALSE;	/* TRUE if we initialized ossLib */LOCAL BOOL coreLibInitialized = FALSE;	/* TRUE if we initialized usbdCoreLib */LOCAL QUEUE_HANDLE semPoolQueue = NULL; /* pool of synchronizing semaphores *//***************************************************************************** urbInit - Initialize a URB** Initialize the caller's URB to zeros, then store the <clientHandle>,* <function>, <callback>, <userPtr>, and <totalLen> fields passed by the* caller.** RETURNS: N/A*/LOCAL VOID urbInit    (    pURB_HEADER pUrb,			/* Clients URB */    USBD_CLIENT_HANDLE clientHandle,	/* Client handle */    UINT16 function,			/* USBD function code for header */    URB_CALLBACK callback,		/* Completion callback routine */    pVOID userPtr,			/* User-defined pointer */    UINT16 totalLen			/* Total len of URB to be allocated */    )    {    memset (pUrb, 0, totalLen);    pUrb->handle = clientHandle;    pUrb->function = function;    pUrb->callback = callback;    pUrb->userPtr = userPtr;    pUrb->urbLength = totalLen;    }/***************************************************************************** urbCallback - Internal callback used for asynchronous USBD functions** This callback will be used by urbExecBlock() as the URB_HEADER.callback* routine when urbExecBlock() executes an asynchronous USBD function.* By convention, the URB_HEADER.userPtr field will contain the SEM_HANDLE* of a semaphore which should be signalled.** RETURNS: N/A*/LOCAL VOID urbCallback    (    pVOID pUrb				/* Completed URB */    )    {    OSS_SEM_GIVE ((SEM_HANDLE) ((pURB_HEADER) pUrb)->userPtr);    }/***************************************************************************** urbExecBlock - Block on the execution of the caller's URB** Execute the <pUrb> passed by the caller and block until execution* completes. ** RETURNS: OK, or ERROR if error detected while trying to execute URB*/LOCAL STATUS urbExecBlock    (    pURB_HEADER pUrb			/* Caller's URB */    )    {    USB_MESSAGE msg;        /* Have we been initialized? */    if (initCount == 0)	return ossStatus (S_usbdLib_NOT_INITIALIZED);    /* Get a semaphore from the pool of synchronization semaphores to be     * used for this URB.     */    if (usbQueueGet (semPoolQueue, &msg, OSS_BLOCK) != OK)	return ossStatus (S_usbdLib_OUT_OF_RESOURCES);    /* msg.lParam is an available SEM_HANDLE. */    pUrb->callback = urbCallback;    pUrb->userPtr = (pVOID) msg.lParam;    if (usbdCoreEntry (pUrb) == OK)	{	/* wait for the URB to complete */	OSS_SEM_TAKE ((SEM_HANDLE) msg.lParam, OSS_BLOCK);	}    else	{	/* If the USBD reported an error, we don't know if the URB	 * callback was invoked or not (depends on how bad an error	 * the USBD detected, e.g., malformed URB).  So, we need to	 * make sure the semaphore is returned to the cleared state	 * before we put it back on the queue.	 */	OSS_SEM_TAKE ((SEM_HANDLE) msg.lParam, OSS_DONT_BLOCK);	}    usbQueuePut (semPoolQueue, 0, 0, msg.lParam, OSS_BLOCK);    return (pUrb->result == OK) ? OK : ERROR;    }/***************************************************************************** usbdInitialize - Initialize the USBD** usbdInitialize() must be called at least once prior to calling other* USBD functions.  usbdInitialize() prepares the USBD to process URBs.* Calls to usbdInitialize() may be nested, allowing multiple USBD clients* to be written independently.** RETURNS: OK, or ERROR if initialization failed.** ERRNO:*  S_usbdLib_GENERAL_FAULT*  S_usbdLib_OUT_OF_RESOURCES*  S_usbdLib_INTERNAL_FAULT*/STATUS usbdInitialize (void)    {    URB_CLIENT_UNREG urb;    SEM_HANDLE semHandle;    STATUS s = OK;    int i;    /* If not already initialized... */    if (++initCount == 1)	{	/* Initialize osServices */	if (ossInitialize () != OK)	    {	    s = ossStatus (S_usbdLib_GENERAL_FAULT);	    }	else	    {	    ossInitialized = TRUE;	    /* Create a pool of semaphores which will be used to synchronize 	     * URB completion. */	    if (usbQueueCreate (MAX_SYNCH_SEM, &semPoolQueue) != OK)		{		s = ossStatus (S_usbdLib_OUT_OF_RESOURCES);		}	    else		{		for (i = 0; s == OK && i < MAX_SYNCH_SEM; i++)		    {		    if (OSS_SEM_CREATE (1, 0, &semHandle) != OK ||			usbQueuePut (semPoolQueue, 0, 0, (UINT32) semHandle,			    OSS_DONT_BLOCK) != OK)			{			s = ossStatus (S_usbdLib_INTERNAL_FAULT);			}		    }		/* Initialize USBD core library */		if (s == OK)		    {		    urbInit (&urb.header, NULL, USBD_FNC_INITIALIZE, NULL, NULL,			sizeof (urb));		    if ((s = urbExecBlock (&urb.header)) == OK)			{			coreLibInitialized = TRUE;			}		    }		}	    }	}    if (s != OK)	usbdShutdown ();    return s;    }/***************************************************************************** usbdShutdown - Shuts down the USBD** usbdShutdown() should be called once for every successful call to * usbdInitialize().  This function frees memory and other resources used* by the USBD.** RETURNS: OK, or ERROR if shutdown failed.** ERRNO:*  S_usbdLib_NOT_INITIALIZED*/STATUS usbdShutdown (void)    {    URB_CLIENT_UNREG urb;    USB_MESSAGE msg;    STATUS s = OK;    int i;    if (initCount == 0)	{	/* Not initialized */	s = ossStatus (S_usbdLib_NOT_INITIALIZED);	}    else	{	/* We've been initialized at least once. */	if (initCount == 1)	    {	    if (coreLibInitialized)		{		/* Execute Shutdown URB */		urbInit (&urb.header, NULL, USBD_FNC_SHUTDOWN, NULL, NULL,		    sizeof (urb));		urbExecBlock (&urb.header);		coreLibInitialized = FALSE;		}	    if (semPoolQueue != NULL)		{		for (i = 0; i < MAX_SYNCH_SEM &&		    usbQueueGet (semPoolQueue, &msg, SYNCH_SEM_TIMEOUT) == OK; 		    i++)		    {		    OSS_SEM_DESTROY ((SEM_HANDLE) msg.lParam); 		    }		usbQueueDestroy (semPoolQueue);		semPoolQueue = NULL;		}	    if (ossInitialized)		{		/* Shut down osServices library */		ossShutdown ();		ossInitialized = FALSE;		}	    }	--initCount;	}    return s;    }/***************************************************************************** usbdClientRegister - Registers a new client with the USBD** This routine invokes the USBD function to register a new client.  * <pClientName> should point to a string of not more than USBD_NAME_LEN * characters (excluding terminating NULL) which can be used to uniquely * identify the client.	If successful, upon return the <pClientHandle>* will be filled with a newly assigned USBD_CLIENT_HANDLE.** RETURNS: OK, or ERROR if unable to register new client.*/STATUS usbdClientRegister     (    pCHAR pClientName,			/* Client name */    pUSBD_CLIENT_HANDLE pClientHandle	/* Client hdl returned by USBD */    )    {    URB_CLIENT_REG urb;    STATUS s;        /* Initialize URB */    urbInit (&urb.header, 0, USBD_FNC_CLIENT_REG, NULL, NULL, sizeof (urb));        if (pClientName != NULL)	strncpy (urb.clientName, pClientName, USBD_NAME_LEN);    /* Execute URB */    s = urbExecBlock (&urb.header);    /* Return result */    if (pClientHandle != NULL)	*pClientHandle = urb.header.handle;    return s;    }/***************************************************************************** usbdClientUnregister - Unregisters a USBD client** A client invokes this function to release a previously assigned * USBD_CLIENT_HANDLE.  The USBD will release all resources allocated to * the client, aborting any outstanding URBs which may exist for the client.  ** Once this function has been called with a given clientHandle, the client* must not attempt to reuse the indicated <clientHandle>.** RETURNS: OK, or ERROR if unable to unregister client.*/STATUS usbdClientUnregister    (    USBD_CLIENT_HANDLE clientHandle	/* Client handle */    )    {    URB_CLIENT_UNREG urb;    /* Initialize URB */    urbInit (&urb.header, clientHandle, USBD_FNC_CLIENT_UNREG, NULL, NULL,	sizeof (urb));    /* Execute URB */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产aⅴ无密码| 国产精品一色哟哟哟| 久久精品亚洲麻豆av一区二区| 欧美精品vⅰdeose4hd| 色成年激情久久综合| av在线不卡电影| 成人av网在线| 91丝袜美腿高跟国产极品老师 | 91精品国产综合久久福利| 在线免费亚洲电影| 欧美色成人综合| 7777精品伊人久久久大香线蕉 | 这里只有精品99re| 国产精品国产精品国产专区不蜜| 久久99国产精品久久| 国产精品一区一区| 欧美一区二区视频观看视频 | 国产精品乱码一区二区三区软件| 国产欧美日韩中文久久| 亚洲欧美影音先锋| 亚洲二区在线观看| 国产一区日韩二区欧美三区| caoporen国产精品视频| 久久久久久久久蜜桃| 一区二区在线看| 肉丝袜脚交视频一区二区| 麻豆免费精品视频| caoporn国产一区二区| 日本一区二区免费在线观看视频| 国产一区在线观看视频| 久久一区二区三区四区| 伊人夜夜躁av伊人久久| 色婷婷精品大在线视频| 欧美精品一区视频| 亚洲激情一二三区| 在线看不卡av| 日韩中文字幕亚洲一区二区va在线 | 在线中文字幕一区二区| 一区二区三区在线免费观看| 日韩黄色免费电影| 欧美精品高清视频| 日本女优在线视频一区二区| 北条麻妃一区二区三区| 国产精品二三区| 91麻豆123| 亚洲成av人片在线观看无码| 成人aa视频在线观看| 综合自拍亚洲综合图不卡区| 国产一区二区在线观看免费| 久久噜噜亚洲综合| 99久久777色| 国产欧美日韩精品在线| www.欧美.com| 亚洲午夜成aⅴ人片| 欧美一区二区三区婷婷月色 | 爽好多水快深点欧美视频| 欧美一区二区三区性视频| 国产在线精品免费av| 国产精品国产三级国产aⅴ原创| 一本大道久久a久久精品综合| 亚洲国产综合在线| 欧美精品一区二区三| 成人深夜福利app| 国产欧美日韩久久| 欧美午夜精品久久久久久孕妇| 国产精品盗摄一区二区三区| 色一情一伦一子一伦一区| 日韩电影在线观看网站| 欧美国产成人精品| 国产成人精品aa毛片| 久久久久国产精品免费免费搜索| 99re免费视频精品全部| 日本网站在线观看一区二区三区 | 日韩一级二级三级| 性久久久久久久久久久久| 久久综合狠狠综合久久激情| 色婷婷综合久色| 国产一区二区三区四区五区入口 | 国产精品久久精品日日| 欧美一区二区精美| 91在线观看视频| 久久er精品视频| 国产三级久久久| 欧美高清视频www夜色资源网| 国产成人精品午夜视频免费| 日韩专区中文字幕一区二区| 亚洲欧美综合网| 国产欧美精品区一区二区三区| 欧美美女bb生活片| 91美女在线看| 成人av在线观| 国产剧情一区二区三区| 免费精品视频在线| 久久香蕉国产线看观看99| 欧美人成免费网站| 韩国av一区二区三区四区| 国产精品久久久一本精品| 精品国产一区二区三区四区四 | 日本韩国精品一区二区在线观看| 国产美女一区二区| 久久成人免费网| 日本亚洲三级在线| 日韩成人伦理电影在线观看| 亚洲精品成人天堂一二三| 中文字幕一区二区三区蜜月| 国产亚洲欧美日韩日本| 久久久久久久国产精品影院| 日韩一区和二区| 91 com成人网| 欧美一区二区在线不卡| 欧美一级一区二区| 欧美一区二区三区四区高清| 777午夜精品免费视频| 欧美精品乱人伦久久久久久| 欧美日韩卡一卡二| 欧美区一区二区三区| 欧美精选午夜久久久乱码6080| 在线观看亚洲专区| 欧美区一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 欧美电影在哪看比较好| 555夜色666亚洲国产免| 日韩一区二区三区观看| 精品日韩一区二区三区| 色欧美88888久久久久久影院| 成a人片亚洲日本久久| 97se亚洲国产综合自在线不卡| av一区二区三区| 欧美中文字幕一区二区三区亚洲| 91福利在线看| 7777精品伊人久久久大香线蕉经典版下载 | 99久久精品免费看国产| 色综合婷婷久久| 国产精品一区二区久久不卡| 国产乱码精品一品二品| 成人黄色国产精品网站大全在线免费观看| 成人午夜视频福利| 欧美艳星brazzers| 欧美一区二区在线不卡| 国产日产欧产精品推荐色| 中文字幕一区在线观看| 午夜久久久影院| 一区二区三区在线免费观看| 午夜精品久久久久久| 精品制服美女久久| 91麻豆高清视频| 7777精品伊人久久久大香线蕉完整版| 久久在线观看免费| 一二三四社区欧美黄| 久久精品理论片| 99精品国产一区二区三区不卡| 在线国产电影不卡| 久久这里只有精品视频网| 一区二区三区自拍| 国产一区二区三区在线观看精品 | 亚洲欧洲色图综合| 免费在线看成人av| 成人国产亚洲欧美成人综合网| 欧美性感一区二区三区| 久久伊人蜜桃av一区二区| 亚洲成在线观看| 成人ar影院免费观看视频| 91精品国产综合久久久久久久久久 | 在线这里只有精品| 国产欧美日韩综合精品一区二区| 亚洲成人激情综合网| 成人在线综合网| 日韩视频一区二区| 一区二区激情视频| 成人精品视频.| 日韩欧美中文字幕制服| 亚洲另类在线一区| 国产成人免费视频一区| 日韩一级大片在线观看| 亚洲午夜精品在线| 色婷婷av久久久久久久| 国产精品女主播av| 国产精品中文字幕一区二区三区| 欧美日韩一区视频| 亚洲欧美日韩国产综合在线| 亚洲精品国产成人久久av盗摄| 国产乱码精品1区2区3区| 欧美一区二区三区免费在线看| 一区二区在线观看免费| 成人激情小说网站| 久久久久久久综合日本| 国产中文字幕精品| 精品美女被调教视频大全网站| 亚洲成av人片一区二区三区| 在线视频欧美精品| 亚洲欧美福利一区二区| 99九九99九九九视频精品| www激情久久| 国产一区二区免费看| 精品理论电影在线观看| 美国十次了思思久久精品导航| 欧美日韩黄色一区二区| 亚洲成人7777| 在线播放日韩导航| 日韩精品三区四区|