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

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

?? printer.c

?? linux qt class 類的函數定義
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 * printer.c  Version 0.12
 *
 * Copyright (c) 1999 Michael Gee	<michael@linuxspecific.com>
 * Copyright (c) 1999 Pavel Machek	<pavel@suse.cz>
 * Copyright (c) 2000 Randy Dunlap	<randy.dunlap@intel.com>
 * Copyright (c) 2000 Vojtech Pavlik	<vojtech@suse.cz>
 # Copyright (c) 2001 Pete Zaitcev	<zaitcev@redhat.com>
 # Copyright (c) 2001 David Paschal	<paschal@rcsis.com>
 *
 * USB Printer Device Class driver for USB printers and printer cables
 *
 * Sponsored by SuSE
 *
 * ChangeLog:
 *	v0.1 - thorough cleaning, URBification, almost a rewrite
 *	v0.2 - some more cleanups
 *	v0.3 - cleaner again, waitqueue fixes
 *	v0.4 - fixes in unidirectional mode
 *	v0.5 - add DEVICE_ID string support
 *	v0.6 - never time out
 *	v0.7 - fixed bulk-IN read and poll (David Paschal)
 *	v0.8 - add devfs support
 *	v0.9 - fix unplug-while-open paths
 *	v0.10- remove sleep_on, fix error on oom (oliver@neukum.org)
 *	v0.11 - add proto_bias option (Pete Zaitcev)
 *	v0.12 - add hpoj.sourceforge.net ioctls (David Paschal)
 */

/*
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
#include <linux/signal.h>
#include <linux/poll.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/lp.h>
#include <linux/devfs_fs_kernel.h>
#undef DEBUG
#include <linux/usb.h>

/*
 * Version Information
 */
#define DRIVER_VERSION "v0.12"
#define DRIVER_AUTHOR "Michael Gee, Pavel Machek, Vojtech Pavlik, Randy Dunlap, Pete Zaitcev, David Paschal"
#define DRIVER_DESC "USB Printer Device Class driver"

#define USBLP_BUF_SIZE		8192
#define DEVICE_ID_SIZE		1024

/* ioctls: */
#define LPGETSTATUS		0x060b		/* same as in drivers/char/lp.c */
#define IOCNR_GET_DEVICE_ID		1
#define IOCNR_GET_PROTOCOLS		2
#define IOCNR_SET_PROTOCOL		3
#define IOCNR_HP_SET_CHANNEL		4
#define IOCNR_GET_BUS_ADDRESS		5
#define IOCNR_GET_VID_PID		6
/* Get device_id string: */
#define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
/* The following ioctls were added for http://hpoj.sourceforge.net: */
/* Get two-int array:
 * [0]=current protocol (1=7/1/1, 2=7/1/2, 3=7/1/3),
 * [1]=supported protocol mask (mask&(1<<n)!=0 means 7/1/n supported): */
#define LPIOC_GET_PROTOCOLS(len) _IOC(_IOC_READ, 'P', IOCNR_GET_PROTOCOLS, len)
/* Set protocol (arg: 1=7/1/1, 2=7/1/2, 3=7/1/3): */
#define LPIOC_SET_PROTOCOL _IOC(_IOC_WRITE, 'P', IOCNR_SET_PROTOCOL, 0)
/* Set channel number (HP Vendor-specific command): */
#define LPIOC_HP_SET_CHANNEL _IOC(_IOC_WRITE, 'P', IOCNR_HP_SET_CHANNEL, 0)
/* Get two-int array: [0]=bus number, [1]=device address: */
#define LPIOC_GET_BUS_ADDRESS(len) _IOC(_IOC_READ, 'P', IOCNR_GET_BUS_ADDRESS, len)
/* Get two-int array: [0]=vendor ID, [1]=product ID: */
#define LPIOC_GET_VID_PID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_VID_PID, len)

/*
 * A DEVICE_ID string may include the printer's serial number.
 * It should end with a semi-colon (';').
 * An example from an HP 970C DeskJet printer is (this is one long string,
 * with the serial number changed):
MFG:HEWLETT-PACKARD;MDL:DESKJET 970C;CMD:MLC,PCL,PML;CLASS:PRINTER;DESCRIPTION:Hewlett-Packard DeskJet 970C;SERN:US970CSEPROF;VSTATUS:$HB0$NC0,ff,DN,IDLE,CUT,K1,C0,DP,NR,KP000,CP027;VP:0800,FL,B0;VJ:                    ;
 */

/*
 * USB Printer Requests
 */

#define USBLP_REQ_GET_ID			0x00
#define USBLP_REQ_GET_STATUS			0x01
#define USBLP_REQ_RESET				0x02
#define USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST	0x00	/* HP Vendor-specific */

#ifdef CONFIG_USB_DYNAMIC_MINORS
#define USBLP_MINORS		256
#else
#define USBLP_MINORS		16
#endif
#define USBLP_MINOR_BASE	0

#define USBLP_WRITE_TIMEOUT	(5*HZ)			/* 5 seconds */

#define USBLP_FIRST_PROTOCOL	1
#define USBLP_LAST_PROTOCOL	3
#define USBLP_MAX_PROTOCOLS	(USBLP_LAST_PROTOCOL+1)

struct usblp {
	struct usb_device 	*dev;			/* USB device */
	devfs_handle_t		devfs;			/* devfs device */
	struct semaphore	sem;			/* locks this struct, especially "dev" */
	char			*buf;		/* writeurb->transfer_buffer */
	struct urb		*readurb, *writeurb;	/* The urbs */
	wait_queue_head_t	wait;			/* Zzzzz ... */
	int			readcount;		/* Counter for reads */
	int			ifnum;			/* Interface number */
	/* Alternate-setting numbers and endpoints for each protocol
	 * (7/1/{index=1,2,3}) that the device supports: */
	struct {
		int				alt_setting;
		struct usb_endpoint_descriptor	*epwrite;
		struct usb_endpoint_descriptor	*epread;
	}			protocol[USBLP_MAX_PROTOCOLS];
	int			current_protocol;
	int			minor;			/* minor number of device */
	int			wcomplete;		/* writing is completed */
	int			rcomplete;		/* reading is completed */
	unsigned int		quirks;			/* quirks flags */
	unsigned char		used;			/* True if open */
	unsigned char		bidir;			/* interface is bidirectional */
	unsigned char		*device_id_string;	/* IEEE 1284 DEVICE ID string (ptr) */
							/* first 2 bytes are (big-endian) length */
};

#ifdef DEBUG
static void usblp_dump(struct usblp *usblp) {
	int p;

	dbg("usblp=0x%p", usblp);
	dbg("dev=0x%p", usblp->dev);
	dbg("devfs=0x%p", usblp->devfs);
	dbg("buf=0x%p", usblp->buf);
	dbg("readcount=%d", usblp->readcount);
	dbg("ifnum=%d", usblp->ifnum);
    for (p = USBLP_FIRST_PROTOCOL; p <= USBLP_LAST_PROTOCOL; p++) {
	dbg("protocol[%d].alt_setting=%d", p, usblp->protocol[p].alt_setting);
	dbg("protocol[%d].epwrite=%p", p, usblp->protocol[p].epwrite);
	dbg("protocol[%d].epread=%p", p, usblp->protocol[p].epread);
    }
	dbg("current_protocol=%d", usblp->current_protocol);
	dbg("minor=%d", usblp->minor);
	dbg("wcomplete=%d", usblp->wcomplete);
	dbg("rcomplete=%d", usblp->rcomplete);
	dbg("quirks=%d", usblp->quirks);
	dbg("used=%d", usblp->used);
	dbg("bidir=%d", usblp->bidir);
	dbg("device_id_string=\"%s\"",
		usblp->device_id_string ?
			usblp->device_id_string + 2 :
			(unsigned char *)"(null)");
}
#endif

extern devfs_handle_t usb_devfs_handle;			/* /dev/usb dir. */

static struct usblp *usblp_table[USBLP_MINORS];

/* Quirks: various printer quirks are handled by this table & its flags. */

struct quirk_printer_struct {
	__u16 vendorId;
	__u16 productId;
	unsigned int quirks;
};

#define USBLP_QUIRK_BIDIR	0x1	/* reports bidir but requires unidirectional mode (no INs/reads) */
#define USBLP_QUIRK_USB_INIT	0x2	/* needs vendor USB init string */

static struct quirk_printer_struct quirk_printers[] = {
	{ 0x03f0, 0x0004, USBLP_QUIRK_BIDIR }, /* HP DeskJet 895C */
	{ 0x03f0, 0x0104, USBLP_QUIRK_BIDIR }, /* HP DeskJet 880C */
	{ 0x03f0, 0x0204, USBLP_QUIRK_BIDIR }, /* HP DeskJet 815C */
	{ 0x03f0, 0x0304, USBLP_QUIRK_BIDIR }, /* HP DeskJet 810C/812C */
	{ 0x03f0, 0x0404, USBLP_QUIRK_BIDIR }, /* HP DeskJet 830C */
	{ 0x03f0, 0x0504, USBLP_QUIRK_BIDIR }, /* HP DeskJet 885C */
	{ 0x03f0, 0x0604, USBLP_QUIRK_BIDIR }, /* HP DeskJet 840C */   
	{ 0x03f0, 0x0804, USBLP_QUIRK_BIDIR }, /* HP DeskJet 816C */   
	{ 0x03f0, 0x1104, USBLP_QUIRK_BIDIR }, /* HP Deskjet 959C */
	{ 0x0409, 0xefbe, USBLP_QUIRK_BIDIR }, /* NEC Picty900 (HP OEM) */
	{ 0x0409, 0xbef4, USBLP_QUIRK_BIDIR }, /* NEC Picty760 (HP OEM) */
	{ 0x0409, 0xf0be, USBLP_QUIRK_BIDIR }, /* NEC Picty920 (HP OEM) */
	{ 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */
	{ 0, 0 }
};

static int usblp_select_alts(struct usblp *usblp);
static int usblp_set_protocol(struct usblp *usblp, int protocol);
static int usblp_cache_device_id_string(struct usblp *usblp);

/* forward reference to make our lives easier */
extern struct usb_driver usblp_driver;

/*
 * Functions for usblp control messages.
 */

static int usblp_ctrl_msg(struct usblp *usblp, int request, int type, int dir, int recip, int value, void *buf, int len)
{
	int retval = usb_control_msg(usblp->dev,
		dir ? usb_rcvctrlpipe(usblp->dev, 0) : usb_sndctrlpipe(usblp->dev, 0),
		request, type | dir | recip, value, usblp->ifnum, buf, len, USBLP_WRITE_TIMEOUT);
	dbg("usblp_control_msg: rq: 0x%02x dir: %d recip: %d value: %d len: %#x result: %d",
		request, !!dir, recip, value, len, retval);
	return retval < 0 ? retval : 0;
}

#define usblp_read_status(usblp, status)\
	usblp_ctrl_msg(usblp, USBLP_REQ_GET_STATUS, USB_TYPE_CLASS, USB_DIR_IN, USB_RECIP_INTERFACE, 0, status, 1)
#define usblp_get_id(usblp, config, id, maxlen)\
	usblp_ctrl_msg(usblp, USBLP_REQ_GET_ID, USB_TYPE_CLASS, USB_DIR_IN, USB_RECIP_INTERFACE, config, id, maxlen)
#define usblp_reset(usblp)\
	usblp_ctrl_msg(usblp, USBLP_REQ_RESET, USB_TYPE_CLASS, USB_DIR_OUT, USB_RECIP_OTHER, 0, NULL, 0)

#define usblp_hp_channel_change_request(usblp, channel, buffer) \
	usblp_ctrl_msg(usblp, USBLP_REQ_HP_CHANNEL_CHANGE_REQUEST, USB_TYPE_VENDOR, USB_DIR_IN, USB_RECIP_INTERFACE, channel, buffer, 1)

/*
 * See the description for usblp_select_alts() below for the usage
 * explanation.  Look into your /proc/bus/usb/devices and dmesg in
 * case of any trouble.
 */
static int proto_bias = -1;

/*
 * URB callback.
 */

static void usblp_bulk_read(struct urb *urb)
{
	struct usblp *usblp = urb->context;

	if (!usblp || !usblp->dev || !usblp->used)
		return;

	if (unlikely(urb->status))
		warn("usblp%d: nonzero read/write bulk status received: %d",
			usblp->minor, urb->status);
	usblp->rcomplete = 1;
	wake_up_interruptible(&usblp->wait);
}

static void usblp_bulk_write(struct urb *urb)
{
	struct usblp *usblp = urb->context;

	if (!usblp || !usblp->dev || !usblp->used)
		return;

	if (unlikely(urb->status))
		warn("usblp%d: nonzero read/write bulk status received: %d",
			usblp->minor, urb->status);
	usblp->wcomplete = 1;
	wake_up_interruptible(&usblp->wait);
}

/*
 * Get and print printer errors.
 */

static char *usblp_messages[] = { "ok", "out of paper", "off-line", "on fire" };

static int usblp_check_status(struct usblp *usblp, int err)
{
	unsigned char status, newerr = 0;
	int error;

	error = usblp_read_status (usblp, &status);
	if (error < 0) {
		err("usblp%d: error %d reading printer status",
			usblp->minor, error);
		return 0;
	}

	if (~status & LP_PERRORP) {
		newerr = 3;
		if (status & LP_POUTPA) newerr = 1;
		if (~status & LP_PSELECD) newerr = 2;
	}

	if (newerr != err)
		info("usblp%d: %s", usblp->minor, usblp_messages[newerr]);

	return newerr;
}

/*
 * File op functions.
 */

static int usblp_open(struct inode *inode, struct file *file)
{
	int minor = minor(inode->i_rdev) - USBLP_MINOR_BASE;
	struct usblp *usblp;
	int retval;

	if (minor < 0 || minor >= USBLP_MINORS)
		return -ENODEV;

	lock_kernel();
	usblp  = usblp_table[minor];

	retval = -ENODEV;
	if (!usblp || !usblp->dev)
		goto out;

	retval = -EBUSY;
	if (usblp->used)
		goto out;

	/*
	 * TODO: need to implement LP_ABORTOPEN + O_NONBLOCK as in drivers/char/lp.c ???
	 * This is #if 0-ed because we *don't* want to fail an open
	 * just because the printer is off-line.
	 */
#if 0
	if ((retval = usblp_check_status(usblp, 0))) {
		retval = retval > 1 ? -EIO : -ENOSPC;
		goto out;
	}
#else
	retval = 0;
#endif

	usblp->used = 1;
	file->private_data = usblp;

	usblp->writeurb->transfer_buffer_length = 0;
	usblp->writeurb->status = 0;
	usblp->wcomplete = 1; /* we begin writeable */
	usblp->rcomplete = 0;

	if (usblp->bidir) {
		usblp->readcount = 0;
		usblp->readurb->dev = usblp->dev;
		if (usb_submit_urb(usblp->readurb, GFP_KERNEL) < 0) {
			retval = -EIO;
			usblp->used = 0;
			file->private_data = NULL;
		}
	}
out:
	unlock_kernel();
	return retval;
}

static void usblp_cleanup (struct usblp *usblp)
{
	devfs_unregister (usblp->devfs);
	usblp_table [usblp->minor] = NULL;
	usb_deregister_dev (&usblp_driver, 1, usblp->minor);
	info("usblp%d: removed", usblp->minor);

	kfree (usblp->writeurb->transfer_buffer);
	kfree (usblp->device_id_string);
	usb_free_urb(usblp->writeurb);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看区一区二| 成人小视频免费在线观看| 久久精品国产成人一区二区三区| 国模无码大尺度一区二区三区| 懂色中文一区二区在线播放| 欧美在线短视频| 久久久久青草大香线综合精品| 亚洲品质自拍视频| 免费人成黄页网站在线一区二区| 丁香天五香天堂综合| 欧美日韩夫妻久久| 国产日韩欧美麻豆| 亚洲一区二区三区四区五区黄 | 欧美综合欧美视频| 精品久久一区二区三区| 中文字幕一区二区三区四区| 日韩精品一区第一页| 国产精品18久久久久久久久| 欧美精品一二三四| 国产精品天美传媒| 麻豆精品一区二区| 日本道精品一区二区三区| 精品久久五月天| 亚洲一二三四久久| 成人性生交大片免费看中文网站| 欧美日韩视频专区在线播放| 国产精品久久久久三级| 久久国产福利国产秒拍| 欧美系列日韩一区| 国产精品福利一区| 国产裸体歌舞团一区二区| 欧美三级在线视频| 亚洲人成网站色在线观看| 国内精品伊人久久久久av影院| 欧美日韩一卡二卡| 亚洲人成精品久久久久| 国产高清久久久| 欧美成人精品福利| 午夜精品久久一牛影视| 91久久精品一区二区| 中文字幕巨乱亚洲| 国产一区二区剧情av在线| 欧美电影一区二区三区| 亚洲在线视频一区| 不卡视频在线观看| 久久色在线观看| 奇米色一区二区三区四区| 在线观看一区二区视频| 亚洲日本丝袜连裤袜办公室| 国产高清不卡一区| 久久伊人蜜桃av一区二区| 日本伊人午夜精品| 欧美日韩dvd在线观看| 一区二区三区成人| 99视频精品在线| 日本一区二区三区国色天香| 九色|91porny| 欧美成人猛片aaaaaaa| 另类欧美日韩国产在线| 欧美一区二区精品| 午夜精品福利一区二区三区av| 在线看日韩精品电影| 一区二区三区高清| 在线观看免费亚洲| 亚洲一区二区精品视频| 欧美图区在线视频| 午夜影院在线观看欧美| 欧美日韩亚洲国产综合| 亚洲高清免费视频| 欧美精品日日鲁夜夜添| 日韩黄色免费网站| 欧美一区二区国产| 精品一区二区影视| 精品欧美一区二区久久| 国产精品主播直播| 国产精品色哟哟| 91亚洲男人天堂| 亚洲在线免费播放| 7777精品伊人久久久大香线蕉经典版下载 | 久久69国产一区二区蜜臀| 精品少妇一区二区三区视频免付费 | 欧美三级在线看| 午夜成人免费电影| 91精品国产91热久久久做人人| 日本不卡不码高清免费观看| 精品国产91久久久久久久妲己| 狠狠色丁香久久婷婷综合_中| 国产亚洲视频系列| 不卡一区在线观看| 亚洲综合在线观看视频| 欧美日本免费一区二区三区| 久久超级碰视频| 国产欧美日韩在线看| 色综合久久久久综合体| 亚洲成人三级小说| 精品日本一线二线三线不卡| 高清不卡在线观看av| 亚洲精选一二三| 欧美一级欧美三级在线观看| 国产精品亚洲成人| 综合激情成人伊人| 欧美日韩一区二区三区在线看| 免费看欧美美女黄的网站| 国产调教视频一区| 99亚偷拍自图区亚洲| 午夜精品久久久久久久蜜桃app| 精品国产一区二区三区忘忧草 | 亚洲精品国产精华液| 欧美久久一区二区| 国产精品自拍在线| 一二三区精品福利视频| 精品国产一区二区三区不卡| a美女胸又www黄视频久久| 视频一区在线视频| 国产日韩成人精品| 欧美中文字幕一区| 激情久久久久久久久久久久久久久久| 欧美激情在线看| 欧美人狂配大交3d怪物一区| 国产99久久久精品| 手机精品视频在线观看| 日本韩国精品在线| 国产精品毛片无遮挡高清| 欧美色精品在线视频| 韩国女主播一区二区三区| 国产精品久久毛片a| 91精品在线麻豆| 丁香婷婷深情五月亚洲| 日av在线不卡| 日韩理论电影院| 久久综合五月天婷婷伊人| 欧美在线视频你懂得| 国产成人鲁色资源国产91色综| 亚洲va国产天堂va久久en| 久久精品夜夜夜夜久久| 91精品综合久久久久久| 91麻豆产精品久久久久久 | 国产三级精品三级| 欧美日韩国产乱码电影| 99久久婷婷国产综合精品电影 | 欧美激情一区二区三区不卡| 欧美一区二区在线不卡| 91视频在线观看| 国产一区 二区| 日本va欧美va精品| 中文字幕一区免费在线观看| www日韩大片| 91麻豆精品国产自产在线观看一区| www.亚洲人| 国产一区二区三区电影在线观看 | 日韩久久免费av| 欧美伊人久久久久久午夜久久久久| 国产超碰在线一区| 蜜桃av噜噜一区二区三区小说| 亚洲一区二区三区四区不卡| 国产精品拍天天在线| 国产婷婷色一区二区三区四区| 欧美大肚乱孕交hd孕妇| 欧美军同video69gay| 色综合天天视频在线观看| 成人aaaa免费全部观看| 国产91露脸合集magnet| 国产一区二区三区免费看| 久久国产三级精品| 日韩激情一二三区| 婷婷综合另类小说色区| 亚洲一区影音先锋| 一区二区三区免费观看| 亚洲视频每日更新| 综合亚洲深深色噜噜狠狠网站| 中文字幕欧美三区| 国产偷国产偷精品高清尤物| 亚洲三级理论片| 色婷婷亚洲精品| 六月丁香婷婷久久| 欧美v国产在线一区二区三区| 在线播放91灌醉迷j高跟美女 | 中文字幕精品一区二区精品绿巨人| 26uuu欧美| 91精品国产麻豆国产自产在线| 99视频精品免费视频| 北条麻妃一区二区三区| 国产999精品久久久久久绿帽| 国产成人福利片| 丰满白嫩尤物一区二区| 亚洲丶国产丶欧美一区二区三区| 国产日韩精品一区二区三区| 欧美大白屁股肥臀xxxxxx| 99久久精品国产一区二区三区 | 久久综合五月天婷婷伊人| 欧美大片日本大片免费观看| 精品第一国产综合精品aⅴ| 精品少妇一区二区| 国产亚洲欧美激情| 国产精品久久久久四虎| 一本一道久久a久久精品 | 1000部国产精品成人观看| 欧美一区二区三区四区高清| 国产精品一区免费在线观看| 在线观看日韩国产|