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

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

?? core.c

?? 最新的libusb庫
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * Core functions for libusb * Copyright (C) 2007-2008 Daniel Drake <dsd@gentoo.org> * Copyright (c) 2001 Johannes Erdfelt <johannes@erdfelt.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#include <config.h>#include <errno.h>#include <poll.h>#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include "libusb.h"#include "libusbi.h"#ifdef OS_LINUXconst struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend;#else#error "Unsupported OS"#endifstruct libusb_context *usbi_default_context = NULL;static pthread_mutex_t default_context_lock = PTHREAD_MUTEX_INITIALIZER;/** * \mainpage libusb-1.0 API Reference * * \section intro Introduction * * libusb is an open source library that allows you to communicate with USB * devices from userspace. For more info, see the * <a href="http://libusb.sourceforge.net">libusb homepage</a>. * * This documentation is aimed at application developers wishing to * communicate with USB peripherals from their own software. After reviewing * this documentation, feedback and questions can be sent to the * <a href="http://sourceforge.net/mail/?group_id=1674">libusb-devel mailing * list</a>. * * This documentation assumes knowledge of how to operate USB devices from * a software standpoint (descriptors, configurations, interfaces, endpoints, * control/bulk/interrupt/isochronous transfers, etc). Full information * can be found in the <a href="http://www.usb.org/developers/docs/">USB 2.0 * Specification</a> which is available for free download. You can probably * find less verbose introductions by searching the web. * * \section features Library features * * - All transfer types supported (control/bulk/interrupt/isochronous) * - 2 transfer interfaces: *    -# Synchronous (simple) *    -# Asynchronous (more complicated, but more powerful) * - Thread safe (although the asynchronous interface means that you *   usually won't need to thread) * - Lightweight with lean API * - Compatible with libusb-0.1 through the libusb-compat-0.1 translation layer * * \section gettingstarted Getting Started * * To begin reading the API documentation, start with the Modules page which * links to the different categories of libusb's functionality. * * One decision you will have to make is whether to use the synchronous * or the asynchronous data transfer interface. The \ref io documentation * provides some insight into this topic. * * Some example programs can be found in the libusb source distribution under * the "examples" subdirectory. The libusb homepage includes a list of * real-life project examples which use libusb. * * \section errorhandling Error handling * * libusb functions typically return 0 on success or a negative error code * on failure. These negative error codes relate to LIBUSB_ERROR constants * which are listed on the \ref misc "miscellaneous" documentation page. * * \section msglog Debug message logging * * libusb does not log any messages by default. Your application is therefore * free to close stdout/stderr and those descriptors may be reused without * worry. * * The libusb_set_debug() function can be used to enable stdout/stderr logging * of certain messages. Under standard configuration, libusb doesn't really * log much at all, so you are advised to use this function to enable all * error/warning/informational messages. It will help you debug problems with * your software. * * The LIBUSB_DEBUG environment variable can be used to enable message logging * at run-time. This environment variable should be set to a number, which is * interpreted the same as the libusb_set_debug() parameter. When this * environment variable is set, the message logging verbosity level is fixed * and libusb_set_debug() effectively does nothing. * * libusb can be compiled without any logging functions, useful for embedded * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment * variable have no effects. * * libusb can also be compiled with verbose debugging messages. When the * library is compiled in this way, all messages of all verbosities are always * logged.  libusb_set_debug() and the LIBUSB_DEBUG environment variable have * no effects. * * \section remarks Other remarks * * libusb does have imperfections. The \ref caveats "caveats" page attempts * to document these. *//** * \page caveats Caveats * * \section devresets Device resets * * The libusb_reset_device() function allows you to reset a device. If your * program has to call such a function, it should obviously be aware that * the reset will cause device state to change (e.g. register values may be * reset). * * The problem is that any other program could reset the device your program * is working with, at any time. libusb does not offer a mechanism to inform * you when this has happened, so if someone else resets your device it will * not be clear to your own program why the device state has changed. * * Ultimately, this is a limitation of writing drivers in userspace. * Separation from the USB stack in the underlying kernel makes it difficult * for the operating system to deliver such notifications to your program. * The Linux kernel USB stack allows such reset notifications to be delivered * to in-kernel USB drivers, but it is not clear how such notifications could * be delivered to second-class drivers that live in userspace. * * \section blockonly Blocking-only functionality * * The functionality listed below is only available through synchronous, * blocking functions. There are no asynchronous/non-blocking alternatives, * and no clear ways of implementing these. * * - Configuration activation (libusb_set_configuration()) * - Interface/alternate setting activation (libusb_set_interface_alt_setting()) * - Releasing of interfaces (libusb_release_interface()) * - Clearing of halt/stall condition (libusb_clear_halt()) * - Device resets (libusb_reset_device()) * * \section nohotplug No hotplugging * * libusb-1.0 lacks functionality for providing notifications of when devices * are added or removed. This functionality is planned to be implemented * for libusb-1.1. * * That said, there is basic disconnection handling for open device handles: *  - If there are ongoing transfers, libusb's handle_events loop will detect *    disconnections and complete ongoing transfers with the *    LIBUSB_TRANSFER_NO_DEVICE status code. *  - Many functions such as libusb_set_configuration() return the special *    LIBUSB_ERROR_NO_DEVICE error code when the device has been disconnected. * * \section configsel Configuration selection and handling * * When libusb presents a device handle to an application, there is a chance * that the corresponding device may be in unconfigured state. For devices * with multiple configurations, there is also a chance that the configuration * currently selected is not the one that the application wants to use. * * The obvious solution is to add a call to libusb_set_configuration() early * on during your device initialization routines, but there are caveats to * be aware of: * -# If the device is already in the desired configuration, calling *    libusb_set_configuration() using the same configuration value will cause *    a lightweight device reset. This may not be desirable behaviour. * -# libusb will be unable to change configuration if the device is in *    another configuration and other programs or drivers have claimed *    interfaces under that configuration. * -# In the case where the desired configuration is already active, libusb *    may not even be able to perform a lightweight device reset. For example, *    take my USB keyboard with fingerprint reader: I'm interested in driving *    the fingerprint reader interface through libusb, but the kernel's *    USB-HID driver will almost always have claimed the keyboard interface. *    Because the kernel has claimed an interface, it is not even possible to *    perform the lightweight device reset, so libusb_set_configuration() will *    fail. (Luckily the device in question only has a single configuration.) * * One solution to some of the above problems is to consider the currently * active configuration. If the configuration we want is already active, then * we don't have to select any configuration:\codecfg = libusb_get_configuration(dev);if (cfg != desired)	libusb_set_configuration(dev, desired);\endcode * * This is probably suitable for most scenarios, but is inherently racy: * another application or driver may change the selected configuration * <em>after</em> the libusb_get_configuration() call. * * Even in cases where libusb_set_configuration() succeeds, consider that other * applications or drivers may change configuration after your application * calls libusb_set_configuration(). * * One possible way to lock your device into a specific configuration is as * follows: * -# Set the desired configuration (or use the logic above to realise that *    it is already in the desired configuration) * -# Claim the interface that you wish to use * -# Check that the currently active configuration is the one that you want *    to use. * * The above method works because once an interface is claimed, no application * or driver is able to select another configuration. *//** * \page contexts Contexts * * It is possible that libusb may be used simultaneously from two independent * libraries linked into the same executable. For example, if your application * has a plugin-like system which allows the user to dynamically load a range * of modules into your program, it is feasible that two independently * developed modules may both use libusb. * * libusb is written to allow for these multiple user scenarios. The two * "instances" of libusb will not interfere: libusb_set_debug() calls * from one user will not affect the same settings for other users, other * users can continue using libusb after one of them calls libusb_exit(), etc. * * This is made possible through libusb's <em>context</em> concept. When you * call libusb_init(), you are (optionally) given a context. You can then pass * this context pointer back into future libusb functions. * * In order to keep things simple for more simplistic applications, it is * legal to pass NULL to all functions requiring a context pointer (as long as * you're sure no other code will attempt to use libusb from the same process). * When you pass NULL, the default context will be used. The default context * is created the first time a process calls libusb_init() when no other * context is alive. Contexts are destroyed during libusb_exit(). * * You may be wondering why only a subset of libusb functions require a * context pointer in their function definition. Internally, libusb stores * context pointers in other objects (e.g. libusb_device instances) and hence * can infer the context from those objects. *//** * @defgroup lib Library initialization/deinitialization * This page details how to initialize and deinitialize libusb. Initialization * must be performed before using any libusb functionality, and similarly you * must not call any libusb functions after deinitialization. *//** * @defgroup dev Device handling and enumeration * The functionality documented below is designed to help with the following * operations: * - Enumerating the USB devices currently attached to the system * - Choosing a device to operate from your software * - Opening and closing the chosen device * * \section nutshell In a nutshell... * * The description below really makes things sound more complicated than they * actually are. The following sequence of function calls will be suitable * for almost all scenarios and does not require you to have such a deep * understanding of the resource management issues: * \code// discover deviceslibusb_device **list;libusb_device *found = NULL;size_t cnt = libusb_get_device_list(NULL, &list);size_t i = 0;int err = 0;if (cnt < 0)	error();for (i = 0; i < cnt; i++) {	libusb_device *device = list[i];	if (is_interesting(device)) {		found = device;		break;	}}if (found) {	libusb_device_handle *handle;	err = libusb_open(found, &handle);	if (err)		error();	// etc}libusb_free_device_list(list, 1);\endcode * * The two important points: * - You asked libusb_free_device_list() to unreference the devices (2nd *   parameter) * - You opened the device before freeing the list and unreferencing the *   devices * * If you ended up with a handle, you can now proceed to perform I/O on the * device. * * \section devshandles Devices and device handles * libusb has a concept of a USB device, represented by the * \ref libusb_device opaque type. A device represents a USB device that * is currently or was previously connected to the system. Using a reference * to a device, you can determine certain information about the device (e.g. * you can read the descriptor data). * * The libusb_get_device_list() function can be used to obtain a list of * devices currently connected to the system. This is known as device * discovery. * * Just because you have a reference to a device does not mean it is * necessarily usable. The device may have been unplugged, you may not have * permission to operate such device, or another program or driver may be * using the device. * * When you've found a device that you'd like to operate, you must ask * libusb to open the device using the libusb_open() function. Assuming * success, libusb then returns you a <em>device handle</em> * (a \ref libusb_device_handle pointer). All "real" I/O operations then * operate on the handle rather than the original device pointer. * * \section devref Device discovery and reference counting * * Device discovery (i.e. calling libusb_get_device_list()) returns a * freshly-allocated list of devices. The list itself must be freed when * you are done with it. libusb also needs to know when it is OK to free * the contents of the list - the devices themselves. * * To handle these issues, libusb provides you with two separate items: * - A function to free the list itself * - A reference counting system for the devices inside * * New devices presented by the libusb_get_device_list() function all have a * reference count of 1. You can increase and decrease reference count using * libusb_ref_device() and libusb_unref_device(). A device is destroyed when * it's reference count reaches 0. * * With the above information in mind, the process of opening a device can * be viewed as follows: * -# Discover devices using libusb_get_device_list(). * -# Choose the device that you want to operate, and call libusb_open(). * -# Unref all devices in the discovered device list. * -# Free the discovered device list. * * The order is important - you must not unreference the device before * attempting to open it, because unreferencing it may destroy the device. * * For convenience, the libusb_free_device_list() function includes a * parameter to optionally unreference all the devices in the list before * freeing the list itself. This combines steps 3 and 4 above. * * As an implementation detail, libusb_open() actually adds a reference to * the device in question. This is because the device remains available * through the handle via libusb_get_device(). The reference is deleted during * libusb_close(). *//** @defgroup misc Miscellaneous *//* we traverse usbfs without knowing how many devices we are going to find. * so we create this discovered_devs model which is similar to a linked-list * which grows when required. it can be freed once discovery has completed, * eliminating the need for a list node in the libusb_device structure * itself. */#define DISCOVERED_DEVICES_SIZE_STEP 8static struct discovered_devs *discovered_devs_alloc(void){	struct discovered_devs *ret =		malloc(sizeof(*ret) + (sizeof(void *) * DISCOVERED_DEVICES_SIZE_STEP));	if (ret) {		ret->len = 0;		ret->capacity = DISCOVERED_DEVICES_SIZE_STEP;	}	return ret;}/* append a device to the discovered devices collection. may realloc itself, * returning new discdevs. returns NULL on realloc failure. */struct discovered_devs *discovered_devs_append(	struct discovered_devs *discdevs, struct libusb_device *dev){	size_t len = discdevs->len;	size_t capacity;	/* if there is space, just append the device */	if (len < discdevs->capacity) {		discdevs->devices[len] = libusb_ref_device(dev);		discdevs->len++;		return discdevs;	}	/* exceeded capacity, need to grow */	usbi_dbg("need to increase capacity");	capacity = discdevs->capacity + DISCOVERED_DEVICES_SIZE_STEP;	discdevs = realloc(discdevs,		sizeof(*discdevs) + (sizeof(void *) * capacity));	if (discdevs) {		discdevs->capacity = capacity;		discdevs->devices[len] = libusb_ref_device(dev);		discdevs->len++;	}	return discdevs;}static void discovered_devs_free(struct discovered_devs *discdevs){	size_t i;	for (i = 0; i < discdevs->len; i++)		libusb_unref_device(discdevs->devices[i]);	free(discdevs);}/* Allocate a new device with a specific session ID. The returned device has * a reference count of 1. */struct libusb_device *usbi_alloc_device(struct libusb_context *ctx,	unsigned long session_id){	size_t priv_size = usbi_backend->device_priv_size;	struct libusb_device *dev = malloc(sizeof(*dev) + priv_size);	int r;	if (!dev)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久www成人免费毛片麻豆| 欧美经典一区二区| 亚洲成人av在线电影| 99久久婷婷国产综合精品电影 | 欧美日韩一区二区在线观看| 中文字幕在线免费不卡| 成人高清在线视频| 欧美极品美女视频| 成人av在线资源| 综合久久久久久| 91看片淫黄大片一级在线观看| 亚洲国产精品传媒在线观看| 床上的激情91.| 国产精品免费视频观看| 成人免费三级在线| 亚洲欧洲精品一区二区三区| 91网页版在线| 亚洲在线视频网站| 欧美日韩高清一区二区不卡| 视频一区二区三区在线| 在线播放一区二区三区| 久久精品国产**网站演员| 日韩精品中文字幕一区二区三区| 久久国产精品色| 337p粉嫩大胆噜噜噜噜噜91av| 国内精品嫩模私拍在线| 国产日韩av一区| 91色.com| 亚洲一区二区三区在线播放| 欧美日韩黄视频| 老司机精品视频导航| 久久久久久久综合| 99久久久国产精品| 一区二区三区在线视频免费| 欧美视频中文字幕| 麻豆免费看一区二区三区| 精品sm捆绑视频| 国产99一区视频免费| 国产一区二三区好的| 国产欧美一区在线| 色婷婷综合久色| 日韩制服丝袜av| 久久久噜噜噜久久人人看 | 欧洲精品中文字幕| 日本欧美一区二区| 国产日韩欧美精品电影三级在线 | 成人精品电影在线观看| 一区二区三区四区蜜桃| 欧美一级高清片| 粉嫩av一区二区三区粉嫩| 一区二区三区中文免费| 日韩一卡二卡三卡| 国产成人av网站| 一区二区三区电影在线播| 制服丝袜亚洲网站| 成人免费视频app| 亚洲成年人网站在线观看| 久久这里只有精品视频网| 91浏览器打开| 免费观看91视频大全| 国产精品情趣视频| 欧美二区三区91| 成人午夜在线免费| 亚洲电影视频在线| 欧美韩日一区二区三区| 在线不卡中文字幕| 成人a区在线观看| 美女视频黄久久| 日韩一区在线播放| 欧美精品亚洲二区| 99视频精品免费视频| 蜜臀久久99精品久久久画质超高清| 日本一区二区三区高清不卡 | 在线播放中文一区| 处破女av一区二区| 美女视频黄免费的久久 | 国产又黄又大久久| 亚洲国产美国国产综合一区二区| 久久久99久久| 欧美一卡二卡三卡| 色婷婷久久久综合中文字幕| 国产米奇在线777精品观看| 亚洲电影在线免费观看| 国产精品久久久久久一区二区三区| 91精品国产色综合久久不卡电影| 91麻豆国产在线观看| 久久66热偷产精品| 亚洲一区二区三区四区五区黄| 国产片一区二区| 欧美一区二区播放| 欧美日韩在线不卡| 99久久精品久久久久久清纯| 狠狠色综合色综合网络| 亚洲成人动漫精品| 亚洲日本在线a| 国产欧美日韩在线看| 日韩午夜中文字幕| 欧美日韩中文字幕一区二区| zzijzzij亚洲日本少妇熟睡| 欧美综合天天夜夜久久| 成人美女在线观看| 国产乱子轮精品视频| 午夜精品一区二区三区电影天堂 | 欧美成人vr18sexvr| 欧美午夜精品久久久久久超碰| 成人av在线电影| 国产传媒日韩欧美成人| 久久精品国产秦先生| 三级成人在线视频| 亚洲一区中文日韩| 亚洲卡通动漫在线| 亚洲伦在线观看| 日韩毛片高清在线播放| 国产精品蜜臀在线观看| 久久蜜臀中文字幕| 久久伊人蜜桃av一区二区| 日韩欧美激情一区| 日韩欧美电影一二三| 欧美一级免费大片| 91精品国产免费| 欧美一区二区不卡视频| 欧美一区二区视频网站| 在线播放视频一区| 欧美人妇做爰xxxⅹ性高电影 | 欧美精品视频www在线观看| 在线亚洲免费视频| 欧美中文字幕不卡| 在线观看网站黄不卡| 在线观看一区日韩| 在线观看一区不卡| 欧美日韩精品系列| 在线播放国产精品二区一二区四区 | 色综合久久久久久久| 91在线一区二区| 日本韩国精品在线| 欧美性猛片xxxx免费看久爱| 欧美性猛交xxxx乱大交退制版 | 中文字幕一区二| 亚洲人快播电影网| 一区二区三区国产精品| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲另类色综合网站| 亚洲国产一区二区三区| 亚洲国产精品久久人人爱| 五月激情综合网| 蓝色福利精品导航| 国模一区二区三区白浆| 国产成人免费视频网站高清观看视频| 国产凹凸在线观看一区二区| 成人性生交大片免费看中文 | 久久久天堂av| 国产欧美精品国产国产专区| 国产精品久久久99| 一个色妞综合视频在线观看| 视频一区二区国产| 国内精品伊人久久久久av影院 | 日韩欧美国产高清| 国产亚洲女人久久久久毛片| 国产精品超碰97尤物18| 亚洲国产一区二区a毛片| 美女一区二区久久| 国产69精品久久久久毛片| 色综合一区二区三区| 欧美日韩一区二区三区四区五区 | 中文字幕巨乱亚洲| 亚洲精品国产一区二区精华液| 亚洲成人你懂的| 久久国产乱子精品免费女| 成人国产免费视频| 欧美少妇性性性| 久久婷婷国产综合国色天香 | 一区二区三区波多野结衣在线观看| 亚洲一二三四久久| 麻豆成人av在线| 国产一区二区精品久久99| 99精品久久99久久久久| 3d动漫精品啪啪一区二区竹菊| 精品国产sm最大网站免费看| 亚洲天堂中文字幕| 蜜桃精品在线观看| 99久久精品国产毛片| 欧美一区二区三区四区久久| 国产精品天干天干在观线| 午夜精品视频在线观看| 国产精品系列在线观看| 在线亚洲免费视频| 国产亚洲一区二区三区四区| 一区二区三区四区中文字幕| 蓝色福利精品导航| 在线一区二区观看| 亚洲精品在线一区二区| 怡红院av一区二区三区| 国产美女av一区二区三区| 在线视频国内一区二区| 国产视频亚洲色图| 天堂午夜影视日韩欧美一区二区| 风间由美一区二区av101| 欧美一区二区久久| 亚洲视频在线一区| 精品一区二区三区欧美|