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

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

?? cyberjack.c

?? 優(yōu)龍2410linux2.6.8內(nèi)核源代碼
?? C
字號:
/* *  REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver * *  Copyright (C) 2001  REINER SCT *  Author: Matthias Bruestle * *  Contact: linux-usb@sii.li (see MAINTAINERS) * *  This program is largely derived from work by the linux-usb group *  and associated source files.  Please see the usb/serial files for *  individual credits and copyrights. * *  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. * *  Thanks to Greg Kroah-Hartman (greg@kroah.com) for his help and *  patience. * *  In case of problems, please write to the contact e-mail address *  mentioned above. */#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/spinlock.h>#include <asm/uaccess.h>#include <linux/usb.h>#include "usb-serial.h"#define CYBERJACK_LOCAL_BUF_SIZE 32static int debug;/* * Version Information */#define DRIVER_VERSION "v1.0"#define DRIVER_AUTHOR "Matthias Bruestle"#define DRIVER_DESC "REINER SCT cyberJack pinpad/e-com USB Chipcard Reader Driver"#define CYBERJACK_VENDOR_ID	0x0C4B#define CYBERJACK_PRODUCT_ID	0x0100/* Function prototypes */static int cyberjack_startup (struct usb_serial *serial);static void cyberjack_shutdown (struct usb_serial *serial);static int  cyberjack_open (struct usb_serial_port *port, struct file *filp);static void cyberjack_close (struct usb_serial_port *port, struct file *filp);static int cyberjack_write (struct usb_serial_port *port, int from_user,	const unsigned char *buf, int count);static int cyberjack_write_room( struct usb_serial_port *port );static void cyberjack_read_int_callback (struct urb *urb, struct pt_regs *regs);static void cyberjack_read_bulk_callback (struct urb *urb, struct pt_regs *regs);static void cyberjack_write_bulk_callback (struct urb *urb, struct pt_regs *regs);static struct usb_device_id id_table [] = {	{ USB_DEVICE(CYBERJACK_VENDOR_ID, CYBERJACK_PRODUCT_ID) },	{ }			/* Terminating entry */};MODULE_DEVICE_TABLE (usb, id_table);static struct usb_driver cyberjack_driver = {	.owner =	THIS_MODULE,	.name =		"cyberjack",	.probe =	usb_serial_probe,	.disconnect =	usb_serial_disconnect,	.id_table =	id_table,};static struct usb_serial_device_type cyberjack_device = {	.owner =		THIS_MODULE,	.name =			"Reiner SCT Cyberjack USB card reader",	.short_name =		"cyberjack",	.id_table =		id_table,	.num_interrupt_in =	1,	.num_bulk_in =		1,	.num_bulk_out =		1,	.num_ports =		1,	.attach =		cyberjack_startup,	.shutdown =		cyberjack_shutdown,	.open =			cyberjack_open,	.close =		cyberjack_close,	.write =		cyberjack_write,	.write_room =	cyberjack_write_room,	.read_int_callback =	cyberjack_read_int_callback,	.read_bulk_callback =	cyberjack_read_bulk_callback,	.write_bulk_callback =	cyberjack_write_bulk_callback,};struct cyberjack_private {	spinlock_t	lock;		/* Lock for SMP */	short		rdtodo;		/* Bytes still to read */	unsigned char	wrbuf[5*64];	/* Buffer for collecting data to write */	short		wrfilled;	/* Overall data size we already got */	short		wrsent;		/* Data already sent */};/* do some startup allocations not currently performed by usb_serial_probe() */static int cyberjack_startup (struct usb_serial *serial){	struct cyberjack_private *priv;	dbg("%s", __FUNCTION__);	/* allocate the private data structure */	priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL);	if (!priv)		return -ENOMEM;	/* set initial values */	spin_lock_init(&priv->lock);	priv->rdtodo = 0;	priv->wrfilled = 0;	priv->wrsent = 0;	usb_set_serial_port_data(serial->port[0], priv);	init_waitqueue_head(&serial->port[0]->write_wait);	return( 0 );}static void cyberjack_shutdown (struct usb_serial *serial){	int i;		dbg("%s", __FUNCTION__);	for (i=0; i < serial->num_ports; ++i) {		/* My special items, the standard routines free my urbs */		kfree(usb_get_serial_port_data(serial->port[i]));		usb_set_serial_port_data(serial->port[i], NULL);	}}	static int  cyberjack_open (struct usb_serial_port *port, struct file *filp){	struct cyberjack_private *priv;	unsigned long flags;	int result = 0;	dbg("%s - port %d", __FUNCTION__, port->number);	dbg("%s - usb_clear_halt", __FUNCTION__ );	usb_clear_halt(port->serial->dev, port->write_urb->pipe);	/* force low_latency on so that our tty_push actually forces	 * the data through, otherwise it is scheduled, and with high	 * data rates (like with OHCI) data can get lost.	 */	port->tty->low_latency = 1;	priv = usb_get_serial_port_data(port);	spin_lock_irqsave(&priv->lock, flags);	priv->rdtodo = 0;	priv->wrfilled = 0;	priv->wrsent = 0;	spin_unlock_irqrestore(&priv->lock, flags);	/* shutdown any bulk reads that might be going on */	usb_unlink_urb (port->write_urb);	usb_unlink_urb (port->read_urb);	usb_unlink_urb (port->interrupt_in_urb);	port->interrupt_in_urb->dev = port->serial->dev;	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);	if (result)		err(" usb_submit_urb(read int) failed");	dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);	return result;}static void cyberjack_close (struct usb_serial_port *port, struct file *filp){	dbg("%s - port %d", __FUNCTION__, port->number);	if (port->serial->dev) {		/* shutdown any bulk reads that might be going on */		usb_unlink_urb (port->write_urb);		usb_unlink_urb (port->read_urb);		usb_unlink_urb (port->interrupt_in_urb);		dbg("%s - usb_clear_halt", __FUNCTION__ );		usb_clear_halt(port->serial->dev, port->write_urb->pipe);		usb_clear_halt(port->serial->dev, port->read_urb->pipe);		usb_clear_halt(port->serial->dev, port->interrupt_in_urb->pipe);	}}static int cyberjack_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count){	struct usb_serial *serial = port->serial;	struct cyberjack_private *priv = usb_get_serial_port_data(port);	unsigned long flags;	int result;	int wrexpected;	dbg("%s - port %d", __FUNCTION__, port->number);	dbg("%s - from_user %d", __FUNCTION__, from_user);	if (count == 0) {		dbg("%s - write request of 0 bytes", __FUNCTION__);		return (0);	}	if (port->write_urb->status == -EINPROGRESS) {		dbg("%s - already writing", __FUNCTION__);		return (0);	}	spin_lock_irqsave(&priv->lock, flags);	if( (count+priv->wrfilled)>sizeof(priv->wrbuf) ) {		/* To much data for buffer. Reset buffer. */		priv->wrfilled=0;		spin_unlock_irqrestore(&priv->lock, flags);		return (0);	}	/* Copy data */	if (from_user) {		if (copy_from_user(priv->wrbuf+priv->wrfilled, buf, count)) {			spin_unlock_irqrestore(&priv->lock, flags);			return -EFAULT;		}	} else {		memcpy (priv->wrbuf+priv->wrfilled, buf, count);	}  	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count,		priv->wrbuf+priv->wrfilled);	priv->wrfilled += count;	if( priv->wrfilled >= 3 ) {		wrexpected = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;		dbg("%s - expected data: %d", __FUNCTION__, wrexpected);	} else {		wrexpected = sizeof(priv->wrbuf);	}	if( priv->wrfilled >= wrexpected ) {		/* We have enough data to begin transmission */		int length;		dbg("%s - transmitting data (frame 1)", __FUNCTION__);		length = (wrexpected > port->bulk_out_size) ? port->bulk_out_size : wrexpected;		memcpy (port->write_urb->transfer_buffer, priv->wrbuf, length );		priv->wrsent=length;		/* set up our urb */		usb_fill_bulk_urb(port->write_urb, serial->dev, 			      usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),			      port->write_urb->transfer_buffer, length,			      ((serial->type->write_bulk_callback) ? 			       serial->type->write_bulk_callback : 			       cyberjack_write_bulk_callback), 			      port);		/* send the data out the bulk port */		result = usb_submit_urb(port->write_urb, GFP_ATOMIC);		if (result) {			err("%s - failed submitting write urb, error %d", __FUNCTION__, result);			/* Throw away data. No better idea what to do with it. */			priv->wrfilled=0;			priv->wrsent=0;			spin_unlock_irqrestore(&priv->lock, flags);			return 0;		}		dbg("%s - priv->wrsent=%d", __FUNCTION__,priv->wrsent);		dbg("%s - priv->wrfilled=%d", __FUNCTION__,priv->wrfilled);		if( priv->wrsent>=priv->wrfilled ) {			dbg("%s - buffer cleaned", __FUNCTION__);			memset( priv->wrbuf, 0, sizeof(priv->wrbuf) );			priv->wrfilled=0;			priv->wrsent=0;		}	}	spin_unlock_irqrestore(&priv->lock, flags);	return (count);} static int cyberjack_write_room( struct usb_serial_port *port ){	return CYBERJACK_LOCAL_BUF_SIZE;}static void cyberjack_read_int_callback( struct urb *urb, struct pt_regs *regs ){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct cyberjack_private *priv = usb_get_serial_port_data(port);	unsigned char *data = urb->transfer_buffer;	int result;	dbg("%s - port %d", __FUNCTION__, port->number);	/* the urb might have been killed. */	if (urb->status)		return;	usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);	/* React only to interrupts signaling a bulk_in transfer */	if( (urb->actual_length==4) && (data[0]==0x01) ) {		short old_rdtodo;		int result;		/* This is a announcement of coming bulk_ins. */		unsigned short size = ((unsigned short)data[3]<<8)+data[2]+3;		spin_lock(&priv->lock);		old_rdtodo = priv->rdtodo;		if( (old_rdtodo+size)<(old_rdtodo) ) {			dbg( "To many bulk_in urbs to do." );			spin_unlock(&priv->lock);			goto resubmit;		}		/* "+=" is probably more fault tollerant than "=" */		priv->rdtodo += size;		dbg("%s - rdtodo: %d", __FUNCTION__, priv->rdtodo);		spin_unlock(&priv->lock);		if( !old_rdtodo ) {			port->read_urb->dev = port->serial->dev;			result = usb_submit_urb(port->read_urb, GFP_ATOMIC);			if( result )				err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);			dbg("%s - usb_submit_urb(read urb)", __FUNCTION__);		}	}resubmit:	port->interrupt_in_urb->dev = port->serial->dev;	result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);	if (result)		err(" usb_submit_urb(read int) failed");	dbg("%s - usb_submit_urb(int urb)", __FUNCTION__);}static void cyberjack_read_bulk_callback (struct urb *urb, struct pt_regs *regs){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct cyberjack_private *priv = usb_get_serial_port_data(port);	struct tty_struct *tty;	unsigned char *data = urb->transfer_buffer;	short todo;	int i;	int result;	dbg("%s - port %d", __FUNCTION__, port->number);		usb_serial_debug_data(debug, &port->dev, __FUNCTION__, urb->actual_length, data);	if (urb->status) {		dbg("%s - nonzero read bulk status received: %d", __FUNCTION__, urb->status);		return;	}	tty = port->tty;	if (urb->actual_length) {		for (i = 0; i < urb->actual_length ; ++i) {			/* if we insert more than TTY_FLIPBUF_SIZE characters, we drop them. */			if(tty->flip.count >= TTY_FLIPBUF_SIZE) {				tty_flip_buffer_push(tty);			}			/* this doesn't actually push the data through unless tty->low_latency is set */			tty_insert_flip_char(tty, data[i], 0);		}	  	tty_flip_buffer_push(tty);	}	spin_lock(&priv->lock);	/* Reduce urbs to do by one. */	priv->rdtodo-=urb->actual_length;	/* Just to be sure */	if ( priv->rdtodo<0 ) priv->rdtodo = 0;	todo = priv->rdtodo;	spin_unlock(&priv->lock);	dbg("%s - rdtodo: %d", __FUNCTION__, todo);	/* Continue to read if we have still urbs to do. */	if( todo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) {		port->read_urb->dev = port->serial->dev;		result = usb_submit_urb(port->read_urb, GFP_ATOMIC);		if (result)			err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);		dbg("%s - usb_submit_urb(read urb)", __FUNCTION__);	}}static void cyberjack_write_bulk_callback (struct urb *urb, struct pt_regs *regs){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct cyberjack_private *priv = usb_get_serial_port_data(port);	dbg("%s - port %d", __FUNCTION__, port->number);		if (urb->status) {		dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);		return;	}	spin_lock(&priv->lock);	/* only do something if we have more data to send */	if( priv->wrfilled ) {		int length, blksize, result;		if (port->write_urb->status == -EINPROGRESS) {			dbg("%s - already writing", __FUNCTION__);			spin_unlock(&priv->lock);			return;		}		dbg("%s - transmitting data (frame n)", __FUNCTION__);		length = ((priv->wrfilled - priv->wrsent) > port->bulk_out_size) ?			port->bulk_out_size : (priv->wrfilled - priv->wrsent);		memcpy (port->write_urb->transfer_buffer, priv->wrbuf + priv->wrsent,			length );		priv->wrsent+=length;		/* set up our urb */		usb_fill_bulk_urb(port->write_urb, port->serial->dev, 			      usb_sndbulkpipe(port->serial->dev, port->bulk_out_endpointAddress),			      port->write_urb->transfer_buffer, length,			      ((port->serial->type->write_bulk_callback) ? 			       port->serial->type->write_bulk_callback : 			       cyberjack_write_bulk_callback), 			      port);		/* send the data out the bulk port */		result = usb_submit_urb(port->write_urb, GFP_ATOMIC);		if (result) {			err("%s - failed submitting write urb, error %d", __FUNCTION__, result);			/* Throw away data. No better idea what to do with it. */			priv->wrfilled=0;			priv->wrsent=0;			goto exit;		}		dbg("%s - priv->wrsent=%d", __FUNCTION__,priv->wrsent);		dbg("%s - priv->wrfilled=%d", __FUNCTION__,priv->wrfilled);		blksize = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;		if( (priv->wrsent>=priv->wrfilled) || (priv->wrsent>=blksize) ) {			dbg("%s - buffer cleaned", __FUNCTION__);			memset( priv->wrbuf, 0, sizeof(priv->wrbuf) );			priv->wrfilled=0;			priv->wrsent=0;		}	}exit:	spin_unlock(&priv->lock);	schedule_work(&port->work);}static int __init cyberjack_init (void){	int retval;	retval  = usb_serial_register(&cyberjack_device);	if (retval)		goto failed_usb_serial_register;	retval = usb_register(&cyberjack_driver);	if (retval) 		goto failed_usb_register;	info(DRIVER_VERSION " " DRIVER_AUTHOR);	info(DRIVER_DESC);	return 0;failed_usb_register:	usb_serial_deregister(&cyberjack_device);failed_usb_serial_register:	return retval;}static void __exit cyberjack_exit (void){	usb_deregister (&cyberjack_driver);	usb_serial_deregister (&cyberjack_device);}module_init(cyberjack_init);module_exit(cyberjack_exit);MODULE_AUTHOR( DRIVER_AUTHOR );MODULE_DESCRIPTION( DRIVER_DESC );MODULE_LICENSE("GPL");module_param(debug, bool, S_IRUGO | S_IWUSR);MODULE_PARM_DESC(debug, "Debug enabled or not");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲电影一级黄| 2022国产精品视频| 粉嫩蜜臀av国产精品网站| 日本视频免费一区| 日本一道高清亚洲日美韩| 三级影片在线观看欧美日韩一区二区| 亚洲美女视频在线| 一区二区在线免费| 亚洲18色成人| 美女国产一区二区三区| 韩国三级中文字幕hd久久精品| 激情综合网最新| 国产一区二区久久| 成人性生交大片免费看视频在线 | 亚洲一区二区3| 成人欧美一区二区三区| 亚洲精品久久久久久国产精华液 | 精品视频999| 欧美精品自拍偷拍| 精品国产区一区| 国产女人18毛片水真多成人如厕 | 激情六月婷婷久久| 成人激情免费视频| 欧美三级日本三级少妇99| 欧美福利电影网| 久久蜜桃av一区二区天堂| 亚洲视频香蕉人妖| 日本不卡不码高清免费观看| 国产99久久久国产精品免费看| av电影在线观看一区| 欧美色视频在线观看| 久久综合五月天婷婷伊人| 亚洲人成伊人成综合网小说| 免费人成网站在线观看欧美高清| 国产乱人伦偷精品视频免下载| 91丝袜美腿高跟国产极品老师 | 国产精品狼人久久影院观看方式| 亚洲久草在线视频| 国产在线观看免费一区| 99re8在线精品视频免费播放| 欧美久久久久久久久中文字幕| 精品国产一区二区三区久久久蜜月 | 一区二区三区日韩欧美精品| 久久99这里只有精品| 91女神在线视频| 精品免费国产一区二区三区四区| 亚洲免费视频成人| 成人一区二区三区| 精品日韩一区二区三区免费视频| 亚洲日穴在线视频| 国产成人精品影院| 精品免费视频.| 午夜视黄欧洲亚洲| 91电影在线观看| 中文字幕精品一区二区三区精品 | 精品国产青草久久久久福利| 亚洲黄色小视频| 福利一区二区在线观看| 日韩欧美123| 日韩精品乱码av一区二区| 91香蕉视频污在线| 国产精品天干天干在线综合| 韩国av一区二区三区四区| 欧美日韩国产一级| 亚洲成人资源在线| 在线视频一区二区三区| 亚洲欧洲国产日本综合| 成人一区二区三区在线观看| 亚洲精品一区二区三区在线观看| 青青国产91久久久久久 | 国产精品乡下勾搭老头1| 欧美一区二区三区的| 肉色丝袜一区二区| 欧美电影在哪看比较好| 亚洲电影在线免费观看| 欧美性猛交xxxxxxxx| 亚洲午夜精品久久久久久久久| 色综合久久综合| 亚洲欧美经典视频| 欧美午夜寂寞影院| 亚洲第一主播视频| 在线电影国产精品| 蜜臀精品久久久久久蜜臀| 欧美v亚洲v综合ⅴ国产v| 经典三级在线一区| 国产人伦精品一区二区| caoporm超碰国产精品| 亚洲欧美日韩在线| 欧美在线三级电影| 日韩精品乱码免费| 久久老女人爱爱| www.性欧美| 亚洲成人自拍偷拍| 久久色在线观看| a4yy欧美一区二区三区| 亚洲影视资源网| 欧美成人一区二区三区在线观看| 国产成人综合在线观看| 日韩美女久久久| 欧美精品色一区二区三区| 精品一区二区三区蜜桃| 中文字幕欧美三区| 欧美日韩另类一区| 国产精品一二三四| 亚洲精品精品亚洲| 日韩欧美国产麻豆| 99久久99久久免费精品蜜臀| 午夜电影一区二区三区| 国产欧美日韩激情| 欧美日韩成人一区二区| 国产精品自拍av| 亚洲综合图片区| 久久婷婷成人综合色| 在线观看一区二区精品视频| 精品影视av免费| 伊人夜夜躁av伊人久久| 精品国产第一区二区三区观看体验| 成人av片在线观看| 久久91精品国产91久久小草| 亚洲免费在线看| 久久久久久久国产精品影院| 欧美三级一区二区| av爱爱亚洲一区| 国产在线不卡视频| 麻豆国产欧美一区二区三区| 亚洲黄色免费网站| 中文字幕+乱码+中文字幕一区| 欧美日韩免费观看一区三区| 99国产精品久| 国产精品99久久久久| 蜜臀av亚洲一区中文字幕| 一区二区三区在线视频观看| 中文字幕免费不卡| 久久久久久亚洲综合影院红桃| 欧美日韩精品欧美日韩精品一 | 五月天丁香久久| 亚洲图片激情小说| 中文字幕中文字幕中文字幕亚洲无线 | 色爱区综合激月婷婷| 成人丝袜18视频在线观看| 国产在线乱码一区二区三区| 视频一区欧美日韩| 亚洲一区二区三区免费视频| 亚洲女同一区二区| 亚洲欧洲另类国产综合| 欧美高清一级片在线观看| 精品国产电影一区二区| 日韩精品自拍偷拍| 欧美刺激午夜性久久久久久久| 欧美日韩不卡一区二区| 欧美精品黑人性xxxx| 欧美日韩国产中文| 91精品国产色综合久久| 日韩无一区二区| 欧美一卡二卡三卡四卡| 91精品国产乱码| 日韩色在线观看| 亚洲精品在线免费播放| 国产区在线观看成人精品 | 日韩电影网1区2区| 青青草国产成人av片免费| 日本不卡123| 激情综合色综合久久| 国产成人无遮挡在线视频| 北岛玲一区二区三区四区| 91麻豆高清视频| 欧美精品三级在线观看| 欧美大黄免费观看| 国产精品麻豆久久久| 亚洲欧美日韩国产中文在线| 亚洲午夜免费视频| 免费av成人在线| 成人黄色软件下载| 欧美综合一区二区| 精品国免费一区二区三区| 亚洲国产精品av| 亚洲午夜电影网| 黄色成人免费在线| 99久久婷婷国产综合精品电影| 欧美在线影院一区二区| 精品国产免费久久| 综合久久综合久久| 免费观看在线综合| 国产99久久久国产精品| 欧美亚洲自拍偷拍| 国产欧美一区二区精品婷婷| 亚洲精品少妇30p| 精品一区二区三区在线播放| 91免费视频网址| 欧美成人艳星乳罩| 亚洲欧美激情在线| 国产成人综合在线观看| 日本高清不卡一区| 久久久午夜精品理论片中文字幕| 亚洲免费av网站| 国产馆精品极品| 91精品婷婷国产综合久久性色 | 亚洲黄色av一区| 国产精品一级在线| 日韩欧美视频在线|