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

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

?? cyberjack.c

?? 自己根據lkd和情境分析
?? 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/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/usb.h>#ifdef CONFIG_USB_SERIAL_DEBUG	static int debug = 1;#else	static int debug;#endif#include "usb-serial.h"/* * 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 void cyberjack_read_int_callback( struct urb *urb );static void cyberjack_read_bulk_callback (struct urb *urb);static void cyberjack_write_bulk_callback (struct urb *urb);static __devinitdata 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_serial_device_type cyberjack_device = {	name:			"Reiner SCT Cyberjack USB card reader",	id_table:		id_table,	needs_interrupt_in:	MUST_HAVE,	needs_bulk_in:		MUST_HAVE,	needs_bulk_out:		MUST_HAVE,	num_interrupt_in:	1,	num_bulk_in:		1,	num_bulk_out:		1,	num_ports:		1,	startup:		cyberjack_startup,	shutdown:		cyberjack_shutdown,	open:			cyberjack_open,	close:			cyberjack_close,	write:			cyberjack_write,	read_int_callback:	cyberjack_read_int_callback,	read_bulk_callback:	cyberjack_read_bulk_callback,	write_bulk_callback:	cyberjack_write_bulk_callback,};struct cyberjack_private {	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 akready 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 (__FUNCTION__);	/* allocate the private data structure */	serial->port->private = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL);	if (!serial->port->private)		return (-1); /* error */	/* set initial values */	priv = (struct cyberjack_private *)serial->port->private;	priv->rdtodo = 0;	priv->wrfilled = 0;	priv->wrsent = 0;	init_waitqueue_head(&serial->port->write_wait);	return( 0 );}static void cyberjack_shutdown (struct usb_serial *serial){	int i;		dbg (__FUNCTION__);	/* stop reads and writes on all ports */	for (i=0; i < serial->num_ports; ++i) {		while (serial->port[i].open_count > 0) {			cyberjack_close (&serial->port[i], NULL);		}		/* My special items, the standard routines free my urbs */		if (serial->port[i].private)			kfree(serial->port[i].private);	}}	static int  cyberjack_open (struct usb_serial_port *port, struct file *filp){	struct cyberjack_private *priv;	int result = 0;	if (port_paranoia_check (port, __FUNCTION__))		return -ENODEV;	MOD_INC_USE_COUNT;	dbg(__FUNCTION__ " - port %d", port->number);	down (&port->sem);	++port->open_count;	if (!port->active) {		port->active = 1;		/* 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 = (struct cyberjack_private *)port->private;		priv->rdtodo = 0;		priv->wrfilled = 0;		priv->wrsent = 0;		/* 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);		if (result)			err(" usb_submit_urb(read int) failed");		dbg(__FUNCTION__ " - usb_submit_urb(int urb)");	}	up (&port->sem);	return result;}static void cyberjack_close (struct usb_serial_port *port, struct file *filp){	dbg(__FUNCTION__ " - port %d", port->number);	down (&port->sem);	--port->open_count;	if (port->open_count <= 0) {		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);		}		port->active = 0;		port->open_count = 0;	}	up (&port->sem);	MOD_DEC_USE_COUNT;}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 = (struct cyberjack_private *)port->private;	int result;	int wrexpected;	dbg(__FUNCTION__ " - port %d", port->number);	dbg(__FUNCTION__ " - from_user %d", from_user);	if (count == 0) {		dbg(__FUNCTION__ " - write request of 0 bytes");		return (0);	}	if (port->write_urb->status == -EINPROGRESS) {		dbg (__FUNCTION__ " - already writing");		return (0);	}	down (&port->sem);	if( (count+priv->wrfilled)>sizeof(priv->wrbuf) ) {		/* To much data  for buffer. Reset buffer. */		priv->wrfilled=0;		return (0);	}	/* Copy data */	if (from_user) {		if (copy_from_user(priv->wrbuf+priv->wrfilled, buf, count))			return -EFAULT;	} else {		memcpy (priv->wrbuf+priv->wrfilled, buf, count);	}  	usb_serial_debug_data (__FILE__, __FUNCTION__, count,		priv->wrbuf+priv->wrfilled);	priv->wrfilled += count;	if( priv->wrfilled >= 3 ) {		wrexpected = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;		dbg(__FUNCTION__ " - expected data: %d", wrexpected);	} else {		wrexpected = sizeof(priv->wrbuf);	}	if( priv->wrfilled >= wrexpected ) {		/* We have enough data to begin transmission */		int length;		dbg(__FUNCTION__ " - transmitting data (frame 1)");		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 */		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);		if (result) {			err(__FUNCTION__ " - failed submitting write urb, error %d", result);			/* Throw away data. No better idea what to do with it. */			priv->wrfilled=0;			priv->wrsent=0;			up (&port->sem);			return 0;		}		dbg(__FUNCTION__ " - priv->wrsent=%d",priv->wrsent);		dbg(__FUNCTION__ " - priv->wrfilled=%d",priv->wrfilled);		if( priv->wrsent>=priv->wrfilled ) {			dbg(__FUNCTION__ " - buffer cleaned");			memset( priv->wrbuf, 0, sizeof(priv->wrbuf) );			priv->wrfilled=0;			priv->wrsent=0;		}	}	up (&port->sem);	return (count);} static void cyberjack_read_int_callback( struct urb *urb ){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct cyberjack_private *priv = (struct cyberjack_private *)port->private;	struct usb_serial *serial;	unsigned char *data = urb->transfer_buffer;	if (port_paranoia_check (port, __FUNCTION__)) return;	dbg(__FUNCTION__ " - port %d", port->number);	/* the urb might have been killed. */	if (urb->status)		return;	serial = port->serial;	if (serial_paranoia_check (serial, __FUNCTION__)) return;	usb_serial_debug_data (__FILE__, __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 = priv->rdtodo;		int result;		/* This is a announcement of comming bulk_ins. */		unsigned short size = ((unsigned short)data[3]<<8)+data[2]+3;		if( (size>259) || (size==0) ) {			dbg( "Bad announced bulk_in data length: %d", size );			/* Dunno what is most reliable to do here. */			/* return; */		}		if( (old_rdtodo+size)<(old_rdtodo) ) {			dbg( "To many bulk_in urbs to do." );			return;		}		/* "+=" is probably more fault tollerant than "=" */		priv->rdtodo += size;		dbg(__FUNCTION__ " - rdtodo: %d", priv->rdtodo);		if( !old_rdtodo ) {			port->read_urb->dev = port->serial->dev;			result = usb_submit_urb(port->read_urb);			if( result )				err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);			dbg(__FUNCTION__ " - usb_submit_urb(read urb)");		}	}}static void cyberjack_read_bulk_callback (struct urb *urb){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct cyberjack_private *priv = (struct cyberjack_private *)port->private;	struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);	struct tty_struct *tty;	unsigned char *data = urb->transfer_buffer;	int i;	int result;	dbg(__FUNCTION__ " - port %d", port->number);		if (!serial) {		dbg(__FUNCTION__ " - bad serial pointer, exiting");		return;	}	if (urb->status) {		usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, urb->transfer_buffer);		dbg(__FUNCTION__ " - nonzero read bulk status received: %d", urb->status);		return;	}	usb_serial_debug_data (__FILE__, __FUNCTION__, urb->actual_length, data);	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);	}	/* Reduce urbs to do by one. */	priv->rdtodo-=urb->actual_length;	/* Just to be sure */	if( priv->rdtodo<0 ) priv->rdtodo=0;	dbg(__FUNCTION__ " - rdtodo: %d", priv->rdtodo);	/* Continue to read if we have still urbs to do. */	if( priv->rdtodo /* || (urb->actual_length==port->bulk_in_endpointAddress)*/ ) {		port->read_urb->dev = port->serial->dev;		result = usb_submit_urb(port->read_urb);		if (result)			err(__FUNCTION__ " - failed resubmitting read urb, error %d", result);		dbg(__FUNCTION__ " - usb_submit_urb(read urb)");	}}static void cyberjack_write_bulk_callback (struct urb *urb){	struct usb_serial_port *port = (struct usb_serial_port *)urb->context;	struct cyberjack_private *priv = (struct cyberjack_private *)port->private;	struct usb_serial *serial = get_usb_serial (port, __FUNCTION__);	dbg(__FUNCTION__ " - port %d", port->number);		if (!serial) {		dbg(__FUNCTION__ " - bad serial pointer, exiting");		return;	}	if (urb->status) {		dbg(__FUNCTION__ " - nonzero write bulk status received: %d", urb->status);		return;	}	/* only do something if we have more data to send */	if( priv->wrfilled ) {		int length, blksize, result;		if (port->write_urb->status == -EINPROGRESS) {			dbg (__FUNCTION__ " - already writing");			return;		}		down (&port->sem);		dbg(__FUNCTION__ " - transmitting data (frame n)");		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 */		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);		if (result) {			err(__FUNCTION__ " - failed submitting write urb, error %d", result);			/* Throw away data. No better idea what to do with it. */			priv->wrfilled=0;			priv->wrsent=0;			up (&port->sem);			queue_task(&port->tqueue, &tq_immediate);			mark_bh(IMMEDIATE_BH);			return;		}		dbg(__FUNCTION__ " - priv->wrsent=%d",priv->wrsent);		dbg(__FUNCTION__ " - priv->wrfilled=%d",priv->wrfilled);		blksize = ((int)priv->wrbuf[2]<<8)+priv->wrbuf[1]+3;		if( (priv->wrsent>=priv->wrfilled) || (priv->wrsent>=blksize) ) {			dbg(__FUNCTION__ " - buffer cleaned");			memset( priv->wrbuf, 0, sizeof(priv->wrbuf) );			priv->wrfilled=0;			priv->wrsent=0;		}		up (&port->sem);		queue_task(&port->tqueue, &tq_immediate);		mark_bh(IMMEDIATE_BH);		return;	}	queue_task(&port->tqueue, &tq_immediate);	mark_bh(IMMEDIATE_BH);		return;}static int __init cyberjack_init (void){	usb_serial_register (&cyberjack_device);	info(DRIVER_VERSION " " DRIVER_AUTHOR);	info(DRIVER_DESC);	return 0;}static void __exit cyberjack_exit (void){	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_PARM(debug, "i");MODULE_PARM_DESC(debug, "Debug enabled or not");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产电影精品久久禁18| 日韩精品一区二区三区在线观看| 欧美日韩一级黄| 91免费在线视频观看| 成人在线视频一区| 欧美一级在线观看| 一区二区欧美视频| 91丨九色丨蝌蚪丨老版| 在线观看av一区| 国产欧美日韩另类视频免费观看| 五月激情综合网| 一本大道综合伊人精品热热| 国产三级久久久| 国产在线不卡一卡二卡三卡四卡| 欧美视频日韩视频| 亚洲精品国久久99热| 国产成人亚洲综合a∨猫咪| 成人免费毛片嘿嘿连载视频| 精品av综合导航| 捆绑调教美女网站视频一区| 欧美一区二区在线视频| 午夜久久电影网| 欧美色大人视频| 一区二区三区**美女毛片| 天天综合色天天综合| 欧美中文字幕亚洲一区二区va在线| 国产精品区一区二区三区| 成人一区二区视频| 国产精品久久久久一区二区三区 | 亚洲激情自拍偷拍| 婷婷综合五月天| 欧美性videosxxxxx| 一区二区三区精品视频| 九九视频精品免费| 不卡一卡二卡三乱码免费网站| 欧美在线综合视频| 国产成人欧美日韩在线电影| 成人av动漫在线| 国产精品国产三级国产普通话三级| 亚洲成在线观看| 国产99久久久精品| 国产精品视频一区二区三区不卡| 国产美女av一区二区三区| 精品视频123区在线观看| 亚洲123区在线观看| 欧美一区二区三区精品| 日韩一区在线免费观看| 久久精品久久综合| 国产拍欧美日韩视频二区| 石原莉奈在线亚洲二区| 91在线观看成人| 亚洲高清在线视频| 精品久久久久久亚洲综合网| 亚洲一区二区三区四区在线免费观看| 极品少妇一区二区三区精品视频 | 精品一区二区三区免费观看| 欧美大尺度电影在线| 国产精品一区专区| 自拍偷在线精品自拍偷无码专区 | 一本大道久久a久久综合婷婷| 亚洲一级电影视频| 不卡电影一区二区三区| 久久久www成人免费毛片麻豆| 丝袜美腿亚洲色图| 欧美偷拍一区二区| 韩国精品在线观看| 亚洲在线观看免费| 色伊人久久综合中文字幕| 一区二区三区欧美日韩| 欧美va亚洲va在线观看蝴蝶网| 日韩中文欧美在线| 91精品午夜视频| 国产91精品精华液一区二区三区 | 国内不卡的二区三区中文字幕 | 99久久国产综合精品麻豆| 亚洲成a人在线观看| 欧美性猛片xxxx免费看久爱| 麻豆91在线观看| 亚洲色图.com| 一本色道久久综合亚洲91| 日韩美女久久久| 精品电影一区二区| 国产成人在线视频网站| 亚洲大片精品永久免费| 亚洲国产精品成人综合| 91精品国产91热久久久做人人| 日韩在线卡一卡二| 欧美不卡视频一区| 精品视频1区2区| 91亚洲国产成人精品一区二三| 亚洲黄色录像片| 欧美在线你懂得| av不卡在线播放| 欧美影片第一页| av电影天堂一区二区在线观看| 亚洲精品国产成人久久av盗摄 | 亚洲天堂久久久久久久| 精品国产凹凸成av人网站| 欧美精品视频www在线观看| 成人黄色免费短视频| 国产久卡久卡久卡久卡视频精品| 日韩高清一区在线| 一区av在线播放| 日韩情涩欧美日韩视频| 国产精品中文字幕欧美| 日韩主播视频在线| 午夜一区二区三区视频| 亚洲一二三专区| 欧美精品一区在线观看| 欧美成va人片在线观看| 欧美一级在线视频| 日韩一级完整毛片| 欧美一级一区二区| 国产v日产∨综合v精品视频| 韩国女主播一区| 国产揄拍国内精品对白| 亚洲人成在线观看一区二区| 国产精品久久久久久久久久免费看 | 婷婷六月综合亚洲| 国产欧美一区二区三区网站| 久久精品网站免费观看| 欧美日韩国产另类不卡| 欧美日韩午夜在线| 成人av综合一区| av在线播放一区二区三区| 午夜精品成人在线| 日本aⅴ亚洲精品中文乱码| 日韩一区二区在线观看视频播放| 91啪在线观看| 精品欧美黑人一区二区三区| 亚洲国产人成综合网站| 欧美大片日本大片免费观看| 亚洲精品ww久久久久久p站| 国产精品丝袜久久久久久app| 国产婷婷色一区二区三区四区| 国产视频一区二区在线观看| 国产精品美女久久久久久2018| 日本欧美一区二区| 欧洲另类一二三四区| 国产精品三级电影| 久久99精品久久只有精品| 欧美日韩免费观看一区三区| 国产精品久久久久久久蜜臀| 亚洲精品视频一区二区| 午夜精品福利一区二区三区av | 国模少妇一区二区三区| 成人午夜短视频| 欧美成人精精品一区二区频| 亚洲成av人片在线观看| 在线观看日韩电影| 国产精品久久精品日日| 国产夫妻精品视频| 精品国产免费人成在线观看| 欧美精品一区二区久久婷婷| 国产精品水嫩水嫩| 日韩专区欧美专区| 欧美网站大全在线观看| 一区二区三区精品久久久| 久久精品久久综合| 91小视频在线免费看| 中文字幕一区二区三区色视频| 亚洲自拍都市欧美小说| 一本色道亚洲精品aⅴ| 精品理论电影在线| 亚洲免费av观看| 韩国v欧美v亚洲v日本v| 在线视频国内自拍亚洲视频| 亚洲精品视频在线观看网站| 激情成人综合网| 91蝌蚪porny九色| 亚洲欧美另类在线| 国内外精品视频| 欧美日韩黄色一区二区| 性感美女久久精品| 99热精品国产| 亚洲欧美经典视频| 91久久精品一区二区二区| 欧美激情一二三区| 成人av电影在线网| 亚洲国产精品99久久久久久久久| 亚洲精品乱码久久久久| 精品视频免费在线| 亚洲欧洲日韩av| 色噜噜久久综合| 午夜欧美视频在线观看| 91视频www| 五月激情综合色| 日韩精品在线一区| 亚洲电影一级片| 99在线精品免费| 亚洲电影欧美电影有声小说| 91农村精品一区二区在线| 一区二区三区在线影院| 在线播放91灌醉迷j高跟美女| 久久 天天综合| 亚洲视频在线观看三级| 成年人国产精品| 国产调教视频一区| 国产一区二区伦理片| 欧美一区二区视频观看视频|