aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/input/keyboard/mp900_kbd.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/input/keyboard/mp900_kbd.c b/drivers/input/keyboard/mp900_kbd.c
index 337ec3bbf810de..7a714368f1fff1 100644
--- a/drivers/input/keyboard/mp900_kbd.c
+++ b/drivers/input/keyboard/mp900_kbd.c
@@ -139,15 +139,16 @@ static int keydown=0;
static void mp900_kb_decode(char cur_buffer[], int packet_length)
{
int i, j, ff, keycount=0;
+ int length=packet_length;
unsigned char keys_buffer[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static unsigned char last_buffer[32] = {0x13, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0};
-
- if (packet_length == 14) {
+
+ if ((packet_length == 14) || (packet_length == 10)) {
ff = 0;
- for (i=1; i < 14; i++) {
+ for (i=1; i < length; i++) {
keys_buffer[keycount] = cur_buffer[i] ^ last_buffer[i];
if (cur_buffer[i] == 0xff)
ff++;
@@ -177,7 +178,7 @@ static void mp900_kb_decode(char cur_buffer[], int packet_length)
}
if (keycount) {
- for (i=1;i<14;i++) {
+ for (i=1; i<length; i++) {
last_buffer[i] = cur_buffer[i];
}
}
@@ -310,12 +311,19 @@ static irqreturn_t mp900_kb_interrupt(int irq,void *dev_id)
}
break;
-// case 10:
-// printk(KERN_ERR "btuart : Package size 10\n");
-// printk(KERN_ERR "btuart_log : %s\n", packet_buffer);
-// break;
+ case 10: /* Axim X30 reports its special keys here */
+ printk(KERN_ERR "btuart : received unsupported packetsize of %d with packet_buffer[0]=%x\n", i, packet_buffer[0]);
+ mp900_kb_decode(packet_buffer, i);
+
+ if (keydown) {
+ if (exiting == 0) {
+ schedule_delayed_work(&mp900_kb_work, 2);
+ }
+ }
+
+ break;
- case 14:
+ case 14: /* Nec Mobilepro 900/c reports keys here */
if (packet_buffer[0] == 0x13) { /* Keyboard poll packet */
mp900_kb_decode(packet_buffer, i);
@@ -328,10 +336,9 @@ static irqreturn_t mp900_kb_interrupt(int irq,void *dev_id)
}
}
break;
-// case 15:
-// printk(KERN_ERR "btuart : Package size 15\n");
-// printk(KERN_ERR "btuart_log : %s\n", packet_buffer);
-// break;
+ case 15:
+ printk(KERN_ERR "btuart : received unsupported packetsize of %d with packet_buffer[0]=%x\n", i, packet_buffer[0]);
+ break;
default:
/* make sure ts is clear to transmit */
@@ -343,7 +350,7 @@ static irqreturn_t mp900_kb_interrupt(int irq,void *dev_id)
2);
}
} else {
- printk(KERN_ERR "unhandled size of package (size=%d) with [0]=%x\n", i, packet_buffer[0]);
+ printk(KERN_ERR "btuart : received unsupported paketsize of %d with packet_buffer[0]=%x\n", i, packet_buffer[0]);
}
break;
}