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

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

?? logips2pp.c

?? qq2440板子上
?? C
字號:
/* * Logitech PS/2++ mouse driver * * Copyright (c) 1999-2003 Vojtech Pavlik <vojtech@suse.cz> * Copyright (c) 2003 Eric Wong <eric@yhbt.net> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. */#include <linux/input.h>#include <linux/serio.h>#include <linux/libps2.h>#include "psmouse.h"#include "logips2pp.h"/* Logitech mouse types */#define PS2PP_KIND_WHEEL	1#define PS2PP_KIND_MX		2#define PS2PP_KIND_TP3		3/* Logitech mouse features */#define PS2PP_WHEEL		0x01#define PS2PP_HWHEEL		0x02#define PS2PP_SIDE_BTN		0x04#define PS2PP_EXTRA_BTN		0x08#define PS2PP_TASK_BTN		0x10#define PS2PP_NAV_BTN		0x20struct ps2pp_info {	const int model;	unsigned const int kind;	unsigned const int features;};/* * Process a PS2++ or PS2T++ packet. */static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse, struct pt_regs *regs){	struct input_dev *dev = &psmouse->dev;	unsigned char *packet = psmouse->packet;	if (psmouse->pktcnt < 3)		return PSMOUSE_GOOD_DATA;/* * Full packet accumulated, process it */	input_regs(dev, regs);	if ((packet[0] & 0x48) == 0x48 && (packet[1] & 0x02) == 0x02) {		/* Logitech extended packet */		switch ((packet[1] >> 4) | (packet[0] & 0x30)) {			case 0x0d: /* Mouse extra info */				input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL,					(int) (packet[2] & 8) - (int) (packet[2] & 7));				input_report_key(dev, BTN_SIDE, (packet[2] >> 4) & 1);				input_report_key(dev, BTN_EXTRA, (packet[2] >> 5) & 1);				break;			case 0x0e: /* buttons 4, 5, 6, 7, 8, 9, 10 info */				input_report_key(dev, BTN_SIDE, (packet[2]) & 1);				input_report_key(dev, BTN_EXTRA, (packet[2] >> 1) & 1);				input_report_key(dev, BTN_BACK, (packet[2] >> 3) & 1);				input_report_key(dev, BTN_FORWARD, (packet[2] >> 4) & 1);				input_report_key(dev, BTN_TASK, (packet[2] >> 2) & 1);				break;			case 0x0f: /* TouchPad extra info */				input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL,					(int) ((packet[2] >> 4) & 8) - (int) ((packet[2] >> 4) & 7));				packet[0] = packet[2] | 0x08;				break;#ifdef DEBUG			default:				printk(KERN_WARNING "psmouse.c: Received PS2++ packet #%x, but don't know how to handle.\n",					(packet[1] >> 4) | (packet[0] & 0x30));#endif		}	} else {		/* Standard PS/2 motion data */		input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0);		input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0);	}	input_report_key(dev, BTN_LEFT,    packet[0]       & 1);	input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1);	input_report_key(dev, BTN_RIGHT,  (packet[0] >> 1) & 1);	input_sync(dev);	return PSMOUSE_FULL_PACKET;}/* * ps2pp_cmd() sends a PS2++ command, sliced into two bit * pieces through the SETRES command. This is needed to send extended * commands to mice on notebooks that try to understand the PS/2 protocol * Ugly. */static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned char command){	if (psmouse_sliced_command(psmouse, command))		return -1;	if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL))		return -1;	return 0;}/* * SmartScroll / CruiseControl for some newer Logitech mice Defaults to * enabled if we do nothing to it. Of course I put this in because I want it * disabled :P * 1 - enabled (if previously disabled, also default) * 0 - disabled */static void ps2pp_set_smartscroll(struct psmouse *psmouse, unsigned int smartscroll){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[4];	if (smartscroll > 1)		smartscroll = 1;	ps2pp_cmd(psmouse, param, 0x32);	param[0] = 0;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);	param[0] = smartscroll;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);}static ssize_t psmouse_attr_show_smartscroll(struct psmouse *psmouse, char *buf){	return sprintf(buf, "%d\n", psmouse->smartscroll ? 1 : 0);}static ssize_t psmouse_attr_set_smartscroll(struct psmouse *psmouse, const char *buf, size_t count){	unsigned long value;	char *rest;	value = simple_strtoul(buf, &rest, 10);	if (*rest || value > 1)		return -EINVAL;	ps2pp_set_smartscroll(psmouse, value);	psmouse->smartscroll = value;	return count;}PSMOUSE_DEFINE_ATTR(smartscroll);/* * Support 800 dpi resolution _only_ if the user wants it (there are good * reasons to not use it even if the mouse supports it, and of course there are * also good reasons to use it, let the user decide). */static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolution){	if (resolution > 400) {		struct ps2dev *ps2dev = &psmouse->ps2dev;		unsigned char param = 3;		ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);		ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);		ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11);		ps2_command(ps2dev, &param, PSMOUSE_CMD_SETRES);		psmouse->resolution = 800;	} else		psmouse_set_resolution(psmouse, resolution);}static void ps2pp_disconnect(struct psmouse *psmouse){	device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll);}static struct ps2pp_info *get_model_info(unsigned char model){	static struct ps2pp_info ps2pp_list[] = {		{ 12,	0,			PS2PP_SIDE_BTN},		{ 13,	0,			0 },		{ 15,	PS2PP_KIND_MX,					/* MX1000 */				PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |				PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL },		{ 40,	0,			PS2PP_SIDE_BTN },		{ 41,	0,			PS2PP_SIDE_BTN },		{ 42,	0,			PS2PP_SIDE_BTN },		{ 43,	0,			PS2PP_SIDE_BTN },		{ 50,	0,			0 },		{ 51,	0,			0 },		{ 52,	PS2PP_KIND_WHEEL,	PS2PP_SIDE_BTN | PS2PP_WHEEL },		{ 53,	PS2PP_KIND_WHEEL,	PS2PP_WHEEL },		{ 61,	PS2PP_KIND_MX,					/* MX700 */				PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |				PS2PP_EXTRA_BTN | PS2PP_NAV_BTN },		{ 73,	0,			PS2PP_SIDE_BTN },		{ 75,	PS2PP_KIND_WHEEL,	PS2PP_WHEEL },		{ 76,	PS2PP_KIND_WHEEL,	PS2PP_WHEEL },		{ 80,	PS2PP_KIND_WHEEL,	PS2PP_SIDE_BTN | PS2PP_WHEEL },		{ 81,	PS2PP_KIND_WHEEL,	PS2PP_WHEEL },		{ 83,	PS2PP_KIND_WHEEL,	PS2PP_WHEEL },		{ 88,	PS2PP_KIND_WHEEL,	PS2PP_WHEEL },		{ 96,	0,			0 },		{ 97,	PS2PP_KIND_TP3,		PS2PP_WHEEL | PS2PP_HWHEEL },		{ 100,	PS2PP_KIND_MX,					/* MX510 */				PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |				PS2PP_EXTRA_BTN | PS2PP_NAV_BTN },		{ 111,  PS2PP_KIND_MX,					/* MX300 */				PS2PP_WHEEL | PS2PP_EXTRA_BTN | PS2PP_TASK_BTN },		{ 112,	PS2PP_KIND_MX,					/* MX500 */				PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN |				PS2PP_EXTRA_BTN | PS2PP_NAV_BTN },		{ 114,	PS2PP_KIND_MX,					/* MX310 */				PS2PP_WHEEL | PS2PP_SIDE_BTN |				PS2PP_TASK_BTN | PS2PP_EXTRA_BTN },		{ }	};	int i;	for (i = 0; ps2pp_list[i].model; i++)		if (model == ps2pp_list[i].model)			return &ps2pp_list[i];	printk(KERN_WARNING "logips2pp: Detected unknown logitech mouse model %d\n", model);	return NULL;}/* * Set up input device's properties based on the detected mouse model. */static void ps2pp_set_model_properties(struct psmouse *psmouse, struct ps2pp_info *model_info,				       int using_ps2pp){	if (model_info->features & PS2PP_SIDE_BTN)		set_bit(BTN_SIDE, psmouse->dev.keybit);	if (model_info->features & PS2PP_EXTRA_BTN)		set_bit(BTN_EXTRA, psmouse->dev.keybit);	if (model_info->features & PS2PP_TASK_BTN)		set_bit(BTN_TASK, psmouse->dev.keybit);	if (model_info->features & PS2PP_NAV_BTN) {		set_bit(BTN_FORWARD, psmouse->dev.keybit);		set_bit(BTN_BACK, psmouse->dev.keybit);	}	if (model_info->features & PS2PP_WHEEL)		set_bit(REL_WHEEL, psmouse->dev.relbit);	if (model_info->features & PS2PP_HWHEEL)		set_bit(REL_HWHEEL, psmouse->dev.relbit);	switch (model_info->kind) {		case PS2PP_KIND_WHEEL:			psmouse->name = "Wheel Mouse";			break;		case PS2PP_KIND_MX:			psmouse->name = "MX Mouse";			break;		case PS2PP_KIND_TP3:			psmouse->name = "TouchPad 3";			break;		default:			/*			 * Set name to "Mouse" only when using PS2++,			 * otherwise let other protocols define suitable			 * name			 */			if (using_ps2pp)				psmouse->name = "Mouse";			break;	}}/* * Logitech magic init. Detect whether the mouse is a Logitech one * and its exact model and try turning on extended protocol for ones * that support it. */int ps2pp_init(struct psmouse *psmouse, int set_properties){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[4];	unsigned char model, buttons;	struct ps2pp_info *model_info;	int use_ps2pp = 0;	param[0] = 0;	ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES);	ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);	ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);	ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE11);	param[1] = 0;	ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO);	if (!param[1])		return -1;	model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78);	buttons = param[1];	if ((model_info = get_model_info(model)) != NULL) {/* * Do Logitech PS2++ / PS2T++ magic init. */		if (model == 97) { /* Touch Pad 3 */			/* Unprotect RAM */			param[0] = 0x11; param[1] = 0x04; param[2] = 0x68;			ps2_command(ps2dev, param, 0x30d1);			/* Enable features */			param[0] = 0x11; param[1] = 0x05; param[2] = 0x0b;			ps2_command(ps2dev, param, 0x30d1);			/* Enable PS2++ */			param[0] = 0x11; param[1] = 0x09; param[2] = 0xc3;			ps2_command(ps2dev, param, 0x30d1);			param[0] = 0;			if (!ps2_command(ps2dev, param, 0x13d1) &&			    param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) {				use_ps2pp = 1;			}		} else {			param[0] = param[1] = param[2] = 0;			ps2pp_cmd(psmouse, param, 0x39); /* Magic knock */			ps2pp_cmd(psmouse, param, 0xDB);			if ((param[0] & 0x78) == 0x48 &&			    (param[1] & 0xf3) == 0xc2 &&			    (param[2] & 0x03) == ((param[1] >> 2) & 3)) {				ps2pp_set_smartscroll(psmouse, psmouse->smartscroll);				use_ps2pp = 1;			}		}	}	if (set_properties) {		psmouse->vendor = "Logitech";		psmouse->model = model;		if (use_ps2pp) {			psmouse->protocol_handler = ps2pp_process_byte;			psmouse->pktsize = 3;			if (model_info->kind != PS2PP_KIND_TP3) {				psmouse->set_resolution = ps2pp_set_resolution;				psmouse->disconnect = ps2pp_disconnect;				device_create_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll);			}		}		if (buttons < 3)			clear_bit(BTN_MIDDLE, psmouse->dev.keybit);		if (model_info)			ps2pp_set_model_properties(psmouse, model_info, use_ps2pp);	}	return use_ps2pp ? 0 : -1;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一级片| 欧美成人一级视频| bt欧美亚洲午夜电影天堂| 久久电影网站中文字幕| 青青草成人在线观看| 偷窥国产亚洲免费视频| 亚洲大尺度视频在线观看| 亚洲一区二区三区美女| 亚洲综合久久久久| 亚洲一区二区三区精品在线| 亚洲国产美女搞黄色| 亚洲国产综合91精品麻豆| 亚洲国产视频a| 视频一区二区中文字幕| 另类小说视频一区二区| 国内精品不卡在线| 成人毛片老司机大片| 91麻豆国产福利在线观看| 欧美三区免费完整视频在线观看| 日本精品一级二级| 欧美三级资源在线| 91精品国产手机| 精品成人私密视频| 国产欧美日韩一区二区三区在线观看| 国产欧美视频在线观看| 亚洲欧美日韩小说| 天堂午夜影视日韩欧美一区二区| 日本va欧美va欧美va精品| 国产一区在线视频| 成人成人成人在线视频| 欧美自拍偷拍一区| 日韩一级精品视频在线观看| 久久久天堂av| 亚洲欧洲精品天堂一级| 亚洲国产乱码最新视频| 麻豆91精品视频| 福利一区二区在线观看| 99久久精品国产毛片| 欧美日韩国产小视频| 欧美α欧美αv大片| 一色屋精品亚洲香蕉网站| 亚洲成a天堂v人片| 国产在线精品一区二区| 日本久久精品电影| 欧美成人一区二区| 中文字幕日韩一区二区| 麻豆精品视频在线| 99久久99久久综合| 91精品国产色综合久久ai换脸| 欧美精品一区二区三区在线| 亚洲欧美日韩一区二区| 久久99精品国产91久久来源| av激情成人网| 日韩三区在线观看| 亚洲女同一区二区| 国产综合色在线视频区| 在线观看免费视频综合| 国产日韩欧美在线一区| 亚洲成av人片观看| 成人性生交大片免费看中文网站| 欧美日韩免费观看一区三区| 久久九九99视频| 天天色图综合网| 91亚洲大成网污www| 欧美zozozo| 手机精品视频在线观看| 99久久久无码国产精品| 久久综合九色综合97婷婷女人 | 国产成人av网站| 91精品婷婷国产综合久久竹菊| 中文字幕成人在线观看| 男女男精品网站| 欧美性大战久久| 国产精品久久久久精k8| 国产真实乱对白精彩久久| 欧美人妇做爰xxxⅹ性高电影| 中文字幕在线播放不卡一区| 国产乱子伦一区二区三区国色天香| 欧美日韩三级一区| 亚洲人成伊人成综合网小说| 国产成人8x视频一区二区| 日韩欧美激情在线| 五月婷婷激情综合网| 色妹子一区二区| 中文字幕五月欧美| 成人免费福利片| 中文字幕国产一区| 国产一区 二区 三区一级| 日韩亚洲欧美在线| 三级欧美韩日大片在线看| 日本道色综合久久| 亚洲青青青在线视频| 成人h精品动漫一区二区三区| 26uuu另类欧美| 久久av中文字幕片| 日韩精品一区二区三区swag| 日本欧美在线观看| 欧美日韩国产中文| 婷婷国产在线综合| 欧美高清视频一二三区| 午夜电影一区二区三区| 久久免费的精品国产v∧| 99国产精品久久| 亚洲精品免费看| 91麻豆国产在线观看| 欧美激情在线观看视频免费| 狠狠色丁香婷婷综合久久片| 日韩欧美专区在线| 久久国产视频网| 久久综合九色综合欧美亚洲| 精品综合久久久久久8888| 精品国产乱码久久久久久牛牛| 久久精品99国产精品| 日韩欧美电影一二三| 精品一区二区在线视频| 久久一日本道色综合| 国产黄色精品视频| 亚洲成人免费影院| 欧美日韩综合不卡| 日本不卡1234视频| 久久久综合精品| 国产成人亚洲综合a∨婷婷| 国产午夜亚洲精品午夜鲁丝片| 国产成人av电影在线观看| 亚洲欧洲韩国日本视频| 欧美自拍偷拍午夜视频| 日本不卡一区二区| www亚洲一区| www.亚洲色图| 亚洲一区av在线| 日韩欧美国产一区二区在线播放 | 色老头久久综合| 五月天网站亚洲| 久久久午夜电影| 一本一本大道香蕉久在线精品| 亚洲r级在线视频| 精品精品国产高清一毛片一天堂| 福利一区二区在线| 亚洲午夜av在线| 精品国产一区二区三区久久久蜜月 | 亚洲国产精品一区二区久久| 日韩欧美专区在线| 成人午夜视频在线| 亚洲第一成人在线| 国产亚洲欧美色| 欧美亚洲禁片免费| 精品一区二区三区不卡| 亚洲欧洲日本在线| 日韩色视频在线观看| 不卡av在线免费观看| 日韩成人免费在线| 国产精品成人免费在线| 欧美男女性生活在线直播观看| 激情五月婷婷综合| 亚洲精品视频一区| 日韩欧美一级二级三级| 99国产精品视频免费观看| 日韩电影在线免费看| 中文字幕一区二区在线播放| 日韩一区二区免费电影| 色噜噜夜夜夜综合网| 国产乱国产乱300精品| 亚洲h动漫在线| 中文一区二区在线观看| 欧美精品色综合| 99国产精品国产精品毛片| 精品综合免费视频观看| 亚洲午夜一区二区| 欧美激情在线观看视频免费| 欧美zozozo| 欧美高清dvd| 色天使色偷偷av一区二区| 国产一区二区电影| 日本aⅴ免费视频一区二区三区| 亚洲视频一区二区在线观看| 26uuu国产电影一区二区| 91黄视频在线| 成人黄色一级视频| 狠狠色狠狠色合久久伊人| 亚洲电影欧美电影有声小说| 中文字幕一区二区三区在线播放| 欧美成人综合网站| 4438x亚洲最大成人网| 91高清视频免费看| 9l国产精品久久久久麻豆| 国产乱色国产精品免费视频| 亚洲成人免费观看| 一区二区欧美在线观看| 国产精品国产三级国产| 欧美激情在线观看视频免费| 久久综合av免费| 欧美成人性福生活免费看| 51精品视频一区二区三区| 欧美日韩aaaaa| 欧美精品一卡两卡| 欧亚洲嫩模精品一区三区| 91女神在线视频| 99re在线精品| 色综合天天综合狠狠| 97国产一区二区|