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

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

?? hso.c

?? linux系統下3G模塊USB串口驅動程序源代碼最新版本
?? C
?? 第 1 頁 / 共 5 頁
字號:
static int hso_serial_tiocmget(struct tty_struct *tty, struct file *file){	int retval;	struct hso_serial *serial = get_serial_by_tty(tty);	struct hso_tiocmget  *tiocmget;	u16 UART_state_bitmap;	/* sanity check */	if (!serial) {		D1("no tty structures");		return -EINVAL;	}	spin_lock_irq(&serial->serial_lock);	retval = ((serial->rts_state) ? TIOCM_RTS : 0) |	    ((serial->dtr_state) ? TIOCM_DTR : 0);	tiocmget = serial->tiocmget;	if (tiocmget) {		UART_state_bitmap = le16_to_cpu(			tiocmget->prev_UART_state_bitmap);		if (UART_state_bitmap & B_RING_SIGNAL)			retval |=  TIOCM_RNG;		if (UART_state_bitmap & B_RX_CARRIER)			retval |=  TIOCM_CD;		if (UART_state_bitmap & B_TX_CARRIER)			retval |=  TIOCM_DSR;	}	spin_unlock_irq(&serial->serial_lock);	return retval;}static int hso_serial_tiocmset(struct tty_struct *tty, struct file *file,			       unsigned int set, unsigned int clear){	int val = 0;	unsigned long flags;	int if_num;	struct hso_serial *serial = get_serial_by_tty(tty);	/* sanity check */	if (!serial) {		D1("no tty structures");		return -EINVAL;	}	if_num = serial->parent->interface->altsetting->desc.bInterfaceNumber;	spin_lock_irqsave(&serial->serial_lock, flags);	if (set & TIOCM_RTS)		serial->rts_state = 1;	if (set & TIOCM_DTR)		serial->dtr_state = 1;	if (clear & TIOCM_RTS)		serial->rts_state = 0;	if (clear & TIOCM_DTR)		serial->dtr_state = 0;	if (serial->dtr_state)		val |= 0x01;	if (serial->rts_state)		val |= 0x02;	spin_unlock_irqrestore(&serial->serial_lock, flags);	return usb_control_msg(serial->parent->usb,			       usb_rcvctrlpipe(serial->parent->usb, 0), 0x22,			       0x21, val, if_num, NULL, 0,			       USB_CTRL_SET_TIMEOUT);}/*============================================================================= *	function:	hso_set_radio *	purpose:	Toggles radioon or off ( used by ioctl ) *============================================================================= */#if (!HAVE_RFKILL)static int hso_set_radio(struct hso_device *hso_dev, int enabled){	if (!hso_dev)		return -ENODEV;	return usb_control_msg(	hso_dev->usb,				usb_rcvctrlpipe(hso_dev->usb, 0),				enabled ? 0x82 : 0x81,				0x40, 0, 0, NULL, 0,				USB_CTRL_SET_TIMEOUT);}#endifstatic int hso_serial_ioctl(struct tty_struct *tty, struct file *file,			    unsigned int cmd, unsigned long arg){	struct hso_serial *serial =  get_serial_by_tty(tty);	void __user *uarg = (void __user *)arg;	int ret = 0;	D4("IOCTL cmd: %d, arg: %ld", cmd, arg);	if (!serial)		return -ENODEV;	switch (cmd) {#if (!HAVE_RFKILL)	case SIOCSETRADIO:		if (arg)			hso_set_radio(serial->parent, 1);		else			hso_set_radio(serial->parent, 0);		ret = 0;		break;#endif	case TIOCMIWAIT:		ret = hso_wait_modem_status(serial, arg);		break;	case TIOCGICOUNT:		ret = hso_get_count(serial, uarg);		break;	default:		ret = -ENOIOCTLCMD;		break;	}	return ret;}/* starts a transmit */static void hso_kick_transmit(struct hso_serial *serial){	u8 *temp;	unsigned long flags;	int res;	spin_lock_irqsave(&serial->serial_lock, flags);	if (!serial->tx_buffer_count)		goto out;	if (serial->tx_urb_used)		goto out;#ifdef CONFIG_HSO_AUTOPM	/* Wakeup USB interface if necessary */	if (hso_get_activity(serial->parent) == -EAGAIN)		goto out;#endif	/* Switch pointers around to avoid memcpy */	temp = serial->tx_buffer;	serial->tx_buffer = serial->tx_data;	serial->tx_data = temp;	serial->tx_data_count = serial->tx_buffer_count;	serial->tx_buffer_count = 0;	/* If temp is set, it means we switched buffers */	if (temp && serial->write_data) {		res = serial->write_data(serial);		if (res >= 0)			serial->tx_urb_used = 1;	}out:	spin_unlock_irqrestore(&serial->serial_lock, flags);}/* make a request (for reading and writing data to muxed serial port) */static int mux_device_request(struct hso_serial *serial, u8 type, u16 port,			      struct urb *ctrl_urb,			      struct usb_ctrlrequest *ctrl_req,			      u8 *ctrl_urb_data, u32 size){	int result;	int pipe;	/* Sanity check */	if (!serial || !ctrl_urb || !ctrl_req) {		printk(KERN_ERR "%s: Wrong arguments\n", __func__);		return -EINVAL;	}	/* initialize */	ctrl_req->wValue = 0;	ctrl_req->wIndex = cpu_to_le16(hso_port_to_mux(port));	ctrl_req->wLength = cpu_to_le16(size);	if (type == USB_CDC_GET_ENCAPSULATED_RESPONSE) {		/* Reading command */		ctrl_req->bRequestType = USB_DIR_IN |					 USB_TYPE_OPTION_VENDOR |					 USB_RECIP_INTERFACE;		ctrl_req->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE;		pipe = usb_rcvctrlpipe(serial->parent->usb, 0);	} else {		/* Writing command */		ctrl_req->bRequestType = USB_DIR_OUT |					 USB_TYPE_OPTION_VENDOR |					 USB_RECIP_INTERFACE;		ctrl_req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND;		pipe = usb_sndctrlpipe(serial->parent->usb, 0);	}	/* syslog */	D2("%s command (%02x) len: %d, port: %d",	   type == USB_CDC_GET_ENCAPSULATED_RESPONSE ? "Read" : "Write",	   ctrl_req->bRequestType, ctrl_req->wLength, port);	/* Load ctrl urb */	ctrl_urb->transfer_flags = 0;	usb_fill_control_urb(ctrl_urb,			     serial->parent->usb,			     pipe,			     (u8 *) ctrl_req,			     ctrl_urb_data, size, ctrl_callback, serial);	/* Send it on merry way */	result = usb_submit_urb(ctrl_urb, GFP_ATOMIC);	if (result) {		dev_err(&ctrl_urb->dev->dev,			"%s failed submit ctrl_urb %d type %d\n", __func__,			result, type);		return result;	}	/* done */	return size;}/* called by intr_callback when read occurs */static int hso_mux_serial_read(struct hso_serial *serial){	if (!serial)		return -EINVAL;	/* clean data */	memset(serial->rx_data[0], 0, CTRL_URB_RX_SIZE);	/* make the request */	if (serial->num_rx_urbs != 1) {		dev_err(&serial->parent->interface->dev,			"ERROR: mux'd reads with multiple buffers "			"not possible\n");		return 0;	}	return mux_device_request(serial,				  USB_CDC_GET_ENCAPSULATED_RESPONSE,				  serial->parent->port_spec & HSO_PORT_MASK,				  serial->rx_urb[0],				  &serial->ctrl_req_rx,				  serial->rx_data[0], serial->rx_data_length);}/* used for muxed serial port callback (muxed serial read) */static void intr_callback(CALLBACK_ARGS){	struct hso_shared_int *shared_int = urb->context;	struct hso_serial *serial;	unsigned char *port_req;	int status = urb->status;	int i;#ifdef HSO_CONFIG_AUTOPM	usb_mark_last_busy(urb->dev);#endif	/* sanity check */	if (!shared_int)		return;	/* status check */	if (status) {		log_usb_status(status, __func__);		return;	}	D4("\n--- Got intr callback 0x%02X ---", status);	/* what request? */	port_req = urb->transfer_buffer;	D4(" port_req = 0x%.2X\n", *port_req);	/* loop over all muxed ports to find the one sending this */	for (i = 0; i < 8; i++) {		/* max 8 channels on MUX */		if (*port_req & (1 << i)) {			serial = get_serial_by_shared_int_and_type(shared_int,								   (1 << i));			if (serial != NULL) {				D1("Pending read interrupt on port %d\n", i);				spin_lock(&serial->serial_lock);				if (serial->rx_state == RX_IDLE) {					/* Setup and send a ctrl req read on					 * port i */					if (!serial->rx_urb_filled[0]) {						serial->rx_state = RX_SENT;						hso_mux_serial_read(serial);					} else						serial->rx_state = RX_PENDING;				} else {					D1("Already pending a read on "					   "port %d\n", i);				}				spin_unlock(&serial->serial_lock);			}		}	}	/* Resubmit interrupt urb */	hso_mux_submit_intr_urb(shared_int, urb->dev, GFP_ATOMIC);}/* called for writing to muxed serial port */static int hso_mux_serial_write_data(struct hso_serial *serial){	if (NULL == serial)		return -EINVAL;	return mux_device_request(serial,				  USB_CDC_SEND_ENCAPSULATED_COMMAND,				  serial->parent->port_spec & HSO_PORT_MASK,				  serial->tx_urb,				  &serial->ctrl_req_tx,				  serial->tx_data, serial->tx_data_count);}/* write callback for Diag and CS port */static void hso_std_serial_write_bulk_callback(CALLBACK_ARGS){	struct hso_serial *serial = urb->context;	int status = urb->status;	/* sanity check */	if (!serial) {		D1("serial == NULL");		return;	}	spin_lock(&serial->serial_lock);	serial->tx_urb_used = 0;	spin_unlock(&serial->serial_lock);	if (status) {		log_usb_status(status, __func__);		return;	}#ifdef CONFIG_HSO_AUTOPM	hso_put_activity(serial->parent);#endif	if (serial->tty)		tty_wakeup(serial->tty);	hso_kick_transmit(serial);	D1(" ");	return;}/* called for writing diag or CS serial port */static int hso_std_serial_write_data(struct hso_serial *serial){	int count = serial->tx_data_count;	int result;	usb_fill_bulk_urb(serial->tx_urb,			  serial->parent->usb,			  usb_sndbulkpipe(serial->parent->usb,					  serial->out_endp->					  bEndpointAddress & 0x7F),			  serial->tx_data, serial->tx_data_count,			  hso_std_serial_write_bulk_callback, serial);	result = usb_submit_urb(serial->tx_urb, GFP_ATOMIC);	if (result) {		dev_warn(&serial->parent->usb->dev,			 "Failed to submit urb - res %d\n", result);		return result;	}	return count;}/* callback after read or write on muxed serial port */static void ctrl_callback(CALLBACK_ARGS){	struct hso_serial *serial = urb->context;	struct usb_ctrlrequest *req;	int status = urb->status;	/* sanity check */	if (!serial)		return;	spin_lock(&serial->serial_lock);	serial->tx_urb_used = 0;	spin_unlock(&serial->serial_lock);	if (status) {		log_usb_status(status, __func__);		return;	}	/* what request? */	req = (struct usb_ctrlrequest *)(urb->setup_packet);	D4("\n--- Got muxed ctrl callback 0x%02X ---", status);	D4("Actual length of urb = %d\n", urb->actual_length);	DUMP1(urb->transfer_buffer, urb->actual_length);	if (req->bRequestType ==	    (USB_DIR_IN | USB_TYPE_OPTION_VENDOR | USB_RECIP_INTERFACE)) {		serial->rx_urb_filled[0] = 1;		spin_lock(&serial->serial_lock);		put_rxbuf_data_and_resubmit_ctrl_urb(serial);		spin_unlock(&serial->serial_lock);	} else {#ifdef CONFIG_HSO_AUTOPM		hso_put_activity(serial->parent);#endif		if (serial->tty)			tty_wakeup(serial->tty);		/* response to a write command */		hso_kick_transmit(serial);	}}/* handle RX data for serial port */static int put_rxbuf_data(struct urb *urb, struct hso_serial *serial){	struct tty_struct *tty = serial->tty;	int write_length_remaining = 0;#if (HAVE_TTY_INSERT_FLIP_STRING)	int curr_write_len;#else	int i;	unsigned char *data;#endif	/* Sanity check */	if (urb == NULL || serial == NULL) {		D1("serial = NULL");		return -2;	}	/* Push data to tty */	if (tty) {		write_length_remaining = urb->actual_length -			serial->curr_rx_urb_offset;		D1("data to push to tty");#if (HAVE_TTY_INSERT_FLIP_STRING)		while (write_length_remaining) {			if (test_bit(TTY_THROTTLED, &tty->flags))				return -1;			curr_write_len =  tty_insert_flip_string				(tty, urb->transfer_buffer +				 serial->curr_rx_urb_offset,				 write_length_remaining);			serial->curr_rx_urb_offset += curr_write_len;			write_length_remaining -= curr_write_len;			tty_flip_buffer_push(tty);		}#else		i = 0;		data = urb->transfer_buffer;		for (i = 0; i < write_length_remaining; ++i) {			if (test_bit(TTY_THROTTLED, &tty->flags))				return -1;			if (tty->flip.count >= TTY_FLIPBUF_SIZE)				tty_flip_buffer_push(tty);			tty_insert_flip_char(tty, *(char *)					     ((long)urb->transfer_buffer +					      (long)serial->curr_rx_urb_offset),					     0);			serial->curr_rx_urb_offset++;		}		tty_flip_buffer_push(tty);#endif	}	if (write_length_remaining == 0) {		serial->curr_rx_urb_offset = 0;		serial->rx_urb_filled[hso_urb_to_index(serial, urb)] = 0;	}	return write_length_remaining;}/* Base driver functions */static void hso_log_port(struct hso_device *hso_dev){	char *port_type;	char port_dev[20];	switch (hso_dev->port_spec & HSO_PORT_MASK) {	case HSO_PORT_CONTROL:	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线一区二区三区做爰视频网站| 精品日韩在线一区| 日韩欧美一级二级三级| 亚洲欧美在线另类| 久久激情综合网| 欧美在线小视频| 国产精品免费久久| 国产精品羞羞答答xxdd| 欧美一区二区三区在线看| 亚洲男人电影天堂| 国产91精品欧美| 2022国产精品视频| 麻豆久久一区二区| 欧美一区二区三区小说| 亚洲电影一区二区三区| av在线不卡电影| 亚洲国产经典视频| 国产精品69毛片高清亚洲| 日韩精品影音先锋| 日本91福利区| 91精品中文字幕一区二区三区| 一级精品视频在线观看宜春院 | 国产精品国产三级国产有无不卡| 日本午夜精品一区二区三区电影| 欧美性猛片aaaaaaa做受| **欧美大码日韩| 99这里都是精品| 国产精品白丝在线| 99视频在线精品| 亚洲人午夜精品天堂一二香蕉| 成人性生交大片| 成人免费在线观看入口| 成年人午夜久久久| 中文一区一区三区高中清不卡| 国产精品一区在线| 欧美国产亚洲另类动漫| 99麻豆久久久国产精品免费| 国产欧美日韩精品在线| 成人美女在线视频| 亚洲免费观看高清完整| 欧美日韩激情一区二区三区| 日韩激情一区二区| 久久精品欧美一区二区三区麻豆| 国产一区二区中文字幕| 国产精品国产a| 在线观看不卡一区| 日韩高清中文字幕一区| 久久影视一区二区| 不卡的电影网站| 午夜电影一区二区三区| 欧美不卡在线视频| 99天天综合性| 日韩高清在线一区| 国产亚洲女人久久久久毛片| 91丨九色丨蝌蚪丨老版| 亚洲午夜精品网| www成人在线观看| 一本色道久久综合亚洲91| 亚洲sss视频在线视频| 久久综合成人精品亚洲另类欧美| 成人精品一区二区三区四区| 亚洲成av人片| 欧美国产精品中文字幕| 欧美日韩国产在线观看| 国产一区二区三区在线观看免费| 日本一区二区免费在线观看视频 | 五月激情六月综合| 久久久国产午夜精品| 欧美最猛黑人xxxxx猛交| 日本不卡一区二区三区| 国产精品素人视频| 欧美精品自拍偷拍动漫精品| 国产精品自拍在线| 亚洲图片一区二区| 欧美国产日韩精品免费观看| 欧美日韩国产大片| 成人激情动漫在线观看| 欧美aa在线视频| 亚洲精品日日夜夜| 久久久久久久久岛国免费| 欧美性猛片aaaaaaa做受| 国产精品18久久久久久vr| 亚洲v精品v日韩v欧美v专区| 国产精品水嫩水嫩| 欧美tk—视频vk| 欧美日韩在线播放三区四区| 成人免费毛片aaaaa**| 精品在线播放免费| 日本网站在线观看一区二区三区| 国产精品久久久久久久久免费樱桃| 日韩欧美亚洲另类制服综合在线 | 亚洲码国产岛国毛片在线| 26uuu色噜噜精品一区| 在线成人免费视频| 欧美色网一区二区| 欧美性做爰猛烈叫床潮| 91在线播放网址| 成人午夜短视频| 国产精品一区二区无线| 久久99在线观看| 奇米777欧美一区二区| 日精品一区二区三区| 亚洲国产精品嫩草影院| 伊人一区二区三区| 中文字幕视频一区二区三区久| 国产午夜亚洲精品午夜鲁丝片| 精品国一区二区三区| 日韩丝袜美女视频| 欧美一区二区三区视频免费播放| 欧美日韩免费视频| 欧美剧在线免费观看网站 | 日韩不卡一区二区| 婷婷久久综合九色国产成人| 亚洲国产成人91porn| 亚洲不卡一区二区三区| 亚洲成人精品一区二区| 午夜精品123| 久久精品国产77777蜜臀| 激情综合色综合久久| 国产成人午夜精品影院观看视频| 国产精品一区在线| 成人理论电影网| 91看片淫黄大片一级| 在线观看日韩毛片| 欧美精品第1页| 久久综合五月天婷婷伊人| 精品国产一区二区亚洲人成毛片| 久久久九九九九| 国产精品成人一区二区三区夜夜夜| 国产精品福利一区| 亚洲成av人在线观看| 麻豆精品在线观看| 高清beeg欧美| 色哟哟欧美精品| 91精品国产色综合久久久蜜香臀| 欧美α欧美αv大片| 国产亚洲美州欧州综合国| 亚洲日本丝袜连裤袜办公室| 亚洲精品国产无套在线观| 日本不卡一区二区| 丰满岳乱妇一区二区三区| 欧美性受xxxx| 精品国产三级电影在线观看| 国产精品入口麻豆原神| 亚洲国产欧美日韩另类综合| 美女精品一区二区| 成人高清免费在线播放| 欧美色网一区二区| 国产偷国产偷精品高清尤物| 亚洲黄色av一区| 国产一区欧美一区| 欧美视频一区二区三区四区| 久久久精品欧美丰满| 亚洲成人av电影| 成人免费看片app下载| 欧美一区二区视频在线观看| 国产精品午夜电影| 毛片一区二区三区| 色诱视频网站一区| 久久综合精品国产一区二区三区| 亚洲欧美另类小说| 国内成+人亚洲+欧美+综合在线| 日本电影欧美片| 久久精品一区二区| 蜜桃视频在线观看一区| 91麻豆精东视频| 国产亚洲精品久| 男男视频亚洲欧美| 欧美色图激情小说| 日韩一区欧美一区| 国产福利一区二区三区视频| 欧美一区二区三区的| 亚洲乱码中文字幕| 东方欧美亚洲色图在线| 欧美v亚洲v综合ⅴ国产v| 午夜天堂影视香蕉久久| 色婷婷综合久久久| 国产精品久久久久久久久动漫| 久久精品999| 日韩三级视频中文字幕| 亚洲国产欧美日韩另类综合| 91浏览器入口在线观看| 国产精品无遮挡| 国产成人在线看| 国产亚洲人成网站| 国产一区二区三区黄视频| 精品理论电影在线观看| 日本不卡123| 日韩一区二区三区视频| 亚洲mv在线观看| 欧美蜜桃一区二区三区| 图片区小说区区亚洲影院| 欧美午夜精品一区二区蜜桃| 亚洲综合精品久久| 欧美网站大全在线观看| 亚洲国产成人高清精品| 欧美性高清videossexo| 亚洲成人动漫精品| 欧美一区二区三区啪啪| 免费人成在线不卡|