summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2007-09-30 11:15:14 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2007-09-30 11:15:14 +0000
commite108964ec08f70a46e1db430288283d68a906c56 (patch)
tree22c789576822138974a2c171f7c648cc3a1d99b1
parentef1c52fa4390075000db585e5833324b38329f40 (diff)
downloadrockbox-e108964ec08f70a46e1db430288283d68a906c56.tar.gz
rockbox-e108964ec08f70a46e1db430288283d68a906c56.tar.bz2
rockbox-e108964ec08f70a46e1db430288283d68a906c56.zip
IRQ driven touchpad driver, crude but working
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14914 a1c6a512-1295-4272-9138-f99709370657
-rwxr-xr-xbootloader/mrobe500.c37
-rw-r--r--firmware/export/button.h5
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c39
3 files changed, 61 insertions, 20 deletions
diff --git a/bootloader/mrobe500.c b/bootloader/mrobe500.c
index ce1aa57224..b92096ada2 100755
--- a/bootloader/mrobe500.c
+++ b/bootloader/mrobe500.c
@@ -104,8 +104,6 @@ void main(void)
while(true)
{
button = button_read_device();
- if (button)
- printf("btn: %x", button);
if (button == BUTTON_POWER)
{
printf("reset");
@@ -119,23 +117,28 @@ void main(void)
address+=0x1000;
else if (button==BUTTON_RC_REW)
address-=0x1000;
-
- // if ((IO_GIO_BITSET0&(1<<14) == 0)
+ if (button&BUTTON_TOUCHPAD)
{
- short x,y,z1,z2, reg;
- extern int uart1count;
- tsc2100_read_values(&x, &y, &z1, &z2);
- printf("x: %04x y: %04x z1: %04x z2: %04x", x, y, z1, z2);
- printf("tsadc: %4x", tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS)&0xffff);
- printf("current tick: %04x", current_tick);
- printf("Address: 0x%08x Data: 0x%08x", address, *address);
- printf("Address: 0x%08x Data: 0x%08x", address+1, *(address+1));
- printf("Address: 0x%08x Data: 0x%08x", address+2, *(address+2));
- printf("uart1count: %d", uart1count);
- printf("%x %x", IO_UART1_RFCR & 0x3f, IO_UART1_DTRR & 0xff);
- tsc2100_keyclick(); /* doesnt work :( */
- line -= 8;
+ int touch = button_get_last_touch();
+ printf("x: %d, y: %d", (touch>>16), touch&0xffff);
+ line--;
}
+// if ((IO_GIO_BITSET0&(1<<14) == 0)
+// {
+// short x,y,z1,z2, reg;
+// extern int uart1count;
+// tsc2100_read_values(&x, &y, &z1, &z2);
+// printf("x: %04x y: %04x z1: %04x z2: %04x", x, y, z1, z2);
+// printf("tsadc: %4x", tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS)&0xffff);
+// printf("current tick: %04x", current_tick);
+// printf("Address: 0x%08x Data: 0x%08x", address, *address);
+// printf("Address: 0x%08x Data: 0x%08x", address+1, *(address+1));
+// printf("Address: 0x%08x Data: 0x%08x", address+2, *(address+2));
+// printf("uart1count: %d", uart1count);
+// printf("%x %x", IO_UART1_RFCR & 0x3f, IO_UART1_DTRR & 0xff);
+// tsc2100_keyclick(); /* doesnt work :( */
+// line -= 8;
+// }
}
#endif
printf("ATA");
diff --git a/firmware/export/button.h b/firmware/export/button.h
index 8b8c966ddc..5322d814bf 100644
--- a/firmware/export/button.h
+++ b/firmware/export/button.h
@@ -57,7 +57,8 @@ int button_apply_acceleration(unsigned int data, unsigned int factor);
#define BUTTON_NONE 0x00000000
/* Button modifiers */
-#define BUTTON_REL 0x02000000
-#define BUTTON_REPEAT 0x04000000
+#define BUTTON_REL 0x02000000
+#define BUTTON_REPEAT 0x04000000
+#define BUTTON_TOUCHPAD 0x08000000
#endif /* _BUTTON_H_ */
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c
index 1d0d2714a8..b57680afb4 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/button-mr500.c
@@ -17,6 +17,8 @@
*
****************************************************************************/
+/* this file also handles the touch screen driver interface */
+
#include "config.h"
#include "cpu.h"
#include "system.h"
@@ -27,23 +29,47 @@
#include "system.h"
#include "backlight-target.h"
#include "uart-target.h"
+#include "tsc2100.h"
#define BUTTON_TIMEOUT 50
#define BUTTON_START_BYTE 0xF0
#define BUTTON_START_BYTE2 0xF4 /* not sure why, but sometimes you get F0 or F4, */
/* but always the same one for the session? */
-
+static short last_x, last_y, last_z1, last_z2; /* for the touch screen */
+static int last_touch;
void button_init_device(void)
{
+ last_touch = 0;
/* GIO is the power button, set as input */
IO_GIO_DIR0 |= 0x01;
+
+
+ /* Enable the touchscreen interrupt */
+ IO_INTC_EINT2 |= (1<<3); /* IRQ_GIO14 */
+#if 0
+ tsc2100_writereg(TSADC_PAGE, TSADC_ADDRESS,
+ TSADC_PSTCM|
+ (0x2<<TSADC_ADSCM_SHIFT)| /* scan x,y,z1,z2 */
+ (0x1<<TSADC_RESOL_SHIFT) /* 8 bit resolution */
+ );
+ /* doesnt work for some reason...
+ setting to 8bit would probably be better than the 12bit currently */
+#endif
}
inline bool button_hold(void)
{
return false;
}
+#ifdef BOOTLOADER
+int button_get_last_touch(void)
+{
+ int ret_val = last_touch;
+ last_touch = 0;
+ return ret_val;
+}
+#endif
int button_read_device(void)
{
@@ -51,6 +77,9 @@ int button_read_device(void)
int i = 0;
int btn = BUTTON_NONE;
+ if (last_touch)
+ btn |= BUTTON_TOUCHPAD;
+
if ((IO_GIO_BITSET0&0x01) == 0)
btn |= BUTTON_POWER;
@@ -94,3 +123,11 @@ int button_read_device(void)
}
return btn;
}
+
+void GIO14(void)
+{
+ tsc2100_read_values(&last_x, &last_y,
+ &last_z1, &last_z2);
+ last_touch = (last_x<<16)|last_y;
+ IO_INTC_IRQ2 = (1<<3);
+}