summaryrefslogtreecommitdiff
path: root/firmware/target/arm/olympus/mrobe-100/button-mr100.c
diff options
context:
space:
mode:
authorDominik Wenger <domonoky@googlemail.com>2008-06-27 20:19:27 +0000
committerDominik Wenger <domonoky@googlemail.com>2008-06-27 20:19:27 +0000
commit7135f2d9f45835a304701eb8d09255e9171651b2 (patch)
tree0994b2aa1a784b75e5363d30fd9552b164c3294c /firmware/target/arm/olympus/mrobe-100/button-mr100.c
parent22e7bf32b894acc1f9e2820e213f05a57bd4148c (diff)
downloadrockbox-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/mrobe-100/button-mr100.c')
-rw-r--r--firmware/target/arm/olympus/mrobe-100/button-mr100.c69
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
64static int syn_status = 0; 67static int syn_status = 0;
65 68
66static int syn_wait_clk_change(unsigned int val) 69static int syn_wait_clk_change(unsigned int val)
@@ -107,9 +110,9 @@ static void syn_wait_guest_flush(void)
107static void syn_flush(void) 110static 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