diff options
| author | Barry Wardell <rockbox@barrywardell.net> | 2006-10-05 10:58:51 +0000 |
|---|---|---|
| committer | Barry Wardell <rockbox@barrywardell.net> | 2006-10-05 10:58:51 +0000 |
| commit | d4945dc0d07b23eced900075e8748ccc7fb3e424 (patch) | |
| tree | 4d67d49b4c036a841fb1ffe2e5f3a267bb9309d0 /firmware/drivers/button.c | |
| parent | 1d69db7355dc7e3cbabc3c1c949e5d6ba3863405 (diff) | |
| download | rockbox-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.c | 424 |
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); |