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

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

?? usb-serial.c

?? Linux驅動編程源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * USB Serial Converter driver * * Copyright (C) 1999 - 2005 Greg Kroah-Hartman (greg@kroah.com) * Copyright (C) 2000 Peter Berger (pberger@brimson.com) * Copyright (C) 2000 Al Borchers (borchers@steinerpoint.com) * *	This program is free software; you can redistribute it and/or *	modify it under the terms of the GNU General Public License version *	2 as published by the Free Software Foundation. * * This driver was originally based on the ACM driver by Armin Fuerst (which was * based on a driver by Brad Keryan) * * See Documentation/usb/usb-serial.txt for more information on using this driver * */#include <linux/config.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/tty.h>#include <linux/tty_driver.h>#include <linux/tty_flip.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/spinlock.h>#include <linux/list.h>#include <linux/smp_lock.h>#include <asm/uaccess.h>#include <asm/semaphore.h>#include <linux/usb.h>#include "usb-serial.h"#include "pl2303.h"/* * Version Information */#define DRIVER_AUTHOR "Greg Kroah-Hartman, greg@kroah.com, http://www.kroah.com/linux/"#define DRIVER_DESC "USB Serial Driver core"/* Driver structure we register with the USB core */static struct usb_driver usb_serial_driver = {	.name =		"usbserial",	.probe =	usb_serial_probe,	.disconnect =	usb_serial_disconnect,	.no_dynamic_id = 	1,};/* There is no MODULE_DEVICE_TABLE for usbserial.c.  Instead   the MODULE_DEVICE_TABLE declarations in each serial driver   cause the "hotplug" program to pull in whatever module is necessary   via modprobe, and modprobe will load usbserial because the serial   drivers depend on it.*/static int debug;static struct usb_serial *serial_table[SERIAL_TTY_MINORS];	/* initially all NULL */static LIST_HEAD(usb_serial_driver_list);struct usb_serial *usb_serial_get_by_index(unsigned index){	struct usb_serial *serial = serial_table[index];	if (serial)		kref_get(&serial->kref);	return serial;}static struct usb_serial *get_free_serial (struct usb_serial *serial, int num_ports, unsigned int *minor){	unsigned int i, j;	int good_spot;	dbg("%s %d", __FUNCTION__, num_ports);	*minor = 0;	for (i = 0; i < SERIAL_TTY_MINORS; ++i) {		if (serial_table[i])			continue;		good_spot = 1;		for (j = 1; j <= num_ports-1; ++j)			if ((i+j >= SERIAL_TTY_MINORS) || (serial_table[i+j])) {				good_spot = 0;				i += j;				break;			}		if (good_spot == 0)			continue;		*minor = i;		dbg("%s - minor base = %d", __FUNCTION__, *minor);		for (i = *minor; (i < (*minor + num_ports)) && (i < SERIAL_TTY_MINORS); ++i)			serial_table[i] = serial;		return serial;	}	return NULL;}static void return_serial(struct usb_serial *serial){	int i;	dbg("%s", __FUNCTION__);	if (serial == NULL)		return;	for (i = 0; i < serial->num_ports; ++i) {		serial_table[serial->minor + i] = NULL;	}}static void destroy_serial(struct kref *kref){	struct usb_serial *serial;	struct usb_serial_port *port;	int i;	serial = to_usb_serial(kref);	dbg("%s - %s", __FUNCTION__, serial->type->description);	serial->type->shutdown(serial);	/* return the minor range that this device had */	return_serial(serial);	for (i = 0; i < serial->num_ports; ++i)		serial->port[i]->open_count = 0;	/* the ports are cleaned up and released in port_release() */	for (i = 0; i < serial->num_ports; ++i)		if (serial->port[i]->dev.parent != NULL) {			device_unregister(&serial->port[i]->dev);			serial->port[i] = NULL;		}	/* If this is a "fake" port, we have to clean it up here, as it will	 * not get cleaned up in port_release() as it was never registered with	 * the driver core */	if (serial->num_ports < serial->num_port_pointers) {		for (i = serial->num_ports; i < serial->num_port_pointers; ++i) {			port = serial->port[i];			if (!port)				continue;			usb_kill_urb(port->read_urb);			usb_free_urb(port->read_urb);			usb_kill_urb(port->write_urb);			usb_free_urb(port->write_urb);			usb_kill_urb(port->interrupt_in_urb);			usb_free_urb(port->interrupt_in_urb);			usb_kill_urb(port->interrupt_out_urb);			usb_free_urb(port->interrupt_out_urb);			kfree(port->bulk_in_buffer);			kfree(port->bulk_out_buffer);			kfree(port->interrupt_in_buffer);			kfree(port->interrupt_out_buffer);		}	}	usb_put_dev(serial->dev);	/* free up any memory that we allocated */	kfree (serial);}/***************************************************************************** * Driver tty interface functions *****************************************************************************/static int serial_open (struct tty_struct *tty, struct file * filp){	struct usb_serial *serial;	struct usb_serial_port *port;	unsigned int portNumber;	int retval;		dbg("%s", __FUNCTION__);	/* get the serial object associated with this tty pointer */	serial = usb_serial_get_by_index(tty->index);	if (!serial) {		tty->driver_data = NULL;		return -ENODEV;	}	portNumber = tty->index - serial->minor;	port = serial->port[portNumber];	if (!port)		return -ENODEV;	if (down_interruptible(&port->sem))		return -ERESTARTSYS;	 	++port->open_count;	if (port->open_count == 1) {		/* set up our port structure making the tty driver		 * remember our port object, and us it */		tty->driver_data = port;		port->tty = tty;		/* lock this module before we call it		 * this may fail, which means we must bail out,		 * safe because we are called with BKL held */		if (!try_module_get(serial->type->driver.owner)) {			retval = -ENODEV;			goto bailout_kref_put;		}		/* only call the device specific open if this 		 * is the first time the port is opened */		retval = serial->type->open(port, filp);		if (retval)			goto bailout_module_put;	}	up(&port->sem);	return 0;bailout_module_put:	module_put(serial->type->driver.owner);bailout_kref_put:	kref_put(&serial->kref, destroy_serial);	port->open_count = 0;	up(&port->sem);	return retval;}static void serial_close(struct tty_struct *tty, struct file * filp){	struct usb_serial_port *port = tty->driver_data;	if (!port)		return;	dbg("%s - port %d", __FUNCTION__, port->number);	down(&port->sem);	if (port->open_count == 0) {		up(&port->sem);		return;	}	--port->open_count;	if (port->open_count == 0) {		/* only call the device specific close if this 		 * port is being closed by the last owner */		port->serial->type->close(port, filp);		if (port->tty) {			if (port->tty->driver_data)				port->tty->driver_data = NULL;			port->tty = NULL;		}		module_put(port->serial->type->driver.owner);	}	up(&port->sem);	kref_put(&port->serial->kref, destroy_serial);}static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count){	struct usb_serial_port *port = tty->driver_data;	int retval = -EINVAL;	if (!port)		goto exit;	dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count);	if (!port->open_count) {		dbg("%s - port not opened", __FUNCTION__);		goto exit;	}	/* pass on to the driver specific version of this function */	retval = port->serial->type->write(port, buf, count);exit:	return retval;}static int serial_write_room (struct tty_struct *tty) {	struct usb_serial_port *port = tty->driver_data;	int retval = -EINVAL;	if (!port)		goto exit;	dbg("%s - port %d", __FUNCTION__, port->number);	if (!port->open_count) {		dbg("%s - port not open", __FUNCTION__);		goto exit;	}	/* pass on to the driver specific version of this function */	retval = port->serial->type->write_room(port);exit:	return retval;}static int serial_chars_in_buffer (struct tty_struct *tty) {	struct usb_serial_port *port = tty->driver_data;	int retval = -EINVAL;	if (!port)		goto exit;	dbg("%s = port %d", __FUNCTION__, port->number);	if (!port->open_count) {		dbg("%s - port not open", __FUNCTION__);		goto exit;	}	/* pass on to the driver specific version of this function */	retval = port->serial->type->chars_in_buffer(port);exit:	return retval;}static void serial_throttle (struct tty_struct * tty){	struct usb_serial_port *port = tty->driver_data;	if (!port)		return;	dbg("%s - port %d", __FUNCTION__, port->number);	if (!port->open_count) {		dbg ("%s - port not open", __FUNCTION__);		return;	}	/* pass on to the driver specific version of this function */	if (port->serial->type->throttle)		port->serial->type->throttle(port);}static void serial_unthrottle (struct tty_struct * tty){	struct usb_serial_port *port = tty->driver_data;	if (!port)		return;	dbg("%s - port %d", __FUNCTION__, port->number);	if (!port->open_count) {		dbg("%s - port not open", __FUNCTION__);		return;	}	/* pass on to the driver specific version of this function */	if (port->serial->type->unthrottle)		port->serial->type->unthrottle(port);}static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg){	struct usb_serial_port *port = tty->driver_data;	int retval = -ENODEV;	if (!port)		goto exit;	dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd);	if (!port->open_count) {		dbg ("%s - port not open", __FUNCTION__);		goto exit;	}	/* pass on to the driver specific version of this function if it is available */	if (port->serial->type->ioctl)		retval = port->serial->type->ioctl(port, file, cmd, arg);	else		retval = -ENOIOCTLCMD;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合久久久久88| 蜜桃免费网站一区二区三区| 亚洲国产综合色| 国产精品99久久久久久似苏梦涵| 91国偷自产一区二区三区观看| 久久综合九色综合97婷婷女人| 一区二区欧美精品| 成人av在线资源网| 精品日本一线二线三线不卡| 亚洲一区国产视频| 91丨九色丨黑人外教| 精品电影一区二区三区| 五月天亚洲精品| 色狠狠色噜噜噜综合网| 欧美国产精品中文字幕| 国内精品视频666| 欧美久久久久久久久中文字幕| 亚洲精选一二三| 不卡高清视频专区| 国产精品情趣视频| 丁香网亚洲国际| 久久看人人爽人人| 国产一区二区三区日韩| 欧美成人在线直播| 免费成人av资源网| 欧美一区二区三区影视| 亚洲国产一区二区三区| 欧美亚男人的天堂| 亚洲成va人在线观看| 欧美三片在线视频观看| 亚洲一区二区三区国产| 欧美吞精做爰啪啪高潮| 亚洲国产婷婷综合在线精品| 欧美日韩日日摸| 亚洲成人自拍网| 欧美日韩成人高清| 麻豆精品一二三| 久久午夜色播影院免费高清| 韩国av一区二区三区在线观看| 2021中文字幕一区亚洲| 国产精品一线二线三线精华| 中文字幕欧美日本乱码一线二线| 成av人片一区二区| 中文字幕人成不卡一区| 色诱视频网站一区| 亚洲成人你懂的| 精品国内二区三区| a级高清视频欧美日韩| 亚洲人妖av一区二区| 欧美最新大片在线看 | 色av成人天堂桃色av| 亚洲人成在线播放网站岛国| 欧美在线观看禁18| 久久精品国产久精国产爱| 日本一区二区三区国色天香| 不卡av免费在线观看| 亚洲一区在线观看免费观看电影高清| 欧美日韩午夜在线视频| 精品在线观看视频| 中文字幕一区在线| 在线成人小视频| 国产精品18久久久久久久久| 亚洲欧美日韩小说| 日韩久久久精品| 91丨九色丨蝌蚪富婆spa| 五月天一区二区| 国产精品欧美一区喷水| 欧美日韩精品一区二区三区| 国产精品一区二区久久精品爱涩| 亚洲精选在线视频| 久久久久国产精品麻豆ai换脸| 色综合久久久久久久久久久| 另类小说综合欧美亚洲| 亚洲男人的天堂av| 精品国产制服丝袜高跟| 色综合视频一区二区三区高清| 蜜桃精品视频在线| 一区二区三区在线视频观看58| 精品欧美一区二区三区精品久久| 91成人在线精品| 国产精品1区2区3区在线观看| 亚洲午夜私人影院| 一区免费观看视频| 久久品道一品道久久精品| 欧美系列一区二区| av中文字幕一区| 精品午夜久久福利影院| 香蕉加勒比综合久久| 国产精品卡一卡二卡三| 精品99一区二区三区| 91精品在线观看入口| 97超碰欧美中文字幕| 国产一区二区福利| 理论电影国产精品| 视频一区在线视频| 一级精品视频在线观看宜春院| 国产欧美日韩亚州综合| 欧美精品一区二区三区久久久| 欧美熟乱第一页| 91在线国内视频| 成人福利视频在线| 国产另类ts人妖一区二区| 日韩av网站在线观看| 午夜激情综合网| 亚洲国产精品精华液网站| 亚洲美女在线一区| 亚洲男人的天堂在线观看| 自拍偷拍亚洲综合| 最新国产成人在线观看| 中文字幕亚洲精品在线观看| 国产欧美在线观看一区| 国产精品亲子伦对白| 国产精品久久久久永久免费观看| 亚洲国产精品二十页| 国产精品天天看| 国产精品久久久久久久久晋中| 国产精品久久久久久福利一牛影视 | 亚洲高清中文字幕| 亚洲一区在线观看网站| 午夜日韩在线电影| 免费观看30秒视频久久| 麻豆国产精品一区二区三区| 久久精品二区亚洲w码| 国产精品一区二区久激情瑜伽 | 日韩欧美色综合| 久久久精品国产免大香伊| 亚洲国产精品成人综合色在线婷婷| 国产欧美日韩久久| 18成人在线观看| 亚洲成人中文在线| 狠狠色狠狠色综合日日91app| 国产乱码精品一区二区三区忘忧草| 国产成人午夜精品影院观看视频| 国产69精品一区二区亚洲孕妇| 成年人网站91| 欧美性受xxxx| 精品免费国产二区三区| 国产欧美日韩在线看| 伊人一区二区三区| 日韩国产在线观看| 成人一级黄色片| 精品视频999| 国产校园另类小说区| 亚洲裸体在线观看| 日本欧洲一区二区| 成人自拍视频在线| 91麻豆精品国产91久久久久久久久| 欧美一区二区久久久| 国产精品久久久久久久久免费丝袜| 一级精品视频在线观看宜春院 | www.视频一区| 欧美日韩激情在线| 久久―日本道色综合久久| 自拍视频在线观看一区二区| 爽爽淫人综合网网站| 国产成人免费视| 欧美日韩成人综合| 亚洲欧洲三级电影| 精品一区二区在线播放| 日本精品免费观看高清观看| 久久综合九色综合97婷婷女人 | 3atv在线一区二区三区| 国产欧美一区二区精品秋霞影院 | 日韩欧美视频一区| 亚洲天堂中文字幕| 韩国成人福利片在线播放| 在线亚洲精品福利网址导航| 精品国产乱码久久久久久免费| 怡红院av一区二区三区| 成人性生交大片免费| 日韩精品一区二区在线| 一级女性全黄久久生活片免费| 国产成人av网站| 精品国产亚洲在线| 天堂成人国产精品一区| 日本道色综合久久| 国产欧美日本一区二区三区| 久久精品国产一区二区| 欧美日韩成人激情| 亚洲女同一区二区| 成人av在线一区二区| 久久久久久免费| 久久精品国产精品青草| 欧美日韩精品高清| 亚洲成av人片在线| 精品视频在线看| 玉米视频成人免费看| 91视频一区二区| 国产精品久久久久久久久快鸭| 国内精品视频666| 欧美成人性战久久| 卡一卡二国产精品| 日韩视频免费直播| 日韩在线a电影| 欧美一级爆毛片| 精品中文字幕一区二区小辣椒| 337p亚洲精品色噜噜狠狠| 首页国产欧美久久| 欧美一级日韩不卡播放免费| 日本美女视频一区二区|