summaryrefslogtreecommitdiff
path: root/firmware/drivers/synaptics-mep.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/synaptics-mep.c')
-rw-r--r--firmware/drivers/synaptics-mep.c66
1 files changed, 51 insertions, 15 deletions
diff --git a/firmware/drivers/synaptics-mep.c b/firmware/drivers/synaptics-mep.c
index 858edf54fe..a14e875cc1 100644
--- a/firmware/drivers/synaptics-mep.c
+++ b/firmware/drivers/synaptics-mep.c
@@ -33,6 +33,9 @@
33 Protocol: 3-Wire Interface Specification" documentation */ 33 Protocol: 3-Wire Interface Specification" documentation */
34 34
35#if defined(MROBE_100) 35#if defined(MROBE_100)
36#define INT_ENABLE GPIOD_INT_LEV &= ~0x2; GPIOD_INT_EN |= 0x2
37#define INT_DISABLE GPIOD_INT_EN &= ~0x2; GPIOD_INT_CLR |= 0x2
38
36#define ACK (GPIOD_INPUT_VAL & 0x1) 39#define ACK (GPIOD_INPUT_VAL & 0x1)
37#define ACK_HI GPIOD_OUTPUT_VAL |= 0x1 40#define ACK_HI GPIOD_OUTPUT_VAL |= 0x1
38#define ACK_LO GPIOD_OUTPUT_VAL &= ~0x1 41#define ACK_LO GPIOD_OUTPUT_VAL &= ~0x1
@@ -47,6 +50,9 @@
47#define DATA_CL GPIOD_OUTPUT_EN &= ~0x4 50#define DATA_CL GPIOD_OUTPUT_EN &= ~0x4
48 51
49#elif defined(PHILIPS_HDD1630) 52#elif defined(PHILIPS_HDD1630)
53#define INT_ENABLE GPIOA_INT_LEV &= ~0x20; GPIOA_INT_EN |= 0x20
54#define INT_DISABLE GPIOA_INT_EN &= ~0x20; GPIOA_INT_CLR |= 0x20
55
50#define ACK (GPIOD_INPUT_VAL & 0x80) 56#define ACK (GPIOD_INPUT_VAL & 0x80)
51#define ACK_HI GPIOD_OUTPUT_VAL |= 0x80 57#define ACK_HI GPIOD_OUTPUT_VAL |= 0x80
52#define ACK_LO GPIOD_OUTPUT_VAL &= ~0x80 58#define ACK_LO GPIOD_OUTPUT_VAL &= ~0x80
@@ -73,6 +79,8 @@
73#define MEP_READ 0x1 79#define MEP_READ 0x1
74#define MEP_WRITE 0x3 80#define MEP_WRITE 0x3
75 81
82static unsigned short syn_status = 0;
83
76static int syn_wait_clk_change(unsigned int val) 84static int syn_wait_clk_change(unsigned int val)
77{ 85{
78 int i; 86 int i;
@@ -140,12 +148,12 @@ static void syn_flush(void)
140 syn_wait_guest_flush(); 148 syn_wait_guest_flush();
141} 149}
142 150
143static int syn_send_data(int *data, int len) 151int syn_send(int *data, int len)
144{ 152{
145 int i, bit; 153 int i, bit;
146 int parity = 0; 154 int parity = 0;
147 155
148 logf("syn_send_data..."); 156 logf("syn_send...");
149 157
150 /* 1. Lower DATA line to issue a request-to-send to guest */ 158 /* 1. Lower DATA line to issue a request-to-send to guest */
151 DATA_LO; 159 DATA_LO;
@@ -380,7 +388,7 @@ static int syn_read_data(int *data, int data_len)
380 return len; 388 return len;
381} 389}
382 390
383int syn_read_device(int *data, int len) 391int syn_read(int *data, int len)
384{ 392{
385 int i; 393 int i;
386 int ret = READ_ERROR; 394 int ret = READ_ERROR;
@@ -406,7 +414,7 @@ int syn_read_device(int *data, int len)
406 return ret; 414 return ret;
407} 415}
408 416
409static int syn_reset(void) 417int syn_reset(void)
410{ 418{
411 int val, id; 419 int val, id;
412 int data[2]; 420 int data[2];
@@ -415,9 +423,9 @@ static int syn_reset(void)
415 423
416 /* reset module 0 */ 424 /* reset module 0 */
417 val = (0 << 4) | (1 << 3) | 0; 425 val = (0 << 4) | (1 << 3) | 0;
418 syn_send_data(&val, 1); 426 syn_send(&val, 1);
419 427
420 val = syn_read_device(data, 2); 428 val = syn_read(data, 2);
421 if (val == 1) 429 if (val == 1)
422 { 430 {
423 val = data[0] & 0xff; /* packet header */ 431 val = data[0] & 0xff; /* packet header */
@@ -436,7 +444,35 @@ static int syn_reset(void)
436int syn_init(void) 444int syn_init(void)
437{ 445{
438 syn_flush(); 446 syn_flush();
439 return syn_reset(); 447 syn_status = syn_reset();
448
449 if (syn_status)
450 {
451 INT_DISABLE;
452 INT_ENABLE;
453
454 CPU_INT_EN |= HI_MASK;
455 CPU_HI_INT_EN |= GPIO0_MASK;
456 }
457
458 return syn_status;
459}
460
461int syn_get_status(void)
462{
463 return syn_status;
464}
465
466void syn_int_enable(bool enable)
467{
468 if (enable)
469 {
470 INT_ENABLE;
471 }
472 else
473 {
474 INT_DISABLE;
475 }
440} 476}
441 477
442#ifdef ROCKBOX_HAS_LOGF 478#ifdef ROCKBOX_HAS_LOGF
@@ -451,8 +487,8 @@ void syn_info(void)
451 logf("module base info:"); 487 logf("module base info:");
452 data[0] = MEP_READ; 488 data[0] = MEP_READ;
453 data[1] = 0x80; 489 data[1] = 0x80;
454 syn_send_data(data, 2); 490 syn_send(data, 2);
455 val = syn_read_device(data, 8); 491 val = syn_read(data, 8);
456 if (val > 0) 492 if (val > 0)
457 { 493 {
458 for (i = 0; i < 8; i++) 494 for (i = 0; i < 8; i++)
@@ -463,8 +499,8 @@ void syn_info(void)
463 logf("module product info:"); 499 logf("module product info:");
464 data[0] = MEP_READ; 500 data[0] = MEP_READ;
465 data[1] = 0x81; 501 data[1] = 0x81;
466 syn_send_data(data, 2); 502 syn_send(data, 2);
467 val = syn_read_device(data, 8); 503 val = syn_read(data, 8);
468 if (val > 0) 504 if (val > 0)
469 { 505 {
470 for (i = 0; i < 8; i++) 506 for (i = 0; i < 8; i++)
@@ -475,8 +511,8 @@ void syn_info(void)
475 logf("module serialization:"); 511 logf("module serialization:");
476 data[0] = MEP_READ; 512 data[0] = MEP_READ;
477 data[1] = 0x82; 513 data[1] = 0x82;
478 syn_send_data(data, 2); 514 syn_send(data, 2);
479 val = syn_read_device(data, 8); 515 val = syn_read(data, 8);
480 if (val > 0) 516 if (val > 0)
481 { 517 {
482 for (i = 0; i < 8; i++) 518 for (i = 0; i < 8; i++)
@@ -487,8 +523,8 @@ void syn_info(void)
487 logf("1-d sensor info:"); 523 logf("1-d sensor info:");
488 data[0] = MEP_READ; 524 data[0] = MEP_READ;
489 data[1] = 0x80 + 0x20; 525 data[1] = 0x80 + 0x20;
490 syn_send_data(data, 2); 526 syn_send(data, 2);
491 val = syn_read_device(data, 8); 527 val = syn_read(data, 8);
492 if (val > 0) 528 if (val > 0)
493 { 529 {
494 for (i = 0; i < 8; i++) 530 for (i = 0; i < 8; i++)