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

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

?? cyberjack.c

?? linux和2410結(jié)合開(kāi)發(fā) 用他可以生成2410所需的zImage文件
?? C
字號(hào):
/* *  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");

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品久久久| 欧美日本精品一区二区三区| 91丝袜美女网| 日韩欧美一区二区免费| 国产精品美女久久久久aⅴ国产馆| 亚洲午夜三级在线| 成人黄色综合网站| 精品国产第一区二区三区观看体验| 亚洲日穴在线视频| 国产一区二区在线电影| 欧美精品久久天天躁| 成人免费一区二区三区在线观看| 美女爽到高潮91| 欧美日韩国产精品成人| 亚洲综合一二三区| 99亚偷拍自图区亚洲| 国产日韩欧美电影| 韩国成人精品a∨在线观看| 欧美剧情片在线观看| 亚洲美女视频在线| 99精品视频在线免费观看| 国产香蕉久久精品综合网| 麻豆一区二区99久久久久| 欧美日韩国产天堂| 亚洲一区二区三区在线播放 | 夜夜精品浪潮av一区二区三区| 国产精品夜夜爽| 精品久久久久久久久久久久包黑料 | 日本一区二区三区电影| 久久99国产精品免费网站| 欧美一级高清大全免费观看| 视频一区二区中文字幕| 欧美一卡二卡在线观看| 日韩电影在线一区二区| 在线播放国产精品二区一二区四区 | 日韩专区中文字幕一区二区| 欧美视频在线一区| 亚洲最新在线观看| 欧美揉bbbbb揉bbbbb| 亚洲一区二区三区四区不卡| 欧美日韩中文精品| 天天av天天翘天天综合网| 欧美日韩国产小视频在线观看| 亚洲高清在线精品| 日韩色视频在线观看| 狠狠色丁香久久婷婷综合_中| 久久久亚洲精品一区二区三区| 国产一区二区不卡老阿姨| 国产日韩欧美综合在线| 99久久免费视频.com| 亚洲免费在线观看| 欧美精三区欧美精三区| 免费人成在线不卡| 欧美国产日产图区| 91成人免费在线视频| 视频一区国产视频| 久久久久国产免费免费| 99久久99久久综合| 日本美女一区二区| 久久精品视频网| 91美女片黄在线| 蜜桃视频一区二区三区| 国产精品午夜久久| 精品视频1区2区3区| 久久成人久久爱| 亚洲视频电影在线| 日韩一区二区三区av| 国产成人免费视频网站 | 在线免费观看不卡av| 日韩成人午夜精品| 日本一区二区在线不卡| 欧美日韩和欧美的一区二区| 国产一区二区三区香蕉| 亚洲夂夂婷婷色拍ww47| 精品日韩欧美在线| 一本大道久久精品懂色aⅴ| 奇米影视一区二区三区小说| 欧美国产激情一区二区三区蜜月| 欧美亚洲综合在线| 国产精品影视天天线| 一区二区久久久久| 中文久久乱码一区二区| 9191久久久久久久久久久| 97se亚洲国产综合自在线| 日本不卡一二三区黄网| 伊人开心综合网| 国产日韩v精品一区二区| 欧美日韩亚洲高清一区二区| 成人免费高清视频| 激情文学综合插| 日日夜夜免费精品| 一区二区三区中文字幕精品精品 | 日本在线不卡一区| 亚洲视频一区在线| 久久精品夜夜夜夜久久| 91超碰这里只有精品国产| 一本一道综合狠狠老| 不卡的av在线播放| 国产在线精品一区二区夜色| 视频在线观看91| 亚洲成人在线免费| 亚洲欧美日韩国产成人精品影院 | 久久久国产综合精品女国产盗摄| 欧美老人xxxx18| 欧美午夜理伦三级在线观看| 99综合电影在线视频| 成人午夜在线播放| 国产精品小仙女| 风流少妇一区二区| 国产精品一区二区男女羞羞无遮挡 | 性久久久久久久久| 一区二区成人在线视频| 亚洲精品中文在线| 亚洲摸摸操操av| 亚洲免费观看在线观看| 亚洲黄色尤物视频| 亚洲一区二区三区国产| 亚洲激情在线激情| 亚洲香肠在线观看| 亚洲成人精品在线观看| 亚洲v日本v欧美v久久精品| 香蕉久久一区二区不卡无毒影院| 伊人色综合久久天天| 亚洲h动漫在线| 毛片不卡一区二区| 国产成人自拍高清视频在线免费播放| 国产精品综合二区| 成人免费毛片a| 欧美亚洲国产一区在线观看网站| 欧美天堂一区二区三区| 欧美电影在线免费观看| 精品国产污污免费网站入口| 国产日产欧美一区二区视频| 亚洲少妇最新在线视频| 一级特黄大欧美久久久| 免费看欧美女人艹b| 国产一区二区主播在线| 99久久精品免费精品国产| 欧美视频在线播放| 欧美一级理论片| 国产精品久久99| 香蕉加勒比综合久久| 精品在线一区二区三区| 99在线视频精品| 91精品欧美一区二区三区综合在| 久久亚洲影视婷婷| 亚洲日本va在线观看| 日本不卡的三区四区五区| 成人精品国产一区二区4080| 色素色在线综合| 欧美大胆人体bbbb| 成人欧美一区二区三区白人| 免费高清不卡av| 成人avav在线| 欧美一区2区视频在线观看| 中文一区在线播放| 日韩一区欧美二区| caoporm超碰国产精品| 欧美福利视频导航| 亚洲色图.com| 毛片av一区二区三区| 91精彩视频在线观看| 精品久久久久久久久久久久久久久 | 欧美激情一区二区三区在线| 亚洲在线中文字幕| 不卡视频免费播放| 欧美刺激午夜性久久久久久久| 国产精品天干天干在观线 | 亚洲一区二区三区美女| 国产不卡视频一区| 日韩欧美一区二区免费| 亚洲综合久久久| 成人小视频在线| 欧美成人精品1314www| 亚洲精品国产视频| 国产成人精品免费网站| 欧美日本在线视频| 亚洲日本在线天堂| 成人妖精视频yjsp地址| 精品久久一二三区| 男男视频亚洲欧美| 欧美性色黄大片| 亚洲免费毛片网站| 波多野结衣中文字幕一区二区三区| 欧美成人三级电影在线| 日韩电影在线观看电影| 欧美性猛交一区二区三区精品| 欧美国产成人精品| 国产成人av电影在线播放| 日韩欧美高清在线| 久久丁香综合五月国产三级网站| 欧美日韩卡一卡二| 亚洲激情第一区| 一本久道久久综合中文字幕| 亚洲婷婷综合色高清在线| 成人免费高清在线| 成人欧美一区二区三区黑人麻豆 | 奇米影视一区二区三区小说| 91麻豆精品久久久久蜜臀| 亚洲黄网站在线观看|