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

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

?? linux_usbfs.c

?? 最新的libusb庫
?? C
?? 第 1 頁 / 共 4 頁
字號(hào):
	if (*config == -1)		*config = 0;	return 0;}static int op_set_configuration(struct libusb_device_handle *handle, int config){	struct linux_device_priv *priv = __device_priv(handle->dev);	int fd = __device_handle_priv(handle)->fd;	int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config);	if (r) {		if (errno == EINVAL)			return LIBUSB_ERROR_NOT_FOUND;		else if (errno == EBUSY)			return LIBUSB_ERROR_BUSY;		else if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	if (!sysfs_has_descriptors) {		/* update our cached active config descriptor */		if (config == -1) {			if (priv->config_descriptor) {				free(priv->config_descriptor);				priv->config_descriptor = NULL;			}		} else {			r = cache_active_config(handle->dev, fd, config);			if (r < 0)				usbi_warn(HANDLE_CTX(handle),					"failed to update cached config descriptor, error %d", r);		}	}	return 0;}static int op_claim_interface(struct libusb_device_handle *handle, int iface){	int fd = __device_handle_priv(handle)->fd;	int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface);	if (r) {		if (errno == ENOENT)			return LIBUSB_ERROR_NOT_FOUND;		else if (errno == EBUSY)			return LIBUSB_ERROR_BUSY;		else if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle),			"claim interface failed, error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 0;}static int op_release_interface(struct libusb_device_handle *handle, int iface){	int fd = __device_handle_priv(handle)->fd;	int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface);	if (r) {		if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle),			"release interface failed, error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 0;}static int op_set_interface(struct libusb_device_handle *handle, int iface,	int altsetting){	int fd = __device_handle_priv(handle)->fd;	struct usbfs_setinterface setintf;	int r;	setintf.interface = iface;	setintf.altsetting = altsetting;	r = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf);	if (r) {		if (errno == EINVAL)			return LIBUSB_ERROR_NOT_FOUND;		else if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle),			"setintf failed error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 0;}static int op_clear_halt(struct libusb_device_handle *handle,	unsigned char endpoint){	int fd = __device_handle_priv(handle)->fd;	unsigned int _endpoint = endpoint;	int r = ioctl(fd, IOCTL_USBFS_CLEAR_HALT, &_endpoint);	if (r) {		if (errno == ENOENT)			return LIBUSB_ERROR_NOT_FOUND;		else if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle),			"clear_halt failed error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 0;}static int op_reset_device(struct libusb_device_handle *handle){	int fd = __device_handle_priv(handle)->fd;	int r = ioctl(fd, IOCTL_USBFS_RESET, NULL);	if (r) {		if (errno == ENODEV)			return LIBUSB_ERROR_NOT_FOUND;		usbi_err(HANDLE_CTX(handle),			"reset failed error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 0;}static int op_kernel_driver_active(struct libusb_device_handle *handle,	int interface){	int fd = __device_handle_priv(handle)->fd;	struct usbfs_getdriver getdrv;	int r;	getdrv.interface = interface;	r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv);	if (r) {		if (errno == ENODATA)			return 0;		else if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle),			"get driver failed error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 1;}static int op_detach_kernel_driver(struct libusb_device_handle *handle,	int interface){	int fd = __device_handle_priv(handle)->fd;	struct usbfs_ioctl command;	int r;	command.ifno = interface;	command.ioctl_code = IOCTL_USBFS_DISCONNECT;	command.data = NULL;	r = ioctl(fd, IOCTL_USBFS_IOCTL, &command);	if (r) {		if (errno == ENODATA)			return LIBUSB_ERROR_NOT_FOUND;		else if (errno == EINVAL)			return LIBUSB_ERROR_INVALID_PARAM;		else if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;		usbi_err(HANDLE_CTX(handle),			"detach failed error %d errno %d", r, errno);		return LIBUSB_ERROR_OTHER;	}	return 0;}static void op_destroy_device(struct libusb_device *dev){	struct linux_device_priv *priv = __device_priv(dev);	if (!sysfs_has_descriptors) {		if (priv->dev_descriptor)			free(priv->dev_descriptor);		if (priv->config_descriptor)			free(priv->config_descriptor);	}	if (priv->sysfs_dir)		free(priv->sysfs_dir);}static void free_iso_urbs(struct linux_transfer_priv *tpriv){	int i;	for (i = 0; i < tpriv->num_urbs; i++) {		struct usbfs_urb *urb = tpriv->iso_urbs[i];		if (!urb)			break;		free(urb);	}	free(tpriv->iso_urbs);}static int submit_bulk_transfer(struct usbi_transfer *itransfer,	unsigned char urb_type){	struct libusb_transfer *transfer =		__USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);	struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);	struct linux_device_handle_priv *dpriv =		__device_handle_priv(transfer->dev_handle);	struct usbfs_urb *urbs;	int r;	int i;	size_t alloc_size;	/* usbfs places a 16kb limit on bulk URBs. we divide up larger requests	 * into smaller units to meet such restriction, then fire off all the	 * units at once. it would be simpler if we just fired one unit at a time,	 * but there is a big performance gain through doing it this way. */	int num_urbs = transfer->length / MAX_BULK_BUFFER_LENGTH;	int last_urb_partial = 0;	if ((transfer->length % MAX_BULK_BUFFER_LENGTH) > 0) {		last_urb_partial = 1;		num_urbs++;	}	usbi_dbg("need %d urbs for new transfer with length %d", num_urbs,		transfer->length);	alloc_size = num_urbs * sizeof(struct usbfs_urb);	urbs = malloc(alloc_size);	if (!urbs)		return LIBUSB_ERROR_NO_MEM;	memset(urbs, 0, alloc_size);	tpriv->urbs = urbs;	tpriv->num_urbs = num_urbs;	tpriv->awaiting_discard = 0;	tpriv->awaiting_reap = 0;	tpriv->reap_action = NORMAL;	for (i = 0; i < num_urbs; i++) {		struct usbfs_urb *urb = &urbs[i];		urb->usercontext = itransfer;		urb->type = urb_type;		urb->endpoint = transfer->endpoint;		urb->buffer = transfer->buffer + (i * MAX_BULK_BUFFER_LENGTH);		if (i == num_urbs - 1 && last_urb_partial)			urb->buffer_length = transfer->length % MAX_BULK_BUFFER_LENGTH;		else			urb->buffer_length = MAX_BULK_BUFFER_LENGTH;		r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb);		if (r < 0) {			int j;			if (errno == ENODEV) {				r = LIBUSB_ERROR_NO_DEVICE;			} else {				usbi_err(TRANSFER_CTX(transfer),					"submiturb failed error %d errno=%d", r, errno);				r = LIBUSB_ERROR_IO;			}				/* if the first URB submission fails, we can simply free up and			 * return failure immediately. */			if (i == 0) {				usbi_dbg("first URB failed, easy peasy");				free(urbs);				return r;			}			/* if it's not the first URB that failed, the situation is a bit			 * tricky. we must discard all previous URBs. there are			 * complications:			 *  - discarding is asynchronous - discarded urbs will be reaped			 *    later. the user must not have freed the transfer when the			 *    discarded URBs are reaped, otherwise libusb will be using			 *    freed memory.			 *  - the earlier URBs may have completed successfully and we do			 *    not want to throw away any data.			 * so, in this case we discard all the previous URBs BUT we report			 * that the transfer was submitted successfully. then later when			 * the final discard completes we can report error to the user.			 */			tpriv->reap_action = SUBMIT_FAILED;			for (j = 0; j < i; j++) {				int tmp = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, &urbs[j]);				if (tmp == 0)					tpriv->awaiting_discard++;				else if (errno == EINVAL)					tpriv->awaiting_reap++;				else					usbi_warn(TRANSFER_CTX(transfer),						"unrecognised discard return %d", tmp);			}			usbi_dbg("reporting successful submission but waiting for %d "				"discards and %d reaps before reporting error",				tpriv->awaiting_discard, tpriv->awaiting_reap);			return 0;		}	}	return 0;}static int submit_iso_transfer(struct usbi_transfer *itransfer){	struct libusb_transfer *transfer =		__USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);	struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);	struct linux_device_handle_priv *dpriv =		__device_handle_priv(transfer->dev_handle);	struct usbfs_urb **urbs;	size_t alloc_size;	int num_packets = transfer->num_iso_packets;	int i;	int this_urb_len = 0;	int num_urbs = 1;	int packet_offset = 0;	unsigned int packet_len;	unsigned char *urb_buffer = transfer->buffer;	/* usbfs places a 32kb limit on iso URBs. we divide up larger requests	 * into smaller units to meet such restriction, then fire off all the	 * units at once. it would be simpler if we just fired one unit at a time,	 * but there is a big performance gain through doing it this way. */	/* calculate how many URBs we need */	for (i = 0; i < num_packets; i++) {		int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len;		packet_len = transfer->iso_packet_desc[i].length;		if (packet_len > space_remaining) {			num_urbs++;			this_urb_len = packet_len;		} else {			this_urb_len += packet_len;		}	}	usbi_dbg("need %d 32k URBs for transfer", num_urbs);	alloc_size = num_urbs * sizeof(*urbs);	urbs = malloc(alloc_size);	if (!urbs)		return LIBUSB_ERROR_NO_MEM;	memset(urbs, 0, alloc_size);	tpriv->iso_urbs = urbs;	tpriv->num_urbs = num_urbs;	tpriv->awaiting_discard = 0;	tpriv->awaiting_reap = 0;	tpriv->reap_action = NORMAL;	tpriv->iso_packet_offset = 0;	/* allocate + initialize each URB with the correct number of packets */	for (i = 0; i < num_urbs; i++) {		struct usbfs_urb *urb;		int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH;		int urb_packet_offset = 0;		unsigned char *urb_buffer_orig = urb_buffer;		int j;		int k;		/* swallow up all the packets we can fit into this URB */		while (packet_offset < transfer->num_iso_packets) {			packet_len = transfer->iso_packet_desc[packet_offset].length;			if (packet_len <= space_remaining_in_urb) {				/* throw it in */				urb_packet_offset++;				packet_offset++;				space_remaining_in_urb -= packet_len;				urb_buffer += packet_len;			} else {				/* it can't fit, save it for the next URB */				break;			}		}		alloc_size = sizeof(*urb)			+ (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc));		urb = malloc(alloc_size);		if (!urb) {			free_iso_urbs(tpriv);			return LIBUSB_ERROR_NO_MEM;		}		memset(urb, 0, alloc_size);		urbs[i] = urb;		/* populate packet lengths */		for (j = 0, k = packet_offset - urb_packet_offset;				k < packet_offset; k++, j++) {			packet_len = transfer->iso_packet_desc[k].length;			urb->iso_frame_desc[j].length = packet_len;		}		urb->usercontext = itransfer;		urb->type = USBFS_URB_TYPE_ISO;		/* FIXME: interface for non-ASAP data? */		urb->flags = USBFS_URB_ISO_ASAP;		urb->endpoint = transfer->endpoint;		urb->number_of_packets = urb_packet_offset;		urb->buffer = urb_buffer_orig;	}	/* submit URBs */	for (i = 0; i < num_urbs; i++) {		int r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urbs[i]);		if (r < 0) {			int j;			if (errno == ENODEV) {				r = LIBUSB_ERROR_NO_DEVICE;			} else {				usbi_err(TRANSFER_CTX(transfer),					"submiturb failed error %d errno=%d", r, errno);				r = LIBUSB_ERROR_IO;			}			/* if the first URB submission fails, we can simply free up and			 * return failure immediately. */			if (i == 0) {				usbi_dbg("first URB failed, easy peasy");				free_iso_urbs(tpriv);				return r;			}			/* if it's not the first URB that failed, the situation is a bit			 * tricky. we must discard all previous URBs. there are			 * complications:			 *  - discarding is asynchronous - discarded urbs will be reaped			 *    later. the user must not have freed the transfer when the			 *    discarded URBs are reaped, otherwise libusb will be using			 *    freed memory.			 *  - the earlier URBs may have completed successfully and we do			 *    not want to throw away any data.			 * so, in this case we discard all the previous URBs BUT we report			 * that the transfer was submitted successfully. then later when			 * the final discard completes we can report error to the user.			 */			tpriv->reap_action = SUBMIT_FAILED;			for (j = 0; j < i; j++) {				int tmp = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urbs[j]);				if (tmp == 0)					tpriv->awaiting_discard++;				else if (errno == EINVAL)					tpriv->awaiting_reap++;				else					usbi_warn(TRANSFER_CTX(transfer),						"unrecognised discard return %d", tmp);			}			usbi_dbg("reporting successful submission but waiting for %d "				"discards and %d reaps before reporting error",				tpriv->awaiting_discard, tpriv->awaiting_reap);			return 0;		}	}	return 0;}static int submit_control_transfer(struct usbi_transfer *itransfer){	struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer);	struct libusb_transfer *transfer =		__USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer);	struct linux_device_handle_priv *dpriv =		__device_handle_priv(transfer->dev_handle);	struct usbfs_urb *urb;	int r;	if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH)		return LIBUSB_ERROR_INVALID_PARAM;	urb = malloc(sizeof(struct usbfs_urb));	if (!urb)		return LIBUSB_ERROR_NO_MEM;	memset(urb, 0, sizeof(struct usbfs_urb));	tpriv->urbs = urb;	tpriv->reap_action = NORMAL;	urb->usercontext = itransfer;	urb->type = USBFS_URB_TYPE_CONTROL;	urb->endpoint = transfer->endpoint;	urb->buffer = transfer->buffer;	urb->buffer_length = transfer->length;	r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb);	if (r < 0) {		free(urb);		if (errno == ENODEV)			return LIBUSB_ERROR_NO_DEVICE;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
极品美女销魂一区二区三区| 日韩成人精品在线| 亚洲一区二区3| 精品在线观看视频| 91国产精品成人| 精品成人一区二区三区| 亚洲精品成人在线| 美女网站在线免费欧美精品| 一本色道久久综合亚洲精品按摩 | 亚洲一区二区三区四区中文字幕| 视频一区中文字幕| 色吊一区二区三区| 亚洲欧洲日韩av| 国产乱码字幕精品高清av| 欧美精三区欧美精三区| 成人欧美一区二区三区在线播放| 久久er99精品| 日韩一级完整毛片| 精品综合免费视频观看| 欧美日韩一级二级| 亚洲在线观看免费视频| 波波电影院一区二区三区| 久久婷婷国产综合国色天香 | 伊人一区二区三区| 成人h版在线观看| 26uuu久久天堂性欧美| 麻豆视频观看网址久久| 在线播放日韩导航| 午夜欧美一区二区三区在线播放| 色94色欧美sute亚洲线路一久| 国产精品无人区| 国产成人精品三级| 中文字幕精品在线不卡| 精品一区二区日韩| 制服.丝袜.亚洲.另类.中文| 亚洲男女毛片无遮挡| 成人精品国产福利| 国产欧美综合在线| 成人精品高清在线| 综合久久久久久久| 亚洲免费色视频| 亚洲男人天堂av网| 极品少妇一区二区| 99国产精品久久久久| 日韩精品一区二区三区四区视频| 中文字幕不卡在线观看| 免费精品视频在线| 91蜜桃在线免费视频| 日韩精品一区在线| 亚洲精品中文字幕在线观看| 日韩综合小视频| 99精品国产热久久91蜜凸| 欧美一区二区成人| 亚洲在线视频网站| 成人午夜免费视频| 日韩欧美国产成人一区二区| 一区二区在线免费观看| 大胆亚洲人体视频| 精品国产一二三区| 日韩成人午夜电影| 在线观看av一区| 亚洲欧美日韩中文播放| 国产精品1区2区| 精品国产乱码久久久久久牛牛| 亚洲一二三四区不卡| 91理论电影在线观看| 国产性做久久久久久| 美国毛片一区二区三区| 69精品人人人人| 亚洲一区二区三区四区中文字幕| 国产成人h网站| 国产亚洲va综合人人澡精品| 国产一区二区三区综合| 欧美成人精品3d动漫h| 久久不见久久见免费视频7| 5566中文字幕一区二区电影 | 欧美天天综合网| 亚洲裸体xxx| 色狠狠av一区二区三区| 中文字幕不卡三区| 国产麻豆精品在线| 欧美精品一区二区三区久久久| 日韩**一区毛片| 欧美美女网站色| 亚洲第一成人在线| 欧美疯狂做受xxxx富婆| 日韩二区三区在线观看| 日韩视频一区二区三区| 国内精品伊人久久久久av一坑 | av电影一区二区| 亚洲色图20p| 色婷婷综合久久久中文字幕| 亚洲自拍偷拍av| 欧美精品 日韩| 青草av.久久免费一区| 欧美一区二区啪啪| 国产麻豆精品久久一二三| 国产无遮挡一区二区三区毛片日本| 国产精品主播直播| 亚洲三级电影网站| 欧美日韩精品综合在线| 日韩av在线免费观看不卡| 久久综合五月天婷婷伊人| 99久久久久久| 日韩电影免费一区| 中文字幕 久热精品 视频在线 | 激情文学综合插| 中文字幕va一区二区三区| 欧美三级中文字| 国产一区二区福利视频| **欧美大码日韩| 一本大道久久a久久综合婷婷| 99久久精品免费精品国产| 国产91高潮流白浆在线麻豆| 国产一区二区女| 国产精品一区二区不卡| 国产精品一区在线| 东方欧美亚洲色图在线| 国产91高潮流白浆在线麻豆 | 久久综合国产精品| 久久综合久色欧美综合狠狠| 精品国产1区二区| 久久亚洲精品小早川怜子| 久久久久久久综合日本| 久久久国产一区二区三区四区小说| 久久久国产精品午夜一区ai换脸| 精品国产百合女同互慰| 精品区一区二区| 久久久激情视频| 国产精品久久久久久久裸模| 日韩精品三区四区| 日韩1区2区3区| 国产精品18久久久久久久网站| 国产在线看一区| 成人午夜视频在线| 色av综合在线| 日韩欧美视频在线| 国产女人18水真多18精品一级做| 中文乱码免费一区二区| 一区二区三区在线看| 亚洲综合在线观看视频| 免费看日韩a级影片| 国产成人精品免费一区二区| av资源站一区| 欧美日韩精品电影| 精品日韩一区二区三区免费视频| 欧美大片拔萝卜| 国产精品久久网站| 亚洲国产wwwccc36天堂| 麻豆精品一区二区三区| 国产伦精品一区二区三区在线观看| 风间由美中文字幕在线看视频国产欧美| 国产美女在线观看一区| 99视频有精品| 欧美日韩免费在线视频| 欧美成人精品福利| 亚洲精品国产一区二区精华液 | 图片区小说区区亚洲影院| 日韩免费性生活视频播放| 91精品国产综合久久小美女| 在线影院国内精品| 欧美裸体bbwbbwbbw| 91美女在线视频| 色乱码一区二区三区88| 一本久久a久久精品亚洲| 91精品办公室少妇高潮对白| 国产成人av福利| 国产69精品一区二区亚洲孕妇| 国产一区二区三区四区五区美女 | 亚洲欧美另类久久久精品| 亚洲欧美视频在线观看| 一区二区三区自拍| 日韩国产高清影视| 国产精品资源站在线| 99久久婷婷国产精品综合| 在线观看欧美精品| 91精品在线免费| 久久久久国产一区二区三区四区 | 国产成人精品三级麻豆| aaa国产一区| 欧美三级韩国三级日本一级| 91精品午夜视频| 国产亚洲福利社区一区| 一区二区三区精品在线| 蜜桃视频在线观看一区二区| 国产精品系列在线播放| 不卡免费追剧大全电视剧网站| 欧美性猛交xxxxxx富婆| 日韩欧美激情在线| 中文字幕一区二区三| 日韩精品成人一区二区三区| 激情小说欧美图片| 91原创在线视频| 日韩精品一区二区三区三区免费| 亚洲国产精品ⅴa在线观看| 亚洲成va人在线观看| 成人福利在线看| 日韩欧美一区电影| 亚洲精品免费一二三区| 轻轻草成人在线|