mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-08 12:45:26 -05:00
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:
parent
6a0d931f38
commit
a61196fd3a
11 changed files with 330 additions and 185 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue