diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2004-07-29 09:08:35 +0000 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2004-07-29 09:08:35 +0000 | 
| commit | 560a2768ee675ed0abd685f062eef1eab58a304f (patch) | |
| tree | a78ce6c3bdc12cf18e357b7362966c266879d7f5 | |
| parent | a488cafcdbd15928f43cbe3096853b894a4cc63f (diff) | |
Add EPoX endian quirk for buggy keyboards
| -rw-r--r-- | hidd/sdp.c | 34 | 
1 files changed, 26 insertions, 8 deletions
| @@ -32,14 +32,6 @@  #include <stdio.h>  #include <errno.h> -#include <fcntl.h> -#include <unistd.h> -#include <stdlib.h> -#include <syslog.h> -#include <getopt.h> -#include <sys/time.h> -#include <sys/poll.h> -#include <sys/ioctl.h>  #include <sys/socket.h>  #include <bluetooth/bluetooth.h> @@ -49,6 +41,31 @@  #include "hidd.h" +static void epox_endian_quirk(unsigned char *data, int size) +{ +	/* USAGE_PAGE (Keyboard)	05 07 +	 * USAGE_MINIMUM (0)		19 00 +	 * USAGE_MAXIMUM (65280)	2A 00 FF   <= must be FF 00 +	 * LOGICAL_MINIMUM (0)		15 00 +	 * LOGICAL_MAXIMUM (65280)	26 00 FF   <= must be FF 00 +	 */ +	unsigned char pattern[] = { 0x05, 0x07, 0x19, 0x00, 0x2a, 0x00, 0xff, +						0x15, 0x00, 0x26, 0x00, 0xff }; +	int i; + +	if (!data) +		return; + +	for (i = 0; i < size - sizeof(pattern); i++) { +		if (!memcmp(data + i, pattern, sizeof(pattern))) { +			data[i + 5] = 0xff; +			data[i + 6] = 0x00; +			data[i + 10] = 0xff; +			data[i + 11] = 0x00; +		} +	} +} +  int get_hid_device_info(bdaddr_t *src, bdaddr_t *dst, struct hidp_connadd_req *req)  {  	uint32_t range = 0x0000ffff; @@ -140,6 +157,7 @@ int get_hid_device_info(bdaddr_t *src, bdaddr_t *dst, struct hidp_connadd_req *r  		if (req->rd_data) {  			memcpy(req->rd_data, (unsigned char *) pdlist->val.str, pdlist->unitSize);  			req->rd_size = pdlist->unitSize; +			epox_endian_quirk(req->rd_data, req->rd_size);  		}  	} | 
