summaryrefslogtreecommitdiff
path: root/firmware/drivers/button.c
diff options
context:
space:
mode:
authorBarry Wardell <rockbox@barrywardell.net>2006-10-05 10:58:51 +0000
committerBarry Wardell <rockbox@barrywardell.net>2006-10-05 10:58:51 +0000
commitd4945dc0d07b23eced900075e8748ccc7fb3e424 (patch)
tree4d67d49b4c036a841fb1ffe2e5f3a267bb9309d0 /firmware/drivers/button.c
parent1d69db7355dc7e3cbabc3c1c949e5d6ba3863405 (diff)
downloadrockbox-d4945dc0d07b23eced900075e8748ccc7fb3e424.zip
rockbox-d4945dc0d07b23eced900075e8748ccc7fb3e424.tar.gz
rockbox-d4945dc0d07b23eced900075e8748ccc7fb3e424.tar.bz2
rockbox-d4945dc0d07b23eced900075e8748ccc7fb3e424.tar.xz
Move all iPod targets into the target tree. FS#5890
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11129 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/button.c')
-rw-r--r--firmware/drivers/button.c424
1 files changed, 1 insertions, 423 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index 599c22b..8acae01 100644
--- a/firmware/drivers/button.c
+++ b/firmware/drivers/button.c
@@ -72,8 +72,7 @@ static bool remote_filter_first_keypress;
#define REPEAT_INTERVAL_FINISH 5
/* the power-off button and number of repeated keys before shutting off */
-#if (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD) ||\
- (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
+#if (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
#define POWEROFF_BUTTON BUTTON_PLAY
#define POWEROFF_COUNT 40
#elif !defined(TARGET_TREE)
@@ -87,344 +86,10 @@ static int button_read(void);
static bool remote_button_hold_only(void);
#endif
-#if CONFIG_KEYPAD == IPOD_4G_PAD
-/* Variable to use for setting button status in interrupt handler */
-int int_btn = BUTTON_NONE;
-#ifdef HAVE_WHEEL_POSITION
-static int wheel_position = -1;
-static bool send_events = true;
-#endif
-#endif
-
#ifdef HAVE_HEADPHONE_DETECTION
bool phones_present = false;
#endif
-#if (CONFIG_KEYPAD == IPOD_4G_PAD) && !defined(IPOD_MINI)
-static void opto_i2c_init(void)
-{
- int i, curr_value;
-
- /* wait for value to settle */
- i = 1000;
- curr_value = (inl(0x7000c104) << 16) >> 24;
- while (i > 0)
- {
- int new_value = (inl(0x7000c104) << 16) >> 24;
-
- if (new_value != curr_value) {
- i = 10000;
- curr_value = new_value;
- }
- else {
- i--;
- }
- }
-
- GPIOB_OUTPUT_VAL |= 0x10;
- DEV_EN |= 0x10000;
- DEV_RS |= 0x10000;
- udelay(5);
- DEV_RS &= ~0x10000; /* finish reset */
-
- outl(0xffffffff, 0x7000c120);
- outl(0xffffffff, 0x7000c124);
- outl(0xc00a1f00, 0x7000c100);
- outl(0x1000000, 0x7000c104);
-}
-
-static inline int ipod_4g_button_read(void)
-{
- int whl = -1;
-
- /* The ipodlinux source had a udelay(250) here, but testing has shown that
- it is not needed - tested on Nano, Color/Photo and Video. */
- /* udelay(250);*/
-
- int btn = BUTTON_NONE;
- unsigned reg = 0x7000c104;
- if ((inl(0x7000c104) & 0x4000000) != 0) {
- unsigned status = inl(0x7000c140);
-
- reg = reg + 0x3C; /* 0x7000c140 */
- outl(0x0, 0x7000c140); /* clear interrupt status? */
-
- if ((status & 0x800000ff) == 0x8000001a) {
- static int old_wheel_value IDATA_ATTR = -1;
- static int wheel_repeat = 0;
-
- if (status & 0x100)
- btn |= BUTTON_SELECT;
- if (status & 0x200)
- btn |= BUTTON_RIGHT;
- if (status & 0x400)
- btn |= BUTTON_LEFT;
- if (status & 0x800)
- btn |= BUTTON_PLAY;
- if (status & 0x1000)
- btn |= BUTTON_MENU;
- if (status & 0x40000000) {
- /* NB: highest wheel = 0x5F, clockwise increases */
- int new_wheel_value = (status << 9) >> 25;
- whl = new_wheel_value;
- backlight_on();
- /* The queue should have no other events when scrolling */
- if (queue_empty(&button_queue) && old_wheel_value >= 0) {
-
- /* This is for later = BUTTON_SCROLL_TOUCH;*/
- int wheel_delta = new_wheel_value - old_wheel_value;
- unsigned long data;
- int wheel_keycode;
-
- if (wheel_delta < -48)
- wheel_delta += 96; /* Forward wrapping case */
- else if (wheel_delta > 48)
- wheel_delta -= 96; /* Backward wrapping case */
-
- if (wheel_delta > 4) {
- wheel_keycode = BUTTON_SCROLL_FWD;
- } else if (wheel_delta < -4) {
- wheel_keycode = BUTTON_SCROLL_BACK;
- } else goto wheel_end;
-
-#ifdef HAVE_WHEEL_POSITION
- if (send_events)
-#endif
- {
- data = (wheel_delta << 16) | new_wheel_value;
- queue_post(&button_queue, wheel_keycode | wheel_repeat,
- (void *)data);
- }
-
- if (!wheel_repeat) wheel_repeat = BUTTON_REPEAT;
- }
-
- old_wheel_value = new_wheel_value;
- } else if (old_wheel_value >= 0) {
- /* scroll wheel up */
- old_wheel_value = -1;
- wheel_repeat = 0;
- }
-
- } else if (status == 0xffffffff) {
- opto_i2c_init();
- }
- }
-
-wheel_end:
-
- if ((inl(reg) & 0x8000000) != 0) {
- outl(0xffffffff, 0x7000c120);
- outl(0xffffffff, 0x7000c124);
- }
- /* Save the new absolute wheel position */
- wheel_position = whl;
- return btn;
-}
-
-void ipod_4g_button_int(void)
-{
- CPU_HI_INT_CLR = I2C_MASK;
- /* The following delay was 250 in the ipodlinux source, but 50 seems to
- work fine - tested on Nano, Color/Photo and Video. */
- udelay(50);
- outl(0x0, 0x7000c140);
- int_btn = ipod_4g_button_read();
- outl(inl(0x7000c104) | 0xC000000, 0x7000c104);
- outl(0x400a1f00, 0x7000c100);
-
- GPIOB_OUTPUT_VAL |= 0x10;
- CPU_INT_EN = 0x40000000;
- CPU_HI_INT_EN = I2C_MASK;
-}
-#endif
-#if (CONFIG_KEYPAD == IPOD_3G_PAD) || defined(IPOD_MINI)
-/* iPod 3G and mini 1G, mini 2G uses iPod 4G code */
-void handle_scroll_wheel(int new_scroll, int was_hold, int reverse)
-{
- int wheel_keycode = BUTTON_NONE;
- static int prev_scroll = -1;
- static int direction = 0;
- static int count = 0;
- static int scroll_state[4][4] = {
- {0, 1, -1, 0},
- {-1, 0, 0, 1},
- {1, 0, 0, -1},
- {0, -1, 1, 0}
- };
-
- if ( prev_scroll == -1 ) {
- prev_scroll = new_scroll;
- }
- else if (direction != scroll_state[prev_scroll][new_scroll]) {
- direction = scroll_state[prev_scroll][new_scroll];
- count = 0;
- }
- else if (!was_hold) {
- backlight_on();
- if (++count == 6) { /* reduce sensitivity */
- count = 0;
- switch (direction) {
- case 1:
- if (reverse) {
- /* 'r' keypress */
- wheel_keycode = BUTTON_SCROLL_FWD;
- }
- else {
- /* 'l' keypress */
- wheel_keycode = BUTTON_SCROLL_BACK;
- }
- break;
- case -1:
- if (reverse) {
- /* 'l' keypress */
- wheel_keycode = BUTTON_SCROLL_BACK;
- }
- else {
- /* 'r' keypress */
- wheel_keycode = BUTTON_SCROLL_FWD;
- }
- break;
- default:
- /* only happens if we get out of sync */
- break;
- }
- }
- }
- if (wheel_keycode != BUTTON_NONE && queue_empty(&button_queue))
- queue_post(&button_queue, wheel_keycode, NULL);
- prev_scroll = new_scroll;
-}
-#endif
-#if (CONFIG_KEYPAD == IPOD_4G_PAD) && defined(IPOD_MINI)
-/* mini 1 only, mini 2G uses iPod 4G code */
-static int ipod_mini_button_read(void)
-{
- unsigned char source, wheel_source, state, wheel_state;
- static bool was_hold = false;
- int btn = BUTTON_NONE;
-
- /* The ipodlinux source had a udelay(250) here, but testing has shown that
- it is not needed - tested on mini 1g. */
- /* udelay(250);*/
-
- /* get source(s) of interupt */
- source = GPIOA_INT_STAT & 0x3f;
- wheel_source = GPIOB_INT_STAT & 0x30;
-
- if (source == 0 && wheel_source == 0) {
- return BUTTON_NONE; /* not for us */
- }
-
- /* get current keypad & wheel status */
- state = GPIOA_INPUT_VAL & 0x3f;
- wheel_state = GPIOB_INPUT_VAL & 0x30;
-
- /* toggle interrupt level */
- GPIOA_INT_LEV = ~state;
- GPIOB_INT_LEV = ~wheel_state;
-
- /* hold switch causes all outputs to go low */
- /* we shouldn't interpret these as key presses */
- if ((state & 0x20)) {
- if (!(state & 0x1))
- btn |= BUTTON_SELECT;
- if (!(state & 0x2))
- btn |= BUTTON_MENU;
- if (!(state & 0x4))
- btn |= BUTTON_PLAY;
- if (!(state & 0x8))
- btn |= BUTTON_RIGHT;
- if (!(state & 0x10))
- btn |= BUTTON_LEFT;
-
- if (wheel_source & 0x30) {
- handle_scroll_wheel((wheel_state & 0x30) >> 4, was_hold, 1);
- }
- }
-
- was_hold = button_hold();
-
- /* ack any active interrupts */
- if (source)
- GPIOA_INT_CLR = source;
- if (wheel_source)
- GPIOB_INT_CLR = wheel_source;
-
- return btn;
-}
-
-void ipod_mini_button_int(void)
-{
- CPU_HI_INT_CLR = GPIO_MASK;
- int_btn = ipod_mini_button_read();
- //CPU_INT_EN = 0x40000000;
- CPU_HI_INT_EN = GPIO_MASK;
-}
-#endif
-#if CONFIG_KEYPAD == IPOD_3G_PAD
-static int ipod_3g_button_read(void)
-{
- unsigned char source, state;
- static int was_hold = 0;
- int btn = BUTTON_NONE;
- /*
- * we need some delay for g3, cause hold generates several interrupts,
- * some of them delayed
- */
- udelay(250);
-
- /* get source of interupts */
- source = GPIOA_INT_STAT;
-
-
- /* get current keypad status */
- state = GPIOA_INPUT_VAL;
- GPIOA_INT_LEV = ~state;
-
- if (was_hold && source == 0x40 && state == 0xbf) {
- /* ack any active interrupts */
- GPIOA_INT_CLR = source;
- return BUTTON_NONE;
- }
- was_hold = 0;
-
-
- if ((state & 0x20) == 0) {
- /* 3g hold switch is active low */
- was_hold = 1;
- /* hold switch on 3g causes all outputs to go low */
- /* we shouldn't interpret these as key presses */
- GPIOA_INT_CLR = source;
- return BUTTON_NONE;
- }
- if ((state & 0x1) == 0) {
- btn |= BUTTON_RIGHT;
- }
- if ((state & 0x2) == 0) {
- btn |= BUTTON_SELECT;
- }
- if ((state & 0x4) == 0) {
- btn |= BUTTON_PLAY;
- }
- if ((state & 0x8) == 0) {
- btn |= BUTTON_LEFT;
- }
- if ((state & 0x10) == 0) {
- btn |= BUTTON_MENU;
- }
-
- if (source & 0xc0) {
- handle_scroll_wheel((state & 0xc0) >> 6, was_hold, 0);
- }
-
- /* ack any active interrupts */
- GPIOA_INT_CLR = source;
-
- return btn;
-}
-#endif
-
static void button_tick(void)
{
static int count = 0;
@@ -669,45 +334,6 @@ void button_init(void)
/* nothing to initialize here */
#elif CONFIG_KEYPAD == GMINI100_PAD
/* nothing to initialize here */
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) && !defined(IPOD_MINI)
- opto_i2c_init();
- /* hold button - enable as input */
- GPIOA_ENABLE |= 0x20;
- GPIOA_OUTPUT_EN &= ~0x20;
- /* hold button - set interrupt levels */
- GPIOA_INT_LEV = ~(GPIOA_INPUT_VAL & 0x20);
- GPIOA_INT_CLR = GPIOA_INT_STAT & 0x20;
- /* enable interrupts */
- GPIOA_INT_EN = 0x20;
- /* unmask interrupt */
- CPU_INT_EN = 0x40000000;
- CPU_HI_INT_EN = I2C_MASK;
-
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) && defined(IPOD_MINI)
- /* iPod Mini G1 */
- /* buttons - enable as input */
- GPIOA_ENABLE |= 0x3f;
- GPIOA_OUTPUT_EN &= ~0x3f;
- /* scroll wheel- enable as input */
- GPIOB_ENABLE |= 0x30; /* port b 4,5 */
- GPIOB_OUTPUT_EN &= ~0x30; /* port b 4,5 */
- /* buttons - set interrupt levels */
- GPIOA_INT_LEV = ~(GPIOA_INPUT_VAL & 0x3f);
- GPIOA_INT_CLR = GPIOA_INT_STAT & 0x3f;
- /* scroll wheel - set interrupt levels */
- GPIOB_INT_LEV = ~(GPIOB_INPUT_VAL & 0x30);
- GPIOB_INT_CLR = GPIOB_INT_STAT & 0x30;
- /* enable interrupts */
- GPIOA_INT_EN = 0x3f;
- GPIOB_INT_EN = 0x30;
- /* unmask interrupt */
- CPU_INT_EN = 0x40000000;
- CPU_HI_INT_EN = GPIO_MASK;
-
-#elif CONFIG_KEYPAD == IPOD_3G_PAD
- GPIOA_INT_LEV = ~GPIOA_INPUT_VAL;
- GPIOA_INT_CLR = GPIOA_INT_STAT;
- GPIOA_INT_EN = 0xff;
#endif /* CONFIG_KEYPAD */
queue_init(&button_queue, true);
button_read();
@@ -1266,35 +892,6 @@ static int button_read(void)
if (data & 0x01)
btn |= BUTTON_ON;
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
- static bool hold_button = false;
- bool hold_button_old;
-
- /* normal buttons */
- hold_button_old = hold_button;
- hold_button = button_hold();
-
- if (hold_button != hold_button_old)
- backlight_hold_changed(hold_button);
-
- (void)data;
- /* The int_btn variable is set in the button interrupt handler */
- btn = int_btn;
-
-#elif (CONFIG_KEYPAD == IPOD_3G_PAD)
- static bool hold_button = false;
- bool hold_button_old;
-
- /* normal buttons */
- hold_button_old = hold_button;
- hold_button = button_hold();
-
- if (hold_button != hold_button_old)
- backlight_hold_changed(hold_button);
-
- (void)data;
- btn = ipod_3g_button_read();
-
#endif /* CONFIG_KEYPAD */
#ifdef HAVE_LCD_BITMAP
@@ -1313,13 +910,6 @@ static int button_read(void)
return retval;
}
-#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD)
-bool button_hold(void)
-{
- return (GPIOA_INPUT_VAL & 0x20)?false:true;
-}
-#endif
-
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
bool button_hold(void)
{
@@ -1357,18 +947,6 @@ int button_status(void)
return lastbtn;
}
-#ifdef HAVE_WHEEL_POSITION
-int wheel_status(void)
-{
- return wheel_position;
-}
-
-void wheel_send_events(bool send)
-{
- send_events = send;
-}
-#endif
-
void button_clear_queue(void)
{
queue_clear(&button_queue);