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

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

?? alps.c

?? h內(nèi)核
?? C
字號(hào):
/* * ALPS touchpad PS/2 mouse driver * * Copyright (c) 2003 Neil Brown <neilb@cse.unsw.edu.au> * Copyright (c) 2003 Peter Osterlund <petero2@telia.com> * Copyright (c) 2004 Dmitry Torokhov <dtor@mail.ru> * * ALPS detection, tap switching and status querying info is taken from * tpconfig utility (by C. Scott Ananian and Bruce Kall). * * 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 "alps.h"#undef DEBUG#ifdef DEBUG#define dbg(format, arg...) printk(KERN_INFO "alps.c: " format "\n", ## arg)#else#define dbg(format, arg...) do {} while (0)#endif#define ALPS_MODEL_GLIDEPOINT	1#define ALPS_MODEL_DUALPOINT	2struct alps_model_info {	unsigned char signature[3];	unsigned char model;} alps_model_data[] = {/*	{ { 0x33, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },	*/	{ { 0x53, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },	{ { 0x53, 0x02, 0x14 },	ALPS_MODEL_GLIDEPOINT },	{ { 0x63, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },	{ { 0x63, 0x02, 0x14 },	ALPS_MODEL_GLIDEPOINT },	{ { 0x73, 0x02, 0x0a },	ALPS_MODEL_GLIDEPOINT },	{ { 0x73, 0x02, 0x14 },	ALPS_MODEL_GLIDEPOINT },	{ { 0x63, 0x02, 0x28 },	ALPS_MODEL_GLIDEPOINT },/*	{ { 0x63, 0x02, 0x3c },	ALPS_MODEL_GLIDEPOINT },	*//*	{ { 0x63, 0x02, 0x50 },	ALPS_MODEL_GLIDEPOINT },	*/	{ { 0x63, 0x02, 0x64 },	ALPS_MODEL_GLIDEPOINT },	{ { 0x20, 0x02, 0x0e },	ALPS_MODEL_DUALPOINT },	{ { 0x22, 0x02, 0x0a },	ALPS_MODEL_DUALPOINT },	{ { 0x22, 0x02, 0x14 }, ALPS_MODEL_DUALPOINT },	{ { 0x63, 0x03, 0xc8 },	ALPS_MODEL_DUALPOINT },};/* * ALPS abolute Mode * byte 0:  1    1    1    1    1  mid0 rig0 lef0 * byte 1:  0   x6   x5   x4   x3   x2   x1   x0 * byte 2:  0   x10  x9   x8   x7  up1  fin  ges * byte 3:  0   y9   y8   y7    1  mid1 rig1 lef1 * byte 4:  0   y6   y5   y4   y3   y2   y1   y0 * byte 5:  0   z6   z5   z4   z3   z2   z1   z0 * * On a dualpoint, {mid,rig,lef}0 are the stick, 1 are the pad. * We just 'or' them together for now. * * We used to send 'ges'tures as BTN_TOUCH but this made it impossible * to disable tap events in the synaptics driver since the driver * was unable to distinguish a gesture tap from an actual button click. * A tap gesture now creates an emulated touch that the synaptics * driver can interpret as a tap event, if MaxTapTime=0 and * MaxTapMove=0 then the driver will ignore taps. * * The touchpad on an 'Acer Aspire' has 4 buttons: *   left,right,up,down. * This device always sets {mid,rig,lef}0 to 1 and * reflects left,right,down,up in lef1,rig1,mid1,up1. */static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs){	unsigned char *packet = psmouse->packet;	struct input_dev *dev = &psmouse->dev;	int x, y, z;	int left = 0, right = 0, middle = 0;	input_regs(dev, regs);	if ((packet[0] & 0xc8) == 0x08) {   /* 3-byte PS/2 packet */		x = packet[1];		if (packet[0] & 0x10)			x = x - 256;		y = packet[2];		if (packet[0] & 0x20)			y = y - 256;		left  = (packet[0]     ) & 1;		right = (packet[0] >> 1) & 1;		input_report_rel(dev, REL_X, x);		input_report_rel(dev, REL_Y, -y);		input_report_key(dev, BTN_A, left);		input_report_key(dev, BTN_B, right);		input_sync(dev);		return;	}	x = (packet[1] & 0x7f) | ((packet[2] & 0x78)<<(7-3));	y = (packet[4] & 0x7f) | ((packet[3] & 0x70)<<(7-4));	z = packet[5];	if (z == 127) {	/* DualPoint stick is relative, not absolute */		if (x > 383)			x = x - 768;		if (y > 255)			y = y - 512;		left  = packet[3] & 1;		right = (packet[3] >> 1) & 1;		input_report_rel(dev, REL_X, x);		input_report_rel(dev, REL_Y, -y);		input_report_key(dev, BTN_LEFT, left);		input_report_key(dev, BTN_RIGHT, right);		input_sync(dev);		return;	}	if (z > 30) input_report_key(dev, BTN_TOUCH, 1);	if (z < 25) input_report_key(dev, BTN_TOUCH, 0);	if (z > 0) {		input_report_abs(dev, ABS_X, x);		input_report_abs(dev, ABS_Y, y);	}	input_report_abs(dev, ABS_PRESSURE, z);	input_report_key(dev, BTN_TOOL_FINGER, z > 0);	left  |= (packet[2]     ) & 1;	left  |= (packet[3]     ) & 1;	right |= (packet[3] >> 1) & 1;	if (packet[0] == 0xff) {		int back    = (packet[3] >> 2) & 1;		int forward = (packet[2] >> 2) & 1;		if (back && forward) {			middle = 1;			back = 0;			forward = 0;		}		input_report_key(dev, BTN_BACK,    back);		input_report_key(dev, BTN_FORWARD, forward);	} else {		left   |= (packet[0]     ) & 1;		right  |= (packet[0] >> 1) & 1;		middle |= (packet[0] >> 2) & 1;		middle |= (packet[3] >> 2) & 1;	}	input_report_key(dev, BTN_LEFT, left);	input_report_key(dev, BTN_RIGHT, right);	input_report_key(dev, BTN_MIDDLE, middle);	input_sync(dev);}static psmouse_ret_t alps_process_byte(struct psmouse *psmouse, struct pt_regs *regs){	if ((psmouse->packet[0] & 0xc8) == 0x08) { /* PS/2 packet */		if (psmouse->pktcnt == 3) {			alps_process_packet(psmouse, regs);			return PSMOUSE_FULL_PACKET;		}		return PSMOUSE_GOOD_DATA;	}	/* ALPS absolute mode packets start with 0b11111mrl */	if ((psmouse->packet[0] & 0xf8) != 0xf8)		return PSMOUSE_BAD_DATA;	/* Bytes 2 - 6 should have 0 in the highest bit */	if (psmouse->pktcnt >= 2 && psmouse->pktcnt <= 6 &&	    (psmouse->packet[psmouse->pktcnt-1] & 0x80))		return PSMOUSE_BAD_DATA;	if (psmouse->pktcnt == 6) {		alps_process_packet(psmouse, regs);		return PSMOUSE_FULL_PACKET;	}	return PSMOUSE_GOOD_DATA;}int alps_get_model(struct psmouse *psmouse){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[4];	int i;	/*	 * First try "E6 report".	 * ALPS should return 0x00,0x00,0x0a or 0x00,0x00,0x64	 */	param[0] = 0;	if (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))		return -1;	param[0] = param[1] = param[2] = 0xff;	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))		return -1;	dbg("E6 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);	if (param[0] != 0x00 || param[1] != 0x00 || (param[2] != 0x0a && param[2] != 0x64))		return -1;	/* Now try "E7 report". ALPS should return 0x33 in byte 1 */	param[0] = 0;	if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES) ||	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE21) ||	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE21) ||	    ps2_command(ps2dev,  NULL, PSMOUSE_CMD_SETSCALE21))		return -1;	param[0] = param[1] = param[2] = 0xff;	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))		return -1;	dbg("E7 report: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);	for (i = 0; i < ARRAY_SIZE(alps_model_data); i++)		if (!memcmp(param, alps_model_data[i].signature, sizeof(alps_model_data[i].signature)))			return alps_model_data[i].model;	return -1;}/* * For DualPoint devices select the device that should respond to * subsequent commands. It looks like glidepad is behind stickpointer, * I'd thought it would be other way around... */static int alps_passthrough_mode(struct psmouse *psmouse, int enable){	struct ps2dev *ps2dev = &psmouse->ps2dev;	unsigned char param[3];	int cmd = enable ? PSMOUSE_CMD_SETSCALE21 : PSMOUSE_CMD_SETSCALE11;	if (ps2_command(ps2dev, NULL, cmd) ||	    ps2_command(ps2dev, NULL, cmd) ||	    ps2_command(ps2dev, NULL, cmd) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE))		return -1;	/* we may get 3 more bytes, just ignore them */	ps2_command(ps2dev, param, 0x0300);	return 0;}static int alps_absolute_mode(struct psmouse *psmouse){	struct ps2dev *ps2dev = &psmouse->ps2dev;	/* Try ALPS magic knock - 4 disable before enable */	if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE))		return -1;	/*	 * Switch mouse to poll (remote) mode so motion data will not	 * get in our way	 */	return ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETPOLL);}static int alps_get_status(struct psmouse *psmouse, char *param){	struct ps2dev *ps2dev = &psmouse->ps2dev;	/* Get status: 0xF5 0xF5 0xF5 0xE9 */	if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO))		return -1;	dbg("Status: %2.2x %2.2x %2.2x", param[0], param[1], param[2]);	return 0;}/* * Turn touchpad tapping on or off. The sequences are: * 0xE9 0xF5 0xF5 0xF3 0x0A to enable, * 0xE9 0xF5 0xF5 0xE8 0x00 to disable. * My guess that 0xE9 (GetInfo) is here as a sync point. * For models that also have stickpointer (DualPoints) its tapping * is controlled separately (0xE6 0xE6 0xE6 0xF3 0x14|0x0A) but * we don't fiddle with it. */static int alps_tap_mode(struct psmouse *psmouse, int enable){	struct ps2dev *ps2dev = &psmouse->ps2dev;	int cmd = enable ? PSMOUSE_CMD_SETRATE : PSMOUSE_CMD_SETRES;	unsigned char tap_arg = enable ? 0x0A : 0x00;	unsigned char param[4];	if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) ||	    ps2_command(ps2dev, &tap_arg, cmd))		return -1;	if (alps_get_status(psmouse, param))		return -1;	return 0;}static int alps_reconnect(struct psmouse *psmouse){	int model;	unsigned char param[4];	if ((model = alps_get_model(psmouse)) < 0)		return -1;	if (model == ALPS_MODEL_DUALPOINT && alps_passthrough_mode(psmouse, 1))		return -1;	if (alps_get_status(psmouse, param))		return -1;	if (param[0] & 0x04)		alps_tap_mode(psmouse, 0);	if (alps_absolute_mode(psmouse)) {		printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");		return -1;	}	if (model == ALPS_MODEL_DUALPOINT && alps_passthrough_mode(psmouse, 0))		return -1;	return 0;}static void alps_disconnect(struct psmouse *psmouse){	psmouse_reset(psmouse);}int alps_init(struct psmouse *psmouse){	unsigned char param[4];	int model;	if ((model = alps_get_model(psmouse)) < 0)		return -1;	printk(KERN_INFO "ALPS Touchpad (%s) detected\n",		model == ALPS_MODEL_GLIDEPOINT ? "Glidepoint" : "Dualpoint");	if (model == ALPS_MODEL_DUALPOINT && alps_passthrough_mode(psmouse, 1))		return -1;	if (alps_get_status(psmouse, param)) {		printk(KERN_ERR "alps.c: touchpad status report request failed\n");		return -1;	}	if (param[0] & 0x04) {		printk(KERN_INFO "  Disabling hardware tapping\n");		if (alps_tap_mode(psmouse, 0))			printk(KERN_WARNING "alps.c: Failed to disable hardware tapping\n");	}	if (alps_absolute_mode(psmouse)) {		printk(KERN_ERR "alps.c: Failed to enable absolute mode\n");		return -1;	}	if (model == ALPS_MODEL_DUALPOINT && alps_passthrough_mode(psmouse, 0))		return -1;	psmouse->dev.evbit[LONG(EV_REL)] |= BIT(EV_REL);	psmouse->dev.relbit[LONG(REL_X)] |= BIT(REL_X);	psmouse->dev.relbit[LONG(REL_Y)] |= BIT(REL_Y);	psmouse->dev.keybit[LONG(BTN_A)] |= BIT(BTN_A);	psmouse->dev.keybit[LONG(BTN_B)] |= BIT(BTN_B);	psmouse->dev.evbit[LONG(EV_ABS)] |= BIT(EV_ABS);	input_set_abs_params(&psmouse->dev, ABS_X, 0, 1023, 0, 0);	input_set_abs_params(&psmouse->dev, ABS_Y, 0, 1023, 0, 0);	input_set_abs_params(&psmouse->dev, ABS_PRESSURE, 0, 127, 0, 0);	psmouse->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH);	psmouse->dev.keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER);	psmouse->dev.keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD);	psmouse->dev.keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK);	psmouse->protocol_handler = alps_process_byte;	psmouse->disconnect = alps_disconnect;	psmouse->reconnect = alps_reconnect;	psmouse->pktsize = 6;	return 0;}int alps_detect(struct psmouse *psmouse, int set_properties){	if (alps_get_model(psmouse) < 0)		return -1;	if (set_properties) {		psmouse->vendor = "ALPS";		psmouse->name = "TouchPad";	}	return 0;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区视频在线看| 午夜伊人狠狠久久| 欧美精品色一区二区三区| 久热成人在线视频| 一区二区三区蜜桃| 久久久蜜桃精品| 91精品一区二区三区在线观看| 国产99一区视频免费| 视频在线观看一区| 伊人开心综合网| 国产日韩欧美亚洲| 欧美一级欧美一级在线播放| kk眼镜猥琐国模调教系列一区二区| 日韩成人一区二区三区在线观看| 亚洲免费在线观看视频| 中文字幕av一区 二区| 日韩三区在线观看| 欧美日韩精品一区二区三区| 97精品超碰一区二区三区| 国产一区二区不卡在线| 日本免费新一区视频| 亚洲高清一区二区三区| 综合激情成人伊人| 日本一区二区不卡视频| 精品久久久久久久人人人人传媒| 欧美色图在线观看| 在线观看欧美黄色| 色狠狠一区二区三区香蕉| 成人美女在线观看| 国产黄色成人av| 国产呦萝稀缺另类资源| 精品一区二区影视| 激情五月婷婷综合| 麻豆国产精品视频| 看电视剧不卡顿的网站| 日韩中文字幕亚洲一区二区va在线| 一区二区三区四区高清精品免费观看| 亚洲手机成人高清视频| 亚洲日本一区二区三区| ...av二区三区久久精品| 国产亚洲精品7777| 中文字幕av一区 二区| 国产欧美精品区一区二区三区| 久久午夜电影网| 国产日韩一级二级三级| 日本一区二区成人| 亚洲视频资源在线| 亚洲欧美日韩国产手机在线| 亚洲日本丝袜连裤袜办公室| 亚洲丝袜另类动漫二区| 亚洲综合一区二区| 午夜电影久久久| 免费国产亚洲视频| 精品伊人久久久久7777人| 国产在线一区二区| av高清不卡在线| 在线观看日韩一区| 91精品国产综合久久久久久| 欧美成人福利视频| 国产日产欧美精品一区二区三区| 国产精品女人毛片| 亚洲一区二区不卡免费| 日韩影院在线观看| 国产精品一区二区久久精品爱涩 | 国产精品丝袜黑色高跟| 中文字幕亚洲一区二区av在线| 亚洲欧美日韩中文播放 | 三级成人在线视频| 久久国产精品色| 成人污污视频在线观看| 99re视频精品| 678五月天丁香亚洲综合网| 精品国产免费人成电影在线观看四季| 欧美国产欧美综合| 中文字幕一区二区日韩精品绯色| 亚洲精品亚洲人成人网在线播放| 婷婷激情综合网| 成人性生交大片免费看视频在线| 91小宝寻花一区二区三区| 欧美美女视频在线观看| 国产欧美一区视频| 亚洲成人综合视频| 国产成人精品1024| 欧美精品在线一区二区| 欧美精品一区二区三区高清aⅴ| 中文字幕在线一区免费| 日本欧美加勒比视频| 99麻豆久久久国产精品免费| 91麻豆精品91久久久久同性| 国产精品美女久久久久aⅴ| 手机精品视频在线观看| 菠萝蜜视频在线观看一区| 欧美日韩国产三级| 国产精品沙发午睡系列990531| 成人av一区二区三区| 制服丝袜激情欧洲亚洲| 国产视频亚洲色图| 免费观看久久久4p| 日本久久电影网| 久久久午夜电影| 日韩国产在线观看| 色吧成人激情小说| 久久久久久久综合狠狠综合| 亚洲第一成年网| 91理论电影在线观看| 久久精品一区二区三区不卡| 日韩高清国产一区在线| 一本久道久久综合中文字幕| 久久久国产精品午夜一区ai换脸| 天堂久久久久va久久久久| 一本色道**综合亚洲精品蜜桃冫| 久久久另类综合| 日韩高清一区二区| 欧美日韩精品系列| 亚洲裸体xxx| av毛片久久久久**hd| 久久久影视传媒| 激情综合色播激情啊| 欧美一区二区三区小说| 午夜私人影院久久久久| 欧美最猛性xxxxx直播| 亚洲免费观看高清完整版在线观看| 国产a区久久久| 国产午夜精品一区二区三区视频| 蜜臀久久久久久久| 欧美一区二区三区视频免费| 香蕉成人伊视频在线观看| 色噜噜久久综合| 一区二区三区欧美| 色婷婷亚洲综合| 亚洲欧美国产77777| 99国产精品99久久久久久| 中文字幕在线不卡视频| 菠萝蜜视频在线观看一区| 欧美国产亚洲另类动漫| 久久精品视频网| 国模冰冰炮一区二区| 久久午夜国产精品| 国产成人99久久亚洲综合精品| 久久久久久影视| 国产福利不卡视频| 国产精品午夜久久| 91污片在线观看| 亚洲欧美偷拍卡通变态| 91官网在线免费观看| 亚洲午夜视频在线观看| 欧美福利电影网| 久久国产尿小便嘘嘘尿| 久久久美女艺术照精彩视频福利播放| 国产福利一区在线| 亚洲欧洲美洲综合色网| 色香蕉久久蜜桃| 日韩精品电影在线观看| 日韩片之四级片| 国产suv精品一区二区6| 亚洲特级片在线| 欧美色涩在线第一页| 麻豆精品视频在线观看视频| 久久亚洲精华国产精华液 | 国产精品自在在线| 中文字幕精品三区| 在线亚洲+欧美+日本专区| 亚洲国产你懂的| 精品sm捆绑视频| 成+人+亚洲+综合天堂| 亚洲在线观看免费视频| 欧美一区二区久久| 亚洲精品在线观| av不卡免费电影| 天天综合网 天天综合色| 欧美tk丨vk视频| 97精品电影院| 久久丁香综合五月国产三级网站| 国产欧美一区二区精品婷婷| 色综合久久天天| 精品综合免费视频观看| 国产精品成人网| 日韩精品最新网址| 91社区在线播放| 久久精品国产99| 亚洲欧美在线另类| 欧美不卡在线视频| 91黄色免费观看| 久久97超碰色| 亚洲一二三级电影| 国产精品网友自拍| 日韩一区二区精品葵司在线| 99国产精品视频免费观看| 男男视频亚洲欧美| 亚洲欧洲三级电影| 日韩欧美一级片| 欧美午夜影院一区| 懂色av中文字幕一区二区三区| 丝袜脚交一区二区| 亚洲欧美日韩国产综合| 久久午夜色播影院免费高清| 欧美视频三区在线播放| 成人h版在线观看| 精品一区二区久久| 丝袜亚洲另类欧美|