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

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

?? keyspan_pda.c

?? linux和2410結(jié)合開發(fā) 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * USB Keyspan PDA / Xircom / Entregra Converter driver * * Copyright (c) 1999 - 2001 Greg Kroah-Hartman	<greg@kroah.com> * Copyright (c) 1999, 2000 Brian Warner	<warner@lothar.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 as published by *	the Free Software Foundation; either version 2 of the License, or *	(at your option) any later version. * * See Documentation/usb/usb-serial.txt for more information on using this driver *  * (09/07/2001) gkh *	cleaned up the Xircom support.  Added ids for Entregra device which is *	the same as the Xircom device.  Enabled the code to be compiled for *	either Xircom or Keyspan devices. * * (08/11/2001) Cristian M. Craciunescu *	support for Xircom PGSDB9 * * (05/31/2001) gkh *	switched from using spinlock to a semaphore, which fixes lots of problems. * * (04/08/2001) gb *	Identify version on module load. *  * (11/01/2000) Adam J. Richter *	usb_device_id table support *  * (10/05/2000) gkh *	Fixed bug with urb->dev not being set properly, now that the usb *	core needs it. *  * (08/28/2000) gkh *	Added locks for SMP safeness. *	Fixed MOD_INC and MOD_DEC logic and the ability to open a port more  *	than once. *  * (07/20/2000) borchers *	- keyspan_pda_write no longer sleeps if it is called on interrupt time; *	  PPP and the line discipline with stty echo on can call write on *	  interrupt time and this would cause an oops if write slept *	- if keyspan_pda_write is in an interrupt, it will not call *	  usb_control_msg (which sleeps) to query the room in the device *	  buffer, it simply uses the current room value it has *	- if the urb is busy or if it is throttled keyspan_pda_write just *	  returns 0, rather than sleeping to wait for this to change; the *	  write_chan code in n_tty.c will sleep if needed before calling *	  keyspan_pda_write again *	- if the device needs to be unthrottled, write now queues up the *	  call to usb_control_msg (which sleeps) to unthrottle the device *	- the wakeups from keyspan_pda_write_bulk_callback are queued rather *	  than done directly from the callback to avoid the race in write_chan *	- keyspan_pda_chars_in_buffer also indicates its buffer is full if the *	  urb status is -EINPROGRESS, meaning it cannot write at the moment *       * (07/19/2000) gkh *	Added module_init and module_exit functions to handle the fact that this *	driver is a loadable module now. * * (03/26/2000) gkh *	Split driver up into device specific pieces. *  */#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/signal.h>#include <linux/errno.h>#include <linux/poll.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/fcntl.h>#include <linux/tty.h>#include <linux/tty_driver.h>#include <linux/tty_flip.h>#include <linux/module.h>#include <linux/spinlock.h>#include <linux/tqueue.h>#include <linux/usb.h>#ifdef CONFIG_USB_SERIAL_DEBUG	static int debug = 1;#else	static int debug;#endifstruct ezusb_hex_record {	__u16 address;	__u8 data_size;	__u8 data[16];};/* make a simple define to handle if we are compiling keyspan_pda or xircom support */#if defined(CONFIG_USB_SERIAL_KEYSPAN_PDA) || defined(CONFIG_USB_SERIAL_KEYSPAN_PDA_MODULE)	#define KEYSPAN#else	#undef KEYSPAN#endif#if defined(CONFIG_USB_SERIAL_XIRCOM) || defined(CONFIG_USB_SERIAL_XIRCOM_MODULE)	#define XIRCOM#else	#undef XIRCOM#endif#ifdef KEYSPAN#include "keyspan_pda_fw.h"#endif#ifdef XIRCOM#include "xircom_pgs_fw.h"#endif#include "usb-serial.h"/* * Version Information */#define DRIVER_VERSION "v1.1"#define DRIVER_AUTHOR "Brian Warner <warner@lothar.com>"#define DRIVER_DESC "USB Keyspan PDA Converter driver"struct keyspan_pda_private {	int			tx_room;	int			tx_throttled;	struct tq_struct	wakeup_task;	struct tq_struct	unthrottle_task;};#define KEYSPAN_VENDOR_ID		0x06cd#define KEYSPAN_PDA_FAKE_ID		0x0103#define KEYSPAN_PDA_ID			0x0104 /* no clue *//* For Xircom PGSDB9 and older Entregra version of the same device */#define XIRCOM_VENDOR_ID		0x085a#define XIRCOM_FAKE_ID			0x8027#define ENTREGRA_VENDOR_ID		0x1645#define ENTREGRA_FAKE_ID		0x8093static __devinitdata struct usb_device_id id_table_combined [] = {#ifdef KEYSPAN	{ USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },#endif#ifdef XIRCOM	{ USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },	{ USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },#endif	{ USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },	{ }						/* Terminating entry */};MODULE_DEVICE_TABLE (usb, id_table_combined);static __devinitdata struct usb_device_id id_table_std [] = {	{ USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_ID) },	{ }						/* Terminating entry */};#ifdef KEYSPANstatic __devinitdata struct usb_device_id id_table_fake [] = {	{ USB_DEVICE(KEYSPAN_VENDOR_ID, KEYSPAN_PDA_FAKE_ID) },	{ }						/* Terminating entry */};#endif#ifdef XIRCOMstatic __devinitdata struct usb_device_id id_table_fake_xircom [] = {        { USB_DEVICE(XIRCOM_VENDOR_ID, XIRCOM_FAKE_ID) },        { }                                             };static __devinitdata struct usb_device_id id_table_fake_entregra [] = {        { USB_DEVICE(ENTREGRA_VENDOR_ID, ENTREGRA_FAKE_ID) },        { }                                             };#endifstatic void keyspan_pda_wakeup_write( struct usb_serial_port *port ){	struct tty_struct *tty = port->tty;	/* wake up port processes */	wake_up_interruptible( &port->write_wait );	/* wake up line discipline */	if( (tty->flags & (1 << TTY_DO_WRITE_WAKEUP))	&& tty->ldisc.write_wakeup )		(tty->ldisc.write_wakeup)(tty);	/* wake up other tty processes */	wake_up_interruptible( &tty->write_wait );	/* For 2.2.16 backport -- wake_up_interruptible( &tty->poll_wait ); */	MOD_DEC_USE_COUNT;}static void keyspan_pda_request_unthrottle( struct usb_serial *serial ){	dbg(" request_unthrottle");	/* ask the device to tell us when the tx buffer becomes	   sufficiently empty */	usb_control_msg(serial->dev, 			     usb_sndctrlpipe(serial->dev, 0),			     7, /* request_unthrottle */			     USB_TYPE_VENDOR | USB_RECIP_INTERFACE			     | USB_DIR_OUT,			     16, /* value: threshold */			     0, /* index */			     NULL,			     0,			     2*HZ);	MOD_DEC_USE_COUNT;}static void keyspan_pda_rx_interrupt (struct urb *urb){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct usb_serial *serial;       	struct tty_struct *tty;	unsigned char *data = urb->transfer_buffer;	int i;	struct keyspan_pda_private *priv;	priv = (struct keyspan_pda_private *)(port->private);	/* the urb might have been killed. */	if (urb->status)		return;		if (port_paranoia_check (port, "keyspan_pda_rx_interrupt")) {		return;	}	serial = port->serial;	if (serial_paranoia_check (serial, "keyspan_pda_rx_interrupt")) {		return;	}	 	/* see if the message is data or a status interrupt */	switch (data[0]) {	case 0:		/* rest of message is rx data */		if (urb->actual_length) {			tty = serial->port[0].tty;			for (i = 1; i < urb->actual_length ; ++i) {				tty_insert_flip_char(tty, data[i], 0);			}			tty_flip_buffer_push(tty);		}		break;	case 1:		/* status interrupt */		dbg(" rx int, d1=%d, d2=%d", data[1], data[2]);		switch (data[1]) {		case 1: /* modemline change */			break;		case 2: /* tx unthrottle interrupt */			tty = serial->port[0].tty;			priv->tx_throttled = 0;			/* queue up a wakeup at scheduler time */			MOD_INC_USE_COUNT;			if (schedule_task(&priv->wakeup_task) == 0)				MOD_DEC_USE_COUNT;			break;		default:			break;		}		break;	default:		break;	}	/* INT urbs are automatically re-submitted */}static void keyspan_pda_rx_throttle (struct usb_serial_port *port){	/* stop receiving characters. We just turn off the URB request, and	   let chars pile up in the device. If we're doing hardware	   flowcontrol, the device will signal the other end when its buffer	   fills up. If we're doing XON/XOFF, this would be a good time to	   send an XOFF, although it might make sense to foist that off	   upon the device too. */	dbg("keyspan_pda_rx_throttle port %d", port->number);	usb_unlink_urb(port->interrupt_in_urb);}static void keyspan_pda_rx_unthrottle (struct usb_serial_port *port){	/* just restart the receive interrupt URB */	dbg("keyspan_pda_rx_unthrottle port %d", port->number);	port->interrupt_in_urb->dev = port->serial->dev;	if (usb_submit_urb(port->interrupt_in_urb))		dbg(" usb_submit_urb(read urb) failed");	return;}static int keyspan_pda_setbaud (struct usb_serial *serial, int baud){	int rc;	int bindex;	switch(baud) {		case 110: bindex = 0; break;		case 300: bindex = 1; break;		case 1200: bindex = 2; break;		case 2400: bindex = 3; break;		case 4800: bindex = 4; break;		case 9600: bindex = 5; break;		case 19200: bindex = 6; break;		case 38400: bindex = 7; break;		case 57600: bindex = 8; break;		case 115200: bindex = 9; break;		default: return -EINVAL;	}	/* rather than figure out how to sleep while waiting for this	   to complete, I just use the "legacy" API. */	rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),			     0, /* set baud */			     USB_TYPE_VENDOR 			     | USB_RECIP_INTERFACE			     | USB_DIR_OUT, /* type */			     bindex, /* value */			     0, /* index */			     NULL, /* &data */			     0, /* size */			     2*HZ); /* timeout */	return(rc);}static void keyspan_pda_break_ctl (struct usb_serial_port *port, int break_state){	struct usb_serial *serial = port->serial;	int value;	if (break_state == -1)		value = 1; /* start break */	else		value = 0; /* clear break */	usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),			4, /* set break */			USB_TYPE_VENDOR | USB_RECIP_INTERFACE | USB_DIR_OUT,			value, 0, NULL, 0, 2*HZ);	/* there is something funky about this.. the TCSBRK that 'cu' performs	   ought to translate into a break_ctl(-1),break_ctl(0) pair HZ/4	   seconds apart, but it feels like the break sent isn't as long as it	   is on /dev/ttyS0 */}static void keyspan_pda_set_termios (struct usb_serial_port *port, 				     struct termios *old_termios){	struct usb_serial *serial = port->serial;	unsigned int cflag = port->tty->termios->c_cflag;	/* cflag specifies lots of stuff: number of stop bits, parity, number	   of data bits, baud. What can the device actually handle?:	   CSTOPB (1 stop bit or 2)	   PARENB (parity)	   CSIZE (5bit .. 8bit)	   There is minimal hw support for parity (a PSW bit seems to hold the	   parity of whatever is in the accumulator). The UART either deals	   with 10 bits (start, 8 data, stop) or 11 bits (start, 8 data,	   1 special, stop). So, with firmware changes, we could do:	   8N1: 10 bit	   8N2: 11 bit, extra bit always (mark?)	   8[EOMS]1: 11 bit, extra bit is parity	   7[EOMS]1: 10 bit, b0/b7 is parity	   7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)	   HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS	   bit.	   For now, just do baud. */	switch (cflag & CBAUD) {		/* we could support more values here, just need to calculate		   the necessary divisors in the firmware. <asm/termbits.h>		   has the Bnnn constants. */		case B110: keyspan_pda_setbaud(serial, 110); break;		case B300: keyspan_pda_setbaud(serial, 300); break;		case B1200: keyspan_pda_setbaud(serial, 1200); break;		case B2400: keyspan_pda_setbaud(serial, 2400); break;		case B4800: keyspan_pda_setbaud(serial, 4800); break;		case B9600: keyspan_pda_setbaud(serial, 9600); break;		case B19200: keyspan_pda_setbaud(serial, 19200); break;		case B38400: keyspan_pda_setbaud(serial, 38400); break;		case B57600: keyspan_pda_setbaud(serial, 57600); break;		case B115200: keyspan_pda_setbaud(serial, 115200); break;		default: dbg("can't handle requested baud rate"); break;	}}/* modem control pins: DTR and RTS are outputs and can be controlled.   DCD, RI, DSR, CTS are inputs and can be read. All outputs can also be   read. The byte passed is: DTR(b7) DCD RI DSR CTS RTS(b2) unused unused */static int keyspan_pda_get_modem_info(struct usb_serial *serial,				      unsigned char *value){	int rc;	unsigned char data;	rc = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),			     3, /* get pins */			     USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_IN,			     0, 0, &data, 1, 2*HZ);	if (rc > 0)		*value = data;	return rc;}static int keyspan_pda_set_modem_info(struct usb_serial *serial,				      unsigned char value){	int rc;	rc = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0),			     3, /* set pins */			     USB_TYPE_VENDOR|USB_RECIP_INTERFACE|USB_DIR_OUT,			     value, 0, NULL, 0, 2*HZ);	return rc;}static int keyspan_pda_ioctl(struct usb_serial_port *port, struct file *file,			     unsigned int cmd, unsigned long arg){	struct usb_serial *serial = port->serial;	int rc;	unsigned int value;	unsigned char status, mask;	switch (cmd) {	case TIOCMGET: /* get modem pins state */		rc = keyspan_pda_get_modem_info(serial, &status);		if (rc < 0)			return rc;		value =			((status & (1<<7)) ? TIOCM_DTR : 0) |			((status & (1<<6)) ? TIOCM_CAR : 0) |			((status & (1<<5)) ? TIOCM_RNG : 0) |			((status & (1<<4)) ? TIOCM_DSR : 0) |			((status & (1<<3)) ? TIOCM_CTS : 0) |			((status & (1<<2)) ? TIOCM_RTS : 0);		if (copy_to_user((unsigned int *)arg, &value, sizeof(int)))			return -EFAULT;		return 0;	case TIOCMSET: /* set a state as returned by MGET */		if (copy_from_user(&value, (unsigned int *)arg, sizeof(int)))			return -EFAULT;		status =			((value & TIOCM_DTR) ? (1<<7) : 0) |			((value & TIOCM_CAR) ? (1<<6) : 0) |			((value & TIOCM_RNG) ? (1<<5) : 0) |			((value & TIOCM_DSR) ? (1<<4) : 0) |			((value & TIOCM_CTS) ? (1<<3) : 0) |			((value & TIOCM_RTS) ? (1<<2) : 0);		rc = keyspan_pda_set_modem_info(serial, status);		if (rc < 0)			return rc;		return 0;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产麻豆| 国产专区欧美精品| 在线观看一区二区视频| 中文字幕一区二区三区视频| 国产精品77777| 国产精品久久免费看| www.66久久| 一区二区三区毛片| 欧美一级艳片视频免费观看| 麻豆91精品视频| 国产欧美一区二区精品性色 | 懂色av中文一区二区三区| 久久综合成人精品亚洲另类欧美| 国产一区二区三区黄视频| 国产精品久久久久久久久搜平片| 91小视频在线观看| 日日夜夜免费精品视频| 久久亚洲综合色一区二区三区| 成人精品国产免费网站| 一区二区三区中文免费| 日韩一区二区电影在线| av资源站一区| 午夜av一区二区| 中文久久乱码一区二区| 在线观看视频91| 国产在线视视频有精品| 亚洲三级在线免费观看| 欧美一级夜夜爽| 91丝袜国产在线播放| 老司机精品视频线观看86| 国产精品久久久久影视| 欧美久久久影院| 福利电影一区二区| 日韩精品欧美成人高清一区二区| 国产网红主播福利一区二区| 91久久精品一区二区| 国内精品免费**视频| 亚洲另类色综合网站| 欧美不卡一区二区三区四区| 99精品在线观看视频| 蜜臂av日日欢夜夜爽一区| 亚洲欧洲日韩av| 欧美成人精品二区三区99精品| 91在线视频免费观看| 九九精品一区二区| 亚洲一区二区三区视频在线 | 欧美一级搡bbbb搡bbbb| 成人av在线看| 韩国三级电影一区二区| 午夜精品久久久久久久| 成人欧美一区二区三区黑人麻豆| 日韩欧美另类在线| 欧美在线播放高清精品| 成人精品小蝌蚪| 黄一区二区三区| 天天综合色天天综合| 亚洲欧美激情视频在线观看一区二区三区| 欧美大尺度电影在线| 欧美日韩国产高清一区二区| 成人h版在线观看| 国产自产高清不卡| 久久国产人妖系列| 香港成人在线视频| 一区二区成人在线观看| 亚洲视频每日更新| 国产精品乱人伦一区二区| 久久综合国产精品| 久久婷婷综合激情| 久久香蕉国产线看观看99| 日韩一区二区中文字幕| 6080午夜不卡| 制服丝袜成人动漫| 欧美欧美欧美欧美| 欧美猛男男办公室激情| 欧美在线视频日韩| 欧美午夜理伦三级在线观看| 91黄色免费网站| 精品视频一区三区九区| 在线观看亚洲a| 欧美日韩国产综合一区二区三区| 在线免费av一区| 欧美综合欧美视频| 欧美精品三级日韩久久| 在线播放日韩导航| 日韩久久精品一区| 久久久av毛片精品| 日本一区二区三区久久久久久久久不 | 色综合激情五月| 一本色道综合亚洲| 欧美性猛交xxxxxxxx| 欧美三级中文字幕| 91精品国产综合久久福利软件| 91超碰这里只有精品国产| 欧美一区二区大片| 国产喂奶挤奶一区二区三区| 欧美激情中文字幕| 樱桃国产成人精品视频| 五月天中文字幕一区二区| 奇米影视7777精品一区二区| 精品伊人久久久久7777人| 国产精品夜夜嗨| 97精品久久久午夜一区二区三区 | 蜜桃久久久久久久| 成人黄色小视频| 99在线精品视频| 欧美三级韩国三级日本三斤| 91精品国产高清一区二区三区| 欧美精品一区二区三区一线天视频 | 风间由美性色一区二区三区| 99精品国产99久久久久久白柏| 欧美一a一片一级一片| 日韩欧美你懂的| 中文字幕五月欧美| 日韩国产一区二| 国产传媒日韩欧美成人| 色婷婷久久一区二区三区麻豆| 91精品蜜臀在线一区尤物| 国产午夜精品久久久久久免费视| 亚洲美女免费视频| 久久国产剧场电影| 一本色道亚洲精品aⅴ| 日韩欧美亚洲一区二区| 亚洲三级在线观看| 国产做a爰片久久毛片| 91久久久免费一区二区| 久久综合久久99| 亚洲一区二区av电影| 国产一区二区不卡老阿姨| 欧美日韩情趣电影| 国产精品乱码人人做人人爱| 日韩福利视频导航| 91丨九色porny丨蝌蚪| 精品福利一二区| 丝袜美腿亚洲一区二区图片| 成人美女在线视频| 精品免费99久久| 性做久久久久久| 99久久综合狠狠综合久久| 日韩午夜av电影| 亚洲一区在线观看网站| 成人免费av资源| 久久久久成人黄色影片| 日韩高清国产一区在线| 在线精品视频免费播放| 日韩一区中文字幕| 国产成人av福利| 日韩欧美国产精品一区| 日一区二区三区| 欧美日韩一区二区三区在线| 国产精品久久久久久久久晋中| 久久超碰97中文字幕| 欧美日韩一区二区欧美激情| 一区精品在线播放| 成人av中文字幕| 欧美高清在线视频| 国产99久久久久| 国产色一区二区| 国产高清在线精品| 精品福利在线导航| 国产一区二区三区四| 欧美不卡一区二区三区四区| 日韩激情一二三区| 欧美性大战久久久久久久 | 久久五月婷婷丁香社区| 久久国产人妖系列| 欧美大胆一级视频| 久久97超碰色| 日韩美女一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ流畅| 91精品国产综合久久久久久久久久| 一区二区三区四区在线| 91麻豆免费观看| 亚洲美女视频一区| 欧美在线小视频| 天堂影院一区二区| 欧美一区二区三区四区高清| 日韩高清国产一区在线| 欧美电影免费观看高清完整版在线观看| 日本不卡视频在线观看| 日韩欧美国产一二三区| 国产在线视视频有精品| 国产精品视频线看| 色综合天天综合色综合av| 亚洲伦在线观看| 欧美日韩亚洲综合一区| 丝袜诱惑亚洲看片| 精品欧美黑人一区二区三区| 国精产品一区一区三区mba桃花| 国产亚洲综合色| 99久久国产综合精品女不卡| 亚洲激情av在线| 欧美精品aⅴ在线视频| 激情久久久久久久久久久久久久久久| 久久网站热最新地址| 不卡一二三区首页| 亚洲va国产va欧美va观看| 91精品国产91久久久久久一区二区| 经典三级在线一区| 日韩一区中文字幕| 91精品国产欧美日韩|