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
This commit is contained in:
Mark Arigo 2009-06-19 03:23:38 +00:00
parent 6a0d931f38
commit a61196fd3a
11 changed files with 330 additions and 185 deletions

View file

@ -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

View file

@ -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

View file

@ -22,12 +22,59 @@
#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)
{
return !(GPIOL_INPUT_VAL & 0x40);
@ -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;
int btn = int_btn;
/* Hold */
hold_button_old = hold_button;
hold_button = button_hold();
if (button_hold())
return BUTTON_NONE;
#ifndef BOOTLOADER
if (hold_button != hold_button_old)
backlight_hold_changed(hold_button);
#endif
/* 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;
}

View file

@ -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

View file

@ -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)