summaryrefslogtreecommitdiffstats
path: root/firmware/target
diff options
context:
space:
mode:
authorMark Arigo <markarigo@gmail.com>2009-06-19 03:23:38 +0000
committerMark Arigo <markarigo@gmail.com>2009-06-19 03:23:38 +0000
commita61196fd3ae5ebd71134da8eb10e3189403c116f (patch)
tree7ce78201cb299ebfd6ac92f490776072c47a9e03 /firmware/target
parent6a0d931f383259b4b82fcfd1cc87700f53bbcb02 (diff)
downloadrockbox-a61196fd3ae5ebd71134da8eb10e3189403c116f.tar.gz
rockbox-a61196fd3ae5ebd71134da8eb10e3189403c116f.zip
Philips SA9200: Working touchpad and button lights! Also, improvements to the keymap (still needs work).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21346 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/philips/sa9200/backlight-sa9200.c23
-rw-r--r--firmware/target/arm/philips/sa9200/backlight-target.h3
-rwxr-xr-xfirmware/target/arm/philips/sa9200/button-sa9200.c79
-rwxr-xr-xfirmware/target/arm/philips/sa9200/button-target.h10
-rw-r--r--firmware/target/arm/philips/sa9200/power-sa9200.c40
5 files changed, 124 insertions, 31 deletions
diff --git a/firmware/target/arm/philips/sa9200/backlight-sa9200.c b/firmware/target/arm/philips/sa9200/backlight-sa9200.c
index a0acaa0abd..22aae1ae6b 100644
--- a/firmware/target/arm/philips/sa9200/backlight-sa9200.c
+++ b/firmware/target/arm/philips/sa9200/backlight-sa9200.c
@@ -21,10 +21,10 @@
#include "config.h"
#include "backlight-target.h"
#include "system.h"
-#include "lcd.h"
#include "backlight.h"
#include "ascodec.h"
#include "as3514.h"
+#include "synaptics-mep.h"
void _backlight_set_brightness(int brightness)
{
@@ -51,12 +51,29 @@ void _backlight_off(void)
#endif
}
+#ifdef HAVE_BUTTON_LIGHT
+
+#define BUTTONLIGHT_MASK 0x7f
+#define BUTTONLIGHT_MAX 0x0f
+static unsigned short buttonlight_status = 0;
+
void _buttonlight_on(void)
{
- /* TODO */
+ if (!buttonlight_status)
+ {
+ touchpad_set_buttonlights(BUTTONLIGHT_MASK, BUTTONLIGHT_MAX);
+ GPIOD_OUTPUT_VAL &= ~(0x40 | 0x20 | 0x04); /* REW/FFWD/MENU */
+ buttonlight_status = 1;
+ }
}
void _buttonlight_off(void)
{
- /* TODO */
+ if (buttonlight_status)
+ {
+ touchpad_set_buttonlights(BUTTONLIGHT_MASK, 0);
+ GPIOD_OUTPUT_VAL |= (0x40 | 0x20 | 0x04); /* REW/FFWD/MENU */
+ buttonlight_status = 0;
+ }
}
+#endif
diff --git a/firmware/target/arm/philips/sa9200/backlight-target.h b/firmware/target/arm/philips/sa9200/backlight-target.h
index 21fad6d22e..9d695e5a22 100644
--- a/firmware/target/arm/philips/sa9200/backlight-target.h
+++ b/firmware/target/arm/philips/sa9200/backlight-target.h
@@ -27,6 +27,9 @@ void _backlight_off(void);
void _backlight_set_brightness(int brightness);
int __backlight_is_on(void);
+#ifdef HAVE_BUTTON_LIGHT
void _buttonlight_on(void);
void _buttonlight_off(void);
#endif
+
+#endif
diff --git a/firmware/target/arm/philips/sa9200/button-sa9200.c b/firmware/target/arm/philips/sa9200/button-sa9200.c
index d965966075..be37111ecb 100755
--- a/firmware/target/arm/philips/sa9200/button-sa9200.c
+++ b/firmware/target/arm/philips/sa9200/button-sa9200.c
@@ -22,11 +22,58 @@
#include "system.h"
#include "button.h"
#include "backlight.h"
+#include "synaptics-mep.h"
+#define LOGF_ENABLE
+#include "logf.h"
+
+static int int_btn = BUTTON_NONE;
+
+#ifndef BOOTLOADER
void button_init_device(void)
{
- /* TODO...for now, hardware initialisation is done by the c200 bootloader */
+ /* The touchpad is powered on and initialized in power-sa9200.c
+ since it needs to be ready for both buttons and button lights. */
+}
+
+/*
+ * Button interrupt handler
+ */
+void button_int(void)
+{
+ char data[4];
+ int val;
+
+ int_btn = BUTTON_NONE;
+
+ val = touchpad_read_device(data, 4);
+
+ if (val == MEP_BUTTON_HEADER)
+ {
+ /* Buttons packet */
+ if (data[1] & 0x1) int_btn |= BUTTON_FFWD;
+ if (data[1] & 0x2) int_btn |= BUTTON_RIGHT;
+ if (data[1] & 0x4) int_btn |= BUTTON_LEFT;
+ if (data[1] & 0x8) int_btn |= BUTTON_REW;
+ if (data[2] & 0x1) int_btn |= BUTTON_MENU;
+ }
+ else if (val == MEP_ABSOLUTE_HEADER)
+ {
+ /* Absolute packet - the finger is on the vertical strip.
+ Position ranges from 1-4095, with 1 at the bottom. */
+ val = ((data[1] >> 4) << 8) | data[2]; /* position */
+
+ if ((val > 0) && (val <= 1365))
+ int_btn |= BUTTON_DOWN;
+ else if ((val > 1365) && (val <= 2730))
+ int_btn |= BUTTON_PLAY;
+ else if ((val > 2730) && (val <= 4095))
+ int_btn |= BUTTON_UP;
+ }
}
+#else
+void button_init_device(void){}
+#endif /* bootloader */
bool button_hold(void)
{
@@ -38,32 +85,14 @@ bool button_hold(void)
*/
int button_read_device(void)
{
- int btn = BUTTON_NONE;
- static bool hold_button = false;
- bool hold_button_old;
-
- /* Hold */
- hold_button_old = hold_button;
- hold_button = button_hold();
+ int btn = int_btn;
-#ifndef BOOTLOADER
- if (hold_button != hold_button_old)
- backlight_hold_changed(hold_button);
-#endif
+ if (button_hold())
+ return BUTTON_NONE;
- /* device buttons */
- if (!hold_button)
- {
-#if 0
- if (!(GPIOB_INPUT_VAL & 0x20)) btn |= BUTTON_POWER;
- if (!(GPIOF_INPUT_VAL & 0x10)) btn |= BUTTON_VOL_UP;
- if (!(GPIOF_INPUT_VAL & 0x04)) btn |= BUTTON_VOL_DOWN;
-#endif
- /* A hack until the touchpad works */
- if (!(GPIOB_INPUT_VAL & 0x20)) btn |= BUTTON_SELECT;
- if (!(GPIOF_INPUT_VAL & 0x10)) btn |= BUTTON_UP;
- if (!(GPIOF_INPUT_VAL & 0x04)) btn |= BUTTON_DOWN;
- }
+ if (!(GPIOB_INPUT_VAL & 0x20)) btn |= BUTTON_POWER;
+ if (!(GPIOF_INPUT_VAL & 0x10)) btn |= BUTTON_VOL_UP;
+ if (!(GPIOF_INPUT_VAL & 0x04)) btn |= BUTTON_VOL_DOWN;
return btn;
}
diff --git a/firmware/target/arm/philips/sa9200/button-target.h b/firmware/target/arm/philips/sa9200/button-target.h
index 0d691506d2..6259aa0737 100755
--- a/firmware/target/arm/philips/sa9200/button-target.h
+++ b/firmware/target/arm/philips/sa9200/button-target.h
@@ -25,15 +25,23 @@
#include <stdbool.h>
#include "config.h"
+#define MEP_BUTTON_HEADER 0x1a
+#define MEP_BUTTON_ID 0x09
+#define MEP_ABSOLUTE_HEADER 0x0b
+
#define HAS_BUTTON_HOLD
bool button_hold(void);
void button_init_device(void);
int button_read_device(void);
+#ifndef BOOTLOADER
+void button_int(void);
+#endif
+
/* Main unit's buttons */
#define BUTTON_POWER 0x00000001
-#define BUTTON_SELECT 0x00000002
+#define BUTTON_PLAY 0x00000002
#define BUTTON_MENU 0x00000004
#define BUTTON_LEFT 0x00000008
#define BUTTON_RIGHT 0x00000010
diff --git a/firmware/target/arm/philips/sa9200/power-sa9200.c b/firmware/target/arm/philips/sa9200/power-sa9200.c
index cf9468cb1d..5da1fc5fc4 100644
--- a/firmware/target/arm/philips/sa9200/power-sa9200.c
+++ b/firmware/target/arm/philips/sa9200/power-sa9200.c
@@ -22,14 +22,50 @@
#include <stdbool.h>
#include "system.h"
#include "cpu.h"
-#include "i2c-pp.h"
-#include "tuner.h"
#include "ascodec.h"
#include "as3514.h"
#include "power.h"
+#include "synaptics-mep.h"
+#include "logf.h"
void power_init(void)
{
+#ifndef BOOTLOADER
+ /* Power on and initialize the touchpad here because we need it for
+ both buttons and button lights */
+ DEV_INIT2 &= ~0x800;
+
+ char byte = ascodec_read(AS3514_CVDD_DCDC3);
+ byte = (byte & ~0x18) | 0x08;
+ ascodec_write(AS3514_CVDD_DCDC3, byte);
+
+ /* LEDs for REW, FFWD, MENU */
+ GPIOD_ENABLE |= (0x40 | 0x20 | 0x04);
+ GPIOD_OUTPUT_VAL |= (0x40 | 0x20 | 0x04);
+ GPIOD_OUTPUT_EN |= (0x40 | 0x20 | 0x04);
+ udelay(20000);
+
+ GPIOL_ENABLE |= 0x10;
+ GPIOL_OUTPUT_VAL &= ~0x10;
+ GPIOL_OUTPUT_EN |= 0x10;
+ udelay(100000);
+
+ /* enable DATA, ACK, CLK lines */
+ GPIOD_ENABLE |= (0x10 | 0x08 | 0x02);
+
+ GPIOD_OUTPUT_EN |= 0x08; /* ACK */
+ GPIOD_OUTPUT_VAL |= 0x08; /* high */
+
+ GPIOD_OUTPUT_EN &= ~0x02; /* CLK */
+
+ GPIOD_OUTPUT_EN |= 0x10; /* DATA */
+ GPIOD_OUTPUT_VAL |= 0x10; /* high */
+
+ if (!touchpad_init())
+ {
+ logf("touchpad not ready");
+ }
+#endif
}
void power_off(void)