1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Dominik Wenger 2008-06-27 20:19:27 +00:00
parent 22e7bf32b8
commit 7135f2d9f4

View file

@ -61,6 +61,9 @@ static int int_btn = BUTTON_NONE;
#define BUTTONS_ID 0x9 #define BUTTONS_ID 0x9
#define ABSOLUTE_HEADER 0x0b #define ABSOLUTE_HEADER 0x0b
#define MEP_READ 0x1
#define MEP_WRITE 0x3
static int syn_status = 0; static int syn_status = 0;
static int syn_wait_clk_change(unsigned int val) static int syn_wait_clk_change(unsigned int val)
@ -107,9 +110,9 @@ static void syn_wait_guest_flush(void)
static void syn_flush(void) static void syn_flush(void)
{ {
int i; int i;
#if defined(LOGF_ENABLE)
logf("syn_flush..."); logf("syn_flush...");
#endif
/* Flusher holds DATA low for at least 36 handshake cycles */ /* Flusher holds DATA low for at least 36 handshake cycles */
DATA_LO; DATA_LO;
@ -134,9 +137,9 @@ static int syn_send_data(int *data, int len)
{ {
int i, bit; int i, bit;
int parity = 0; int parity = 0;
#if defined(LOGF_ENABLE)
logf("syn_send_data..."); logf("syn_send_data...");
#endif
/* 1. Lower DATA line to issue a request-to-send to guest */ /* 1. Lower DATA line to issue a request-to-send to guest */
DATA_LO; DATA_LO;
@ -152,8 +155,9 @@ static int syn_send_data(int *data, int len)
/* 5. Send data */ /* 5. Send data */
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
{ {
#if defined(LOGF_ENABLE)
logf(" sending byte: %d", data[i]); logf(" sending byte: %d", data[i]);
#endif
bit = 0; bit = 0;
while (bit < 8) while (bit < 8)
{ {
@ -198,7 +202,9 @@ static int syn_send_data(int *data, int len)
parity should set DATA high. Parity is 1 if there's an odd parity should set DATA high. Parity is 1 if there's an odd
number of '1' bits, or 0 if there's an even number of '1' bits. */ number of '1' bits, or 0 if there's an even number of '1' bits. */
parity = parity % 2; parity = parity % 2;
#if defined(LOGF_ENABLE)
logf(" send parity = %d", parity); logf(" send parity = %d", parity);
#endif
if (parity) if (parity)
{ {
DATA_HI; DATA_HI;
@ -227,7 +233,9 @@ static int syn_send_data(int *data, int len)
enter the flushee state. */ enter the flushee state. */
if (syn_get_data() == LO) if (syn_get_data() == LO)
{ {
#if defined(LOGF_ENABLE)
logf(" module flushing"); logf(" module flushing");
#endif
syn_wait_guest_flush(); syn_wait_guest_flush();
return -1; return -1;
} }
@ -242,9 +250,9 @@ static int syn_read_data(int *data, int data_len)
{ {
int i, len, bit, parity, tmp; int i, len, bit, parity, tmp;
int *data_ptr; int *data_ptr;
#if defined(LOGF_ENABLE)
logf("syn_read_data..."); logf("syn_read_data...");
#endif
/* 1. Guest drives CLK low */ /* 1. Guest drives CLK low */
if (CLK != LO) if (CLK != LO)
return 0; return 0;
@ -325,7 +333,9 @@ static int syn_read_data(int *data, int data_len)
{ {
/* Packet length is bits 0:2 */ /* Packet length is bits 0:2 */
len = *data_ptr & 0x7; len = *data_ptr & 0x7;
#if defined(LOGF_ENABLE)
logf(" packet length = %d", len); logf(" packet length = %d", len);
#endif
} }
else else
{ {
@ -344,7 +354,9 @@ static int syn_read_data(int *data, int data_len)
/* 7c. The host verifies the parity bit is correct */ /* 7c. The host verifies the parity bit is correct */
parity = parity % 2; parity = parity % 2;
#if defined(LOGF_ENABLE)
logf(" parity check: %d / %d", syn_get_data(), parity); logf(" parity check: %d / %d", syn_get_data(), parity);
#endif
/* TODO: parity error handling */ /* TODO: parity error handling */
/* 7d. The host lowers ACK */ /* 7d. The host lowers ACK */
@ -398,9 +410,9 @@ static int syn_reset(void)
{ {
int val, id; int val, id;
int data[2]; int data[2];
#if defined(LOGF_ENABLE)
logf("syn_reset..."); logf("syn_reset...");
#endif
/* reset module 0 */ /* reset module 0 */
val = (0 << 4) | (1 << 3) | 0; val = (0 << 4) | (1 << 3) | 0;
syn_send_data(&val, 1); syn_send_data(&val, 1);
@ -431,7 +443,7 @@ static void syn_info(void)
/* module base info */ /* module base info */
logf("module base info:"); logf("module base info:");
data[0] = (0 << 4) | (0 << 3) | 1; data[0] = MEP_READ;
data[1] = 0x80; data[1] = 0x80;
syn_send_data(data, 2); syn_send_data(data, 2);
val = syn_read_device(data, 8); val = syn_read_device(data, 8);
@ -443,7 +455,7 @@ static void syn_info(void)
/* module product info */ /* module product info */
logf("module product info:"); logf("module product info:");
data[0] = (0 << 4) | (0 << 3) | 1; data[0] = MEP_READ;
data[1] = 0x81; data[1] = 0x81;
syn_send_data(data, 2); syn_send_data(data, 2);
val = syn_read_device(data, 8); val = syn_read_device(data, 8);
@ -455,7 +467,7 @@ static void syn_info(void)
/* module serialization */ /* module serialization */
logf("module serialization:"); logf("module serialization:");
data[0] = (0 << 4) | (0 << 3) | 1; data[0] = MEP_READ;
data[1] = 0x82; data[1] = 0x82;
syn_send_data(data, 2); syn_send_data(data, 2);
val = syn_read_device(data, 8); val = syn_read_device(data, 8);
@ -467,7 +479,7 @@ static void syn_info(void)
/* 1-D sensor info */ /* 1-D sensor info */
logf("1-d sensor info:"); logf("1-d sensor info:");
data[0] = (0 << 4) | (0 << 3) | 1; data[0] = MEP_READ;
data[1] = 0x80 + 0x20; data[1] = 0x80 + 0x20;
syn_send_data(data, 2); syn_send_data(data, 2);
val = syn_read_device(data, 8); val = syn_read_device(data, 8);
@ -540,13 +552,13 @@ void button_int(void)
{ {
val = data[0] & 0xff; /* packet header */ val = data[0] & 0xff; /* packet header */
id = (data[1] >> 4) & 0xf; /* packet id */ id = (data[1] >> 4) & 0xf; /* packet id */
#if defined(LOGF_ENABLE)
logf("button_read_device..."); logf("button_read_device...");
logf(" data[0] = 0x%08x", data[0]); logf(" data[0] = 0x%08x", data[0]);
logf(" data[1] = 0x%08x", data[1]); logf(" data[1] = 0x%08x", data[1]);
logf(" data[2] = 0x%08x", data[2]); logf(" data[2] = 0x%08x", data[2]);
logf(" data[3] = 0x%08x", data[3]); logf(" data[3] = 0x%08x", data[3]);
#endif
if ((val == BUTTONS_HEADER) && (id == BUTTONS_ID)) if ((val == BUTTONS_HEADER) && (id == BUTTONS_ID))
{ {
/* Buttons packet - touched one of the 5 "buttons" */ /* Buttons packet - touched one of the 5 "buttons" */
@ -563,14 +575,24 @@ void button_int(void)
/* An Absolute packet should follow which we ignore */ /* An Absolute packet should follow which we ignore */
val = syn_read_device(data, 4); val = syn_read_device(data, 4);
#if defined(LOGF_ENABLE)
logf(" int_btn = 0x%04x", int_btn); logf(" int_btn = 0x%04x", int_btn);
#endif
} }
else if (val == ABSOLUTE_HEADER) else if (val == ABSOLUTE_HEADER)
{ {
/* Absolute packet - the finger is on the vertical strip. /* Absolute packet - the finger is on the vertical strip.
Position ranges from 1-4095, with 1 at the bottom. */ Position ranges from 1-4095, with 1 at the bottom. */
val = ((data[1] >> 4) << 8) | data[2]; /* position */ val = ((data[1] >> 4) << 8) | data[2]; /* position */
#if defined(LOGF_ENABLE)
logf(" pos %d", val);
logf(" z %d", data[3]);
logf(" finger %d", data[1] & 0x1);
logf(" gesture %d", data[1] & 0x2);
logf(" RelPosVld %d", data[1] & 0x4);
#endif
if(data[1] & 0x1) /* if finger on touch strip */
{
if ((val > 0) && (val <= 1365)) if ((val > 0) && (val <= 1365))
int_btn |= BUTTON_DOWN; int_btn |= BUTTON_DOWN;
else if ((val > 1365) && (val <= 2730)) else if ((val > 1365) && (val <= 2730))
@ -579,6 +601,7 @@ void button_int(void)
int_btn |= BUTTON_UP; int_btn |= BUTTON_UP;
} }
} }
}
/* re-enable interrupts */ /* re-enable interrupts */
GPIOD_INT_LEV &= ~0x2; GPIOD_INT_LEV &= ~0x2;