diff options
author | Dominik Wenger <domonoky@googlemail.com> | 2008-06-27 20:19:27 +0000 |
---|---|---|
committer | Dominik Wenger <domonoky@googlemail.com> | 2008-06-27 20:19:27 +0000 |
commit | 7135f2d9f45835a304701eb8d09255e9171651b2 (patch) | |
tree | 0994b2aa1a784b75e5363d30fd9552b164c3294c /firmware/target/arm/olympus | |
parent | 22e7bf32b894acc1f9e2820e213f05a57bd4148c (diff) | |
download | rockbox-7135f2d9f45835a304701eb8d09255e9171651b2.tar.gz rockbox-7135f2d9f45835a304701eb8d09255e9171651b2.zip |
make mrobe100 touchstrip driver less sensitive by checking for the finger bit. Also little cleanup in driver.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17810 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/olympus')
-rw-r--r-- | firmware/target/arm/olympus/mrobe-100/button-mr100.c | 69 |
1 files changed, 46 insertions, 23 deletions
diff --git a/firmware/target/arm/olympus/mrobe-100/button-mr100.c b/firmware/target/arm/olympus/mrobe-100/button-mr100.c index cfb82b51ba..c2802a2f1f 100644 --- a/firmware/target/arm/olympus/mrobe-100/button-mr100.c +++ b/firmware/target/arm/olympus/mrobe-100/button-mr100.c | |||
@@ -61,6 +61,9 @@ static int int_btn = BUTTON_NONE; | |||
61 | #define BUTTONS_ID 0x9 | 61 | #define BUTTONS_ID 0x9 |
62 | #define ABSOLUTE_HEADER 0x0b | 62 | #define ABSOLUTE_HEADER 0x0b |
63 | 63 | ||
64 | #define MEP_READ 0x1 | ||
65 | #define MEP_WRITE 0x3 | ||
66 | |||
64 | static int syn_status = 0; | 67 | static int syn_status = 0; |
65 | 68 | ||
66 | static int syn_wait_clk_change(unsigned int val) | 69 | static int syn_wait_clk_change(unsigned int val) |
@@ -107,9 +110,9 @@ static void syn_wait_guest_flush(void) | |||
107 | static void syn_flush(void) | 110 | static void syn_flush(void) |
108 | { | 111 | { |
109 | int i; | 112 | int i; |
110 | 113 | #if defined(LOGF_ENABLE) | |
111 | logf("syn_flush..."); | 114 | logf("syn_flush..."); |
112 | 115 | #endif | |
113 | /* Flusher holds DATA low for at least 36 handshake cycles */ | 116 | /* Flusher holds DATA low for at least 36 handshake cycles */ |
114 | DATA_LO; | 117 | DATA_LO; |
115 | 118 | ||
@@ -134,9 +137,9 @@ static int syn_send_data(int *data, int len) | |||
134 | { | 137 | { |
135 | int i, bit; | 138 | int i, bit; |
136 | int parity = 0; | 139 | int parity = 0; |
137 | 140 | #if defined(LOGF_ENABLE) | |
138 | logf("syn_send_data..."); | 141 | logf("syn_send_data..."); |
139 | 142 | #endif | |
140 | /* 1. Lower DATA line to issue a request-to-send to guest */ | 143 | /* 1. Lower DATA line to issue a request-to-send to guest */ |
141 | DATA_LO; | 144 | DATA_LO; |
142 | 145 | ||
@@ -152,8 +155,9 @@ static int syn_send_data(int *data, int len) | |||
152 | /* 5. Send data */ | 155 | /* 5. Send data */ |
153 | for (i = 0; i < len; i++) | 156 | for (i = 0; i < len; i++) |
154 | { | 157 | { |
155 | logf(" sending byte: %d", data[i]); | 158 | #if defined(LOGF_ENABLE) |
156 | 159 | logf(" sending byte: %d", data[i]); | |
160 | #endif | ||
157 | bit = 0; | 161 | bit = 0; |
158 | while (bit < 8) | 162 | while (bit < 8) |
159 | { | 163 | { |
@@ -198,7 +202,9 @@ static int syn_send_data(int *data, int len) | |||
198 | parity should set DATA high. Parity is 1 if there's an odd | 202 | parity should set DATA high. Parity is 1 if there's an odd |
199 | number of '1' bits, or 0 if there's an even number of '1' bits. */ | 203 | number of '1' bits, or 0 if there's an even number of '1' bits. */ |
200 | parity = parity % 2; | 204 | parity = parity % 2; |
205 | #if defined(LOGF_ENABLE) | ||
201 | logf(" send parity = %d", parity); | 206 | logf(" send parity = %d", parity); |
207 | #endif | ||
202 | if (parity) | 208 | if (parity) |
203 | { | 209 | { |
204 | DATA_HI; | 210 | DATA_HI; |
@@ -227,7 +233,9 @@ static int syn_send_data(int *data, int len) | |||
227 | enter the flushee state. */ | 233 | enter the flushee state. */ |
228 | if (syn_get_data() == LO) | 234 | if (syn_get_data() == LO) |
229 | { | 235 | { |
236 | #if defined(LOGF_ENABLE) | ||
230 | logf(" module flushing"); | 237 | logf(" module flushing"); |
238 | #endif | ||
231 | syn_wait_guest_flush(); | 239 | syn_wait_guest_flush(); |
232 | return -1; | 240 | return -1; |
233 | } | 241 | } |
@@ -242,9 +250,9 @@ static int syn_read_data(int *data, int data_len) | |||
242 | { | 250 | { |
243 | int i, len, bit, parity, tmp; | 251 | int i, len, bit, parity, tmp; |
244 | int *data_ptr; | 252 | int *data_ptr; |
245 | 253 | #if defined(LOGF_ENABLE) | |
246 | logf("syn_read_data..."); | 254 | logf("syn_read_data..."); |
247 | 255 | #endif | |
248 | /* 1. Guest drives CLK low */ | 256 | /* 1. Guest drives CLK low */ |
249 | if (CLK != LO) | 257 | if (CLK != LO) |
250 | return 0; | 258 | return 0; |
@@ -325,7 +333,9 @@ static int syn_read_data(int *data, int data_len) | |||
325 | { | 333 | { |
326 | /* Packet length is bits 0:2 */ | 334 | /* Packet length is bits 0:2 */ |
327 | len = *data_ptr & 0x7; | 335 | len = *data_ptr & 0x7; |
336 | #if defined(LOGF_ENABLE) | ||
328 | logf(" packet length = %d", len); | 337 | logf(" packet length = %d", len); |
338 | #endif | ||
329 | } | 339 | } |
330 | else | 340 | else |
331 | { | 341 | { |
@@ -344,7 +354,9 @@ static int syn_read_data(int *data, int data_len) | |||
344 | 354 | ||
345 | /* 7c. The host verifies the parity bit is correct */ | 355 | /* 7c. The host verifies the parity bit is correct */ |
346 | parity = parity % 2; | 356 | parity = parity % 2; |
357 | #if defined(LOGF_ENABLE) | ||
347 | logf(" parity check: %d / %d", syn_get_data(), parity); | 358 | logf(" parity check: %d / %d", syn_get_data(), parity); |
359 | #endif | ||
348 | /* TODO: parity error handling */ | 360 | /* TODO: parity error handling */ |
349 | 361 | ||
350 | /* 7d. The host lowers ACK */ | 362 | /* 7d. The host lowers ACK */ |
@@ -398,9 +410,9 @@ static int syn_reset(void) | |||
398 | { | 410 | { |
399 | int val, id; | 411 | int val, id; |
400 | int data[2]; | 412 | int data[2]; |
401 | 413 | #if defined(LOGF_ENABLE) | |
402 | logf("syn_reset..."); | 414 | logf("syn_reset..."); |
403 | 415 | #endif | |
404 | /* reset module 0 */ | 416 | /* reset module 0 */ |
405 | val = (0 << 4) | (1 << 3) | 0; | 417 | val = (0 << 4) | (1 << 3) | 0; |
406 | syn_send_data(&val, 1); | 418 | syn_send_data(&val, 1); |
@@ -431,7 +443,7 @@ static void syn_info(void) | |||
431 | 443 | ||
432 | /* module base info */ | 444 | /* module base info */ |
433 | logf("module base info:"); | 445 | logf("module base info:"); |
434 | data[0] = (0 << 4) | (0 << 3) | 1; | 446 | data[0] = MEP_READ; |
435 | data[1] = 0x80; | 447 | data[1] = 0x80; |
436 | syn_send_data(data, 2); | 448 | syn_send_data(data, 2); |
437 | val = syn_read_device(data, 8); | 449 | val = syn_read_device(data, 8); |
@@ -443,7 +455,7 @@ static void syn_info(void) | |||
443 | 455 | ||
444 | /* module product info */ | 456 | /* module product info */ |
445 | logf("module product info:"); | 457 | logf("module product info:"); |
446 | data[0] = (0 << 4) | (0 << 3) | 1; | 458 | data[0] = MEP_READ; |
447 | data[1] = 0x81; | 459 | data[1] = 0x81; |
448 | syn_send_data(data, 2); | 460 | syn_send_data(data, 2); |
449 | val = syn_read_device(data, 8); | 461 | val = syn_read_device(data, 8); |
@@ -455,7 +467,7 @@ static void syn_info(void) | |||
455 | 467 | ||
456 | /* module serialization */ | 468 | /* module serialization */ |
457 | logf("module serialization:"); | 469 | logf("module serialization:"); |
458 | data[0] = (0 << 4) | (0 << 3) | 1; | 470 | data[0] = MEP_READ; |
459 | data[1] = 0x82; | 471 | data[1] = 0x82; |
460 | syn_send_data(data, 2); | 472 | syn_send_data(data, 2); |
461 | val = syn_read_device(data, 8); | 473 | val = syn_read_device(data, 8); |
@@ -467,7 +479,7 @@ static void syn_info(void) | |||
467 | 479 | ||
468 | /* 1-D sensor info */ | 480 | /* 1-D sensor info */ |
469 | logf("1-d sensor info:"); | 481 | logf("1-d sensor info:"); |
470 | data[0] = (0 << 4) | (0 << 3) | 1; | 482 | data[0] = MEP_READ; |
471 | data[1] = 0x80 + 0x20; | 483 | data[1] = 0x80 + 0x20; |
472 | syn_send_data(data, 2); | 484 | syn_send_data(data, 2); |
473 | val = syn_read_device(data, 8); | 485 | val = syn_read_device(data, 8); |
@@ -540,13 +552,13 @@ void button_int(void) | |||
540 | { | 552 | { |
541 | val = data[0] & 0xff; /* packet header */ | 553 | val = data[0] & 0xff; /* packet header */ |
542 | id = (data[1] >> 4) & 0xf; /* packet id */ | 554 | id = (data[1] >> 4) & 0xf; /* packet id */ |
543 | 555 | #if defined(LOGF_ENABLE) | |
544 | logf("button_read_device..."); | 556 | logf("button_read_device..."); |
545 | logf(" data[0] = 0x%08x", data[0]); | 557 | logf(" data[0] = 0x%08x", data[0]); |
546 | logf(" data[1] = 0x%08x", data[1]); | 558 | logf(" data[1] = 0x%08x", data[1]); |
547 | logf(" data[2] = 0x%08x", data[2]); | 559 | logf(" data[2] = 0x%08x", data[2]); |
548 | logf(" data[3] = 0x%08x", data[3]); | 560 | logf(" data[3] = 0x%08x", data[3]); |
549 | 561 | #endif | |
550 | if ((val == BUTTONS_HEADER) && (id == BUTTONS_ID)) | 562 | if ((val == BUTTONS_HEADER) && (id == BUTTONS_ID)) |
551 | { | 563 | { |
552 | /* Buttons packet - touched one of the 5 "buttons" */ | 564 | /* Buttons packet - touched one of the 5 "buttons" */ |
@@ -563,20 +575,31 @@ void button_int(void) | |||
563 | 575 | ||
564 | /* An Absolute packet should follow which we ignore */ | 576 | /* An Absolute packet should follow which we ignore */ |
565 | val = syn_read_device(data, 4); | 577 | val = syn_read_device(data, 4); |
566 | 578 | #if defined(LOGF_ENABLE) | |
567 | logf(" int_btn = 0x%04x", int_btn); | 579 | logf(" int_btn = 0x%04x", int_btn); |
580 | #endif | ||
568 | } | 581 | } |
569 | else if (val == ABSOLUTE_HEADER) | 582 | else if (val == ABSOLUTE_HEADER) |
570 | { | 583 | { |
571 | /* Absolute packet - the finger is on the vertical strip. | 584 | /* Absolute packet - the finger is on the vertical strip. |
572 | Position ranges from 1-4095, with 1 at the bottom. */ | 585 | Position ranges from 1-4095, with 1 at the bottom. */ |
573 | val = ((data[1] >> 4) << 8) | data[2]; /* position */ | 586 | val = ((data[1] >> 4) << 8) | data[2]; /* position */ |
574 | if ((val > 0) && (val <= 1365)) | 587 | #if defined(LOGF_ENABLE) |
575 | int_btn |= BUTTON_DOWN; | 588 | logf(" pos %d", val); |
576 | else if ((val > 1365) && (val <= 2730)) | 589 | logf(" z %d", data[3]); |
577 | int_btn |= BUTTON_SELECT; | 590 | logf(" finger %d", data[1] & 0x1); |
578 | else if ((val > 2730) && (val <= 4095)) | 591 | logf(" gesture %d", data[1] & 0x2); |
579 | int_btn |= BUTTON_UP; | 592 | logf(" RelPosVld %d", data[1] & 0x4); |
593 | #endif | ||
594 | if(data[1] & 0x1) /* if finger on touch strip */ | ||
595 | { | ||
596 | if ((val > 0) && (val <= 1365)) | ||
597 | int_btn |= BUTTON_DOWN; | ||
598 | else if ((val > 1365) && (val <= 2730)) | ||
599 | int_btn |= BUTTON_SELECT; | ||
600 | else if ((val > 2730) && (val <= 4095)) | ||
601 | int_btn |= BUTTON_UP; | ||
602 | } | ||
580 | } | 603 | } |
581 | } | 604 | } |
582 | 605 | ||