From a61196fd3ae5ebd71134da8eb10e3189403c116f Mon Sep 17 00:00:00 2001 From: Mark Arigo Date: Fri, 19 Jun 2009 03:23:38 +0000 Subject: 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 --- .../target/arm/philips/sa9200/backlight-sa9200.c | 23 ++++++- .../target/arm/philips/sa9200/backlight-target.h | 3 + firmware/target/arm/philips/sa9200/button-sa9200.c | 79 +++++++++++++++------- firmware/target/arm/philips/sa9200/button-target.h | 10 ++- firmware/target/arm/philips/sa9200/power-sa9200.c | 40 ++++++++++- 5 files changed, 124 insertions(+), 31 deletions(-) (limited to 'firmware/target') 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 #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 #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) -- cgit v1.2.3