summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/FILES2
-rw-r--r--firmware/SOURCES99
-rw-r--r--firmware/backlight.c32
-rw-r--r--firmware/drivers/adc.c57
-rw-r--r--firmware/drivers/button.c424
-rw-r--r--firmware/drivers/power.c20
-rw-r--r--firmware/export/adc.h9
-rw-r--r--firmware/export/button.h28
-rw-r--r--firmware/export/config-ipod3g.h6
-rw-r--r--firmware/export/config-ipod4g.h7
-rw-r--r--firmware/export/config-ipodcolor.h2
-rw-r--r--firmware/export/config-ipodmini.h7
-rwxr-xr-xfirmware/export/config-ipodmini2g.h7
-rw-r--r--firmware/export/config-ipodnano.h2
-rw-r--r--firmware/export/config-ipodvideo.h2
-rw-r--r--firmware/export/pcf50605.h2
-rw-r--r--firmware/powermgmt.c9
-rw-r--r--firmware/target/arm/ipod/3g/backlight-3g.c42
-rw-r--r--firmware/target/arm/ipod/3g/button-3g.c189
-rw-r--r--firmware/target/arm/ipod/adc-ipod.c80
-rw-r--r--firmware/target/arm/ipod/adc-target.h29
-rw-r--r--firmware/target/arm/ipod/backlight-4g_color.c48
-rw-r--r--firmware/target/arm/ipod/backlight-mini1g_mini2g.c44
-rw-r--r--firmware/target/arm/ipod/backlight-nano_video.c50
-rw-r--r--firmware/target/arm/ipod/backlight-target.h25
-rw-r--r--firmware/target/arm/ipod/button-clickwheel.c237
-rw-r--r--firmware/target/arm/ipod/button-mini1g.c217
-rw-r--r--firmware/target/arm/ipod/button-target.h61
-rw-r--r--firmware/target/arm/ipod/power-ipod.c81
-rw-r--r--firmware/target/arm/ipod/usb-ipod.c114
-rw-r--r--firmware/target/arm/ipod/usb-target.h24
-rw-r--r--firmware/usb.c60
-rwxr-xr-xtools/configure28
33 files changed, 1395 insertions, 649 deletions
diff --git a/firmware/FILES b/firmware/FILES
index a9d567cd0c..e153f05fed 100644
--- a/firmware/FILES
+++ b/firmware/FILES
@@ -21,3 +21,5 @@ target/arm/sandisk/sansa-e200/*.[chS]
target/arm/iriver/h10/*.[chS]
target/arm/gigabeat/meg-fx/*.[chS]
target/arm/tatung/tpj1022/*.[chS]
+target/arm/ipod/*.[chS]
+target/arm/ipod/3g/*.[chS]
diff --git a/firmware/SOURCES b/firmware/SOURCES
index bfbad42be9..96af8d3d38 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -87,13 +87,6 @@ drivers/lcd-h100-remote.c
drivers/lcd-remote-2bit-vi.c
#endif
#endif
-#if CONFIG_LCD==LCD_IPODNANO || CONFIG_LCD==LCD_IPODCOLOR \
- || CONFIG_LCD == LCD_IPOD2BPP || CONFIG_LCD == LCD_IPODMINI
-drivers/lcd-ipod.c
-#endif
-#if CONFIG_LCD==LCD_IPODVIDEO
-drivers/lcd-ipodvideo.c
-#endif
#if CONFIG_LCD==LCD_H300
drivers/lcd-h300.c
#endif
@@ -318,3 +311,95 @@ target/arm/tatung/tpj1022/lcd-tpj1022.c
target/arm/tatung/tpj1022/adc-tpj1022.c
#endif
#endif
+
+#ifdef IPOD_4G
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/backlight-4g_color.c
+target/arm/ipod/button-clickwheel.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+#endif
+#endif
+
+#ifdef IPOD_COLOR
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/backlight-4g_color.c
+target/arm/ipod/button-clickwheel.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+#endif
+#endif
+
+#ifdef IPOD_NANO
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/backlight-nano_video.c
+target/arm/ipod/button-clickwheel.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+#endif
+#endif
+
+#ifdef IPOD_VIDEO
+#ifndef SIMULATOR
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/backlight-nano_video.c
+target/arm/ipod/button-clickwheel.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+drivers/lcd-ipodvideo.c
+#endif
+#endif
+
+#ifdef IPOD_3G
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/3g/backlight-3g.c
+target/arm/ipod/3g/button-3g.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+#endif
+#endif
+
+#ifdef IPOD_MINI
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/backlight-mini1g_mini2g.c
+target/arm/ipod/button-mini1g.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+#endif
+#endif
+
+
+#ifdef IPOD_MINI2G
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/ipod/adc-ipod.c
+target/arm/ipod/backlight-mini1g_mini2g.c
+target/arm/ipod/button-clickwheel.c
+target/arm/ipod/power-ipod.c
+target/arm/ipod/usb-ipod.c
+#endif
+#endif
diff --git a/firmware/backlight.c b/firmware/backlight.c
index 5e1f5922cd..997e26daa7 100644
--- a/firmware/backlight.c
+++ b/firmware/backlight.c
@@ -77,23 +77,6 @@ static inline void __backlight_on(void)
or_b(0x40, &PADRH); /* drive it high */
#elif CONFIG_BACKLIGHT == BL_GMINI
P1 |= 0x10;
-#elif CONFIG_BACKLIGHT == BL_IPOD4G
- /* brightness full */
- outl(0x80000000 | (0xff << 16), 0x7000a010);
-
- /* set port b bit 3 on */
- outl(((0x100 | 1) << 3), 0x6000d824);
-#elif CONFIG_BACKLIGHT==BL_IPODMINI
- /* set port B03 on */
- outl(((0x100 | 1) << 3), 0x6000d824);
-#elif CONFIG_BACKLIGHT==BL_IPODNANO
- /* set port B03 on */
- outl(((0x100 | 1) << 3), 0x6000d824);
-
- /* set port L07 on */
- outl(((0x100 | 1) << 7), 0x6000d12c);
-#elif CONFIG_BACKLIGHT==BL_IPOD3G
- outl(inl(0xc0001000) | 0x02, 0xc0001000);
#elif CONFIG_BACKLIGHT==BL_IRIVER_IFP7XX
GPIO3_SET = 1;
#endif
@@ -115,23 +98,8 @@ static inline void __backlight_off(void)
and_b(~0x40, &PADRH); /* drive it low */
#elif CONFIG_BACKLIGHT == BL_GMINI
P1 &= ~0x10;
-#elif CONFIG_BACKLIGHT == BL_IPOD4G
- /* fades backlight off on 4g */
- outl(inl(0x70000084) & ~0x2000000, 0x70000084);
- outl(0x80000000, 0x7000a010);
-#elif CONFIG_BACKLIGHT==BL_IPODNANO
- /* set port B03 off */
- outl(((0x100 | 0) << 3), 0x6000d824);
-
- /* set port L07 off */
- outl(((0x100 | 0) << 7), 0x6000d12c);
#elif CONFIG_BACKLIGHT==BL_IRIVER_IFP7XX
GPIO3_CLR = 1;
-#elif CONFIG_BACKLIGHT==BL_IPOD3G
- outl(inl(0xc0001000) & ~0x02, 0xc0001000);
-#elif CONFIG_BACKLIGHT==BL_IPODMINI
- /* set port B03 off */
- outl(((0x100 | 0) << 3), 0x6000d824);
#endif
}
#endif
diff --git a/firmware/drivers/adc.c b/firmware/drivers/adc.c
index d00f89958a..9e6ed19e4b 100644
--- a/firmware/drivers/adc.c
+++ b/firmware/drivers/adc.c
@@ -23,7 +23,6 @@
#include "thread.h"
#include "string.h"
#include "adc.h"
-#include "pcf50605.h"
#include "pcf50606.h"
#if CONFIG_CPU == SH7034
@@ -285,62 +284,6 @@ void adc_init(void)
sleep(2); /* Ensure valid readings when adc_init returns */
}
-#elif defined(IPOD_ARCH)
-
-struct adc_struct {
- long timeout;
- void (*conversion)(unsigned short *data);
- short channelnum;
- unsigned short data;
-};
-
-static struct adc_struct adcdata[NUM_ADC_CHANNELS] IDATA_ATTR;
-
-static unsigned short _adc_read(struct adc_struct *adc)
-{
- if (adc->timeout < current_tick) {
- unsigned char data[2];
- unsigned short value;
- /* 5x per 2 seconds */
- adc->timeout = current_tick + (HZ * 2 / 5);
-
- /* ADCC1, 10 bit, start */
- pcf50605_write(0x2f, (adc->channelnum << 1) | 0x1);
- pcf50605_read_multiple(0x30, data, 2); /* ADCS1, ADCS2 */
- value = data[0];
- value <<= 2;
- value |= data[1] & 0x3;
-
- if (adc->conversion) {
- adc->conversion(&value);
- }
- adc->data = value;
- return value;
- } else {
- return adc->data;
- }
-}
-
-/* Force an ADC scan _now_ */
-unsigned short adc_scan(int channel) {
- struct adc_struct *adc = &adcdata[channel];
- adc->timeout = 0;
- return _adc_read(adc);
-}
-
-/* Retrieve the ADC value, only does a scan periodically */
-unsigned short adc_read(int channel) {
- return _adc_read(&adcdata[channel]);
-}
-
-void adc_init(void)
-{
- struct adc_struct *adc_battery = &adcdata[ADC_BATTERY];
- adc_battery->channelnum = 0x2; /* ADCVIN1, resistive divider */
- adc_battery->timeout = 0;
- _adc_read(adc_battery);
-}
-
#elif CONFIG_CPU == PNX0101
static unsigned short adcdata[NUM_ADC_CHANNELS];
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c
index 599c22bc80..8acae01006 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);
diff --git a/firmware/drivers/power.c b/firmware/drivers/power.c
index d5b75a130d..cfe64c965e 100644
--- a/firmware/drivers/power.c
+++ b/firmware/drivers/power.c
@@ -84,8 +84,6 @@ void power_init(void)
pcf50606_init();
#endif
#endif
-#elif CONFIG_CPU == PP5020 || CONFIG_CPU == PP5002
- pcf50605_init();
#else
#ifdef HAVE_POWEROFF_ON_PB5
PBCR2 &= ~0x0c00; /* GPIO for PB5 */
@@ -123,12 +121,6 @@ bool charger_inserted(void)
return (adc_read(ADC_CHARGE_REGULATOR) < 0x1FF);
#elif defined(TOSHIBA_GIGABEAT_F)
return false;
-#elif defined(IPOD_VIDEO)
- return (GPIOL_INPUT_VAL & 0x08)?false:true;
-#elif defined(IPOD_ARCH)
- /* This needs filling in for other ipods. */
- return false;
-#else
/* Player */
return (PADR & 1) == 0;
#endif
@@ -166,8 +158,6 @@ bool charging_state(void) {
return charger_inserted();
#elif defined IRIVER_H300_SERIES
return (GPIO_READ & 0x00800000)?true:false;
-#elif defined IPOD_VIDEO
- return (GPIOB_INPUT_VAL & 0x01)?false:true;
#endif
}
#endif
@@ -201,8 +191,6 @@ void ide_power_enable(bool on)
or_l(0x80000000, &GPIO_OUT);
#elif defined(IAUDIO_X5)
/* X5 TODO */
-#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
- /* We do nothing on the iPod */
#elif defined(GMINI_ARCH)
if(on)
P1 |= 0x08;
@@ -259,9 +247,6 @@ bool ide_powered(void)
return (GPIO_OUT & 0x80000000)?false:true;
#elif defined(IAUDIO_X5)
return false; /* X5 TODO */
-#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
- /* pretend we are always powered - we don't turn it off on the ipod */
- return true;
#elif defined(GMINI_ARCH)
return (P1 & 0x08?true:false);
#elif defined(TOSHIBA_GIGABEAT_F)
@@ -296,11 +281,6 @@ void power_off(void)
#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
and_l(~0x00080000, &GPIO1_OUT);
asm("halt");
-#elif (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
-#ifndef BOOTLOADER
- /* We don't turn off the ipod, we put it in a deep sleep */
- pcf50605_standby_mode();
-#endif
#elif CONFIG_CPU == PNX0101
GPIO1_CLR = 1 << 16;
GPIO2_SET = 1;
diff --git a/firmware/export/adc.h b/firmware/export/adc.h
index 3a438832d6..13d2617c00 100644
--- a/firmware/export/adc.h
+++ b/firmware/export/adc.h
@@ -24,12 +24,6 @@
#ifdef TARGET_TREE
#include "adc-target.h"
-#elif defined(IPOD_ARCH)
-#define NUM_ADC_CHANNELS 1
-
-#define ADC_BATTERY 0
-#define ADC_UNREG_POWER ADC_BATTERY
-
#elif defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
#define NUM_ADC_CHANNELS 4
@@ -106,8 +100,7 @@
unsigned short adc_read(int channel);
void adc_init(void);
-#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)\
- || defined(IPOD_ARCH)
+#if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES)
/* Force a scan now */
unsigned short adc_scan(int channel);
#endif
diff --git a/firmware/export/button.h b/firmware/export/button.h
index 4ff04202d5..686fe79937 100644
--- a/firmware/export/button.h
+++ b/firmware/export/button.h
@@ -26,9 +26,7 @@
(CONFIG_KEYPAD == IRIVER_H300_PAD)
#define HAS_BUTTON_HOLD
#define HAS_REMOTE_BUTTON_HOLD
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
- (CONFIG_KEYPAD == IPOD_3G_PAD) || \
- (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
+#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
#define HAS_BUTTON_HOLD
#endif
extern struct event_queue button_queue;
@@ -222,30 +220,6 @@ void wheel_send_events(bool send);
#define BUTTON_REMOTE 0
-#elif ((CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD))
-
- /* iPod specific button codes */
-
-#define BUTTON_SELECT 0x00000001
-#define BUTTON_MENU 0x00000002
-
-#define BUTTON_LEFT 0x00000004
-#define BUTTON_RIGHT 0x00000008
-#define BUTTON_SCROLL_FWD 0x00000010
-#define BUTTON_SCROLL_BACK 0x00000020
-
-#define BUTTON_PLAY 0x00000040
-
-#define BUTTON_MAIN (BUTTON_SELECT|BUTTON_MENU\
- |BUTTON_LEFT|BUTTON_RIGHT|BUTTON_SCROLL_FWD\
- |BUTTON_SCROLL_BACK|BUTTON_PLAY)
-
-#define BUTTON_REMOTE 0
-
-/* This is for later
-#define BUTTON_SCROLL_TOUCH 0x00000200
-*/
-
#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
/* iriver IFP7XX specific button codes */
diff --git a/firmware/export/config-ipod3g.h b/firmware/export/config-ipod3g.h
index 94035069a5..e94c3c087c 100644
--- a/firmware/export/config-ipod3g.h
+++ b/firmware/export/config-ipod3g.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod 3g
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 7
@@ -101,6 +101,10 @@
#define USB_NONE
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING 5
+#define MAX_CONTRAST_SETTING 63
+#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
/* Virtual LED (icon) */
#define CONFIG_LED LED_VIRTUAL
diff --git a/firmware/export/config-ipod4g.h b/firmware/export/config-ipod4g.h
index 2b603987f4..c61ab05b77 100644
--- a/firmware/export/config-ipod4g.h
+++ b/firmware/export/config-ipod4g.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod Color/Photo
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 8
@@ -100,6 +100,11 @@
#define USB_IPODSTYLE
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING 5
+#define MAX_CONTRAST_SETTING 63
+#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
+
/* define this if the unit can be powered or charged via USB */
#define HAVE_USB_POWER
diff --git a/firmware/export/config-ipodcolor.h b/firmware/export/config-ipodcolor.h
index 0bcb25b56c..0f8a56fe8b 100644
--- a/firmware/export/config-ipodcolor.h
+++ b/firmware/export/config-ipodcolor.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod Color/Photo
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 3
diff --git a/firmware/export/config-ipodmini.h b/firmware/export/config-ipodmini.h
index f2f96946c9..a089ebdd78 100644
--- a/firmware/export/config-ipodmini.h
+++ b/firmware/export/config-ipodmini.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod Mini (1st Gen)
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 9 /* TODO: change to 9 */
@@ -100,6 +100,11 @@
#define USB_IPODSTYLE
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING 5
+#define MAX_CONTRAST_SETTING 63
+#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
+
/* define this if the unit can be powered or charged via USB */
#define HAVE_USB_POWER
diff --git a/firmware/export/config-ipodmini2g.h b/firmware/export/config-ipodmini2g.h
index bac60e3e72..c37be05400 100755
--- a/firmware/export/config-ipodmini2g.h
+++ b/firmware/export/config-ipodmini2g.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod Mini 2nd Gen
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 11
@@ -103,6 +103,11 @@
#define USB_IPODSTYLE
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING 5
+#define MAX_CONTRAST_SETTING 63
+#define DEFAULT_CONTRAST_SETTING 40 /* Match boot contrast */
+
/* define this if the unit can be powered or charged via USB */
#define HAVE_USB_POWER
diff --git a/firmware/export/config-ipodnano.h b/firmware/export/config-ipodnano.h
index c24aa43e55..258d93bad5 100644
--- a/firmware/export/config-ipodnano.h
+++ b/firmware/export/config-ipodnano.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod Nano
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 4
diff --git a/firmware/export/config-ipodvideo.h b/firmware/export/config-ipodvideo.h
index cd8f1eea11..530417d612 100644
--- a/firmware/export/config-ipodvideo.h
+++ b/firmware/export/config-ipodvideo.h
@@ -1,7 +1,7 @@
/*
* This config file is for the Apple iPod Video
*/
-#define IPOD_ARCH 1
+#define TARGET_TREE /* this target is using the target tree system */
/* For Rolo and boot loader */
#define MODEL_NUMBER 5
diff --git a/firmware/export/pcf50605.h b/firmware/export/pcf50605.h
index eeb09b4612..eb899afc86 100644
--- a/firmware/export/pcf50605.h
+++ b/firmware/export/pcf50605.h
@@ -20,7 +20,6 @@
#ifndef PCF50605_H
#define PCF50605_H
-#ifdef IPOD_ARCH
int pcf50605_read(int address);
int pcf50605_read_multiple(int address, unsigned char* buf, int count);
int pcf50605_write(int address, unsigned char val);
@@ -29,6 +28,5 @@ int pcf50605_a2d_read(int channel);
bool pcf50605_charger_inserted(void);
void pcf50605_standby_mode(void);
void pcf50605_init(void);
-#endif
#endif
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c
index be63aae106..b9d67ce02a 100644
--- a/firmware/powermgmt.c
+++ b/firmware/powermgmt.c
@@ -1077,15 +1077,6 @@ void shutdown_hw(void)
#endif
backlight_off();
#endif /* IAUDIO_X5 */
-#if defined(IPOD_ARCH) && defined(HAVE_LCD_COLOR)
- /* Clear the screen and backdrop to
- remove ghosting effect on shutdown */
- lcd_set_backdrop(NULL);
- lcd_set_background(LCD_WHITE);
- lcd_clear_display();
- lcd_update();
- sleep(HZ/16);
-#endif
#ifndef IAUDIO_X5
lcd_set_contrast(0);
#endif
diff --git a/firmware/target/arm/ipod/3g/backlight-3g.c b/firmware/target/arm/ipod/3g/backlight-3g.c
new file mode 100644
index 0000000000..b676e2473b
--- /dev/null
+++ b/firmware/target/arm/ipod/3g/backlight-3g.c
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include <stdlib.h>
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "i2c.h"
+#include "debug.h"
+#include "rtc.h"
+#include "usb.h"
+#include "power.h"
+#include "system.h"
+#include "button.h"
+#include "timer.h"
+#include "backlight.h"
+
+inline void __backlight_on(void)
+{
+ outl(inl(0xc0001000) | 0x02, 0xc0001000);
+}
+
+inline void __backlight_off(void)
+{
+ outl(inl(0xc0001000) & ~0x02, 0xc0001000);
+}
diff --git a/firmware/target/arm/ipod/3g/button-3g.c b/firmware/target/arm/ipod/3g/button-3g.c
new file mode 100644
index 0000000000..7244dd597b
--- /dev/null
+++ b/firmware/target/arm/ipod/3g/button-3g.c
@@ -0,0 +1,189 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg
+ *
+ * iPod driver based on code from the ipodlinux project - http://ipodlinux.org
+ * Adapted for Rockbox in December 2005
+ * Original file: linux/arch/armnommu/mach-ipod/keyboard.c
+ * Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
+ *
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/*
+ * Rockbox button functions
+ */
+
+#include <stdlib.h>
+#include "config.h"
+#include "cpu.h"
+#include "system.h"
+#include "button.h"
+#include "kernel.h"
+#include "backlight.h"
+#include "adc.h"
+#include "serial.h"
+#include "power.h"
+#include "system.h"
+#include "powermgmt.h"
+
+/* 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;
+}
+
+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;
+}
+
+void button_init_device(void)
+{
+ GPIOA_INT_LEV = ~GPIOA_INPUT_VAL;
+ GPIOA_INT_CLR = GPIOA_INT_STAT;
+ GPIOA_INT_EN = 0xff;
+}
+
+/*
+ * Get button pressed from hardware
+ */
+int button_read_device(void)
+{
+ 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);
+
+ return ipod_3g_button_read();
+}
+
+bool button_hold(void)
+{
+ return (GPIOA_INPUT_VAL & 0x20)?false:true;
+}
diff --git a/firmware/target/arm/ipod/adc-ipod.c b/firmware/target/arm/ipod/adc-ipod.c
new file mode 100644
index 0000000000..d351f0ee81
--- /dev/null
+++ b/firmware/target/arm/ipod/adc-ipod.c
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "cpu.h"
+#include "system.h"
+#include "kernel.h"
+#include "thread.h"
+#include "string.h"
+#include "adc.h"
+#include "pcf50605.h"
+
+struct adc_struct {
+ long timeout;
+ void (*conversion)(unsigned short *data);
+ short channelnum;
+ unsigned short data;
+};
+
+static struct adc_struct adcdata[NUM_ADC_CHANNELS] IDATA_ATTR;
+
+static unsigned short _adc_read(struct adc_struct *adc)
+{
+ if (adc->timeout < current_tick) {
+ unsigned char data[2];
+ unsigned short value;
+ /* 5x per 2 seconds */
+ adc->timeout = current_tick + (HZ * 2 / 5);
+
+ /* ADCC1, 10 bit, start */
+ pcf50605_write(0x2f, (adc->channelnum << 1) | 0x1);
+ pcf50605_read_multiple(0x30, data, 2); /* ADCS1, ADCS2 */
+ value = data[0];
+ value <<= 2;
+ value |= data[1] & 0x3;
+
+ if (adc->conversion) {
+ adc->conversion(&value);
+ }
+ adc->data = value;
+ return value;
+ } else {
+ return adc->data;
+ }
+}
+
+/* Force an ADC scan _now_ */
+unsigned short adc_scan(int channel) {
+ struct adc_struct *adc = &adcdata[channel];
+ adc->timeout = 0;
+ return _adc_read(adc);
+}
+
+/* Retrieve the ADC value, only does a scan periodically */
+unsigned short adc_read(int channel) {
+ return _adc_read(&adcdata[channel]);
+}
+
+void adc_init(void)
+{
+ struct adc_struct *adc_battery = &adcdata[ADC_BATTERY];
+ adc_battery->channelnum = 0x2; /* ADCVIN1, resistive divider */
+ adc_battery->timeout = 0;
+ _adc_read(adc_battery);
+}
diff --git a/firmware/target/arm/ipod/adc-target.h b/firmware/target/arm/ipod/adc-target.h
new file mode 100644
index 0000000000..8458779b59
--- /dev/null
+++ b/firmware/target/arm/ipod/adc-target.h
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef _ADC_TARGET_H_
+#define _ADC_TARGET_H_
+
+#define NUM_ADC_CHANNELS 1
+
+#define ADC_BATTERY 0
+#define ADC_UNREG_POWER ADC_BATTERY
+
+/* Force a scan now */
+unsigned short adc_scan(int channel);
+#endif
diff --git a/firmware/target/arm/ipod/backlight-4g_color.c b/firmware/target/arm/ipod/backlight-4g_color.c
new file mode 100644
index 0000000000..be1dff7c0b
--- /dev/null
+++ b/firmware/target/arm/ipod/backlight-4g_color.c
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include <stdlib.h>
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "i2c.h"
+#include "debug.h"
+#include "rtc.h"
+#include "usb.h"
+#include "power.h"
+#include "system.h"
+#include "button.h"
+#include "timer.h"
+#include "backlight.h"
+
+inline void __backlight_on(void)
+{
+ /* brightness full */
+ outl(0x80000000 | (0xff << 16), 0x7000a010);
+
+ /* set port b bit 3 on */
+ outl(((0x100 | 1) << 3), 0x6000d824);
+}
+
+inline void __backlight_off(void)
+{
+ /* fades backlight off on 4g */
+ outl(inl(0x70000084) & ~0x2000000, 0x70000084);
+ outl(0x80000000, 0x7000a010);
+}
diff --git a/firmware/target/arm/ipod/backlight-mini1g_mini2g.c b/firmware/target/arm/ipod/backlight-mini1g_mini2g.c
new file mode 100644
index 0000000000..6cfa8f889c
--- /dev/null
+++ b/firmware/target/arm/ipod/backlight-mini1g_mini2g.c
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include <stdlib.h>
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "i2c.h"
+#include "debug.h"
+#include "rtc.h"
+#include "usb.h"
+#include "power.h"
+#include "system.h"
+#include "button.h"
+#include "timer.h"
+#include "backlight.h"
+
+inline void __backlight_on(void)
+{
+ /* set port B03 on */
+ outl(((0x100 | 1) << 3), 0x6000d824);
+}
+
+inline void __backlight_off(void)
+{
+ /* set port B03 off */
+ outl(((0x100 | 0) << 3), 0x6000d824);
+}
diff --git a/firmware/target/arm/ipod/backlight-nano_video.c b/firmware/target/arm/ipod/backlight-nano_video.c
new file mode 100644
index 0000000000..5559709333
--- /dev/null
+++ b/firmware/target/arm/ipod/backlight-nano_video.c
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include <stdlib.h>
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "i2c.h"
+#include "debug.h"
+#include "rtc.h"
+#include "usb.h"
+#include "power.h"
+#include "system.h"
+#include "button.h"
+#include "timer.h"
+#include "backlight.h"
+
+inline void __backlight_on(void)
+{
+ /* set port B03 on */
+ outl(((0x100 | 1) << 3), 0x6000d824);
+
+ /* set port L07 on */
+ outl(((0x100 | 1) << 7), 0x6000d12c);
+}
+
+inline void __backlight_off(void)
+{
+ /* set port B03 off */
+ outl(((0x100 | 0) << 3), 0x6000d824);
+
+ /* set port L07 off */
+ outl(((0x100 | 0) << 7), 0x6000d12c);
+}
diff --git a/firmware/target/arm/ipod/backlight-target.h b/firmware/target/arm/ipod/backlight-target.h
new file mode 100644
index 0000000000..d35dccdc4a
--- /dev/null
+++ b/firmware/target/arm/ipod/backlight-target.h
@@ -0,0 +1,25 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef BACKLIGHT_TARGET_H
+#define BACKLIGHT_TARGET_H
+
+void __backlight_on(void);
+void __backlight_off(void);
+
+#endif
diff --git a/firmware/target/arm/ipod/button-clickwheel.c b/firmware/target/arm/ipod/button-clickwheel.c
new file mode 100644
index 0000000000..4c536343c4
--- /dev/null
+++ b/firmware/target/arm/ipod/button-clickwheel.c
@@ -0,0 +1,237 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg
+ *
+ * iPod driver based on code from the ipodlinux project - http://ipodlinux.org
+ * Adapted for Rockbox in December 2005
+ * Original file: linux/arch/armnommu/mach-ipod/keyboard.c
+ * Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
+ *
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/*
+ * Rockbox button functions
+ */
+
+#include <stdlib.h>
+#include "config.h"
+#include "cpu.h"
+#include "system.h"
+#include "button.h"
+#include "kernel.h"
+#include "backlight.h"
+#include "adc.h"
+#include "serial.h"
+#include "power.h"
+#include "system.h"
+#include "powermgmt.h"
+
+/* 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
+
+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;
+}
+
+#ifdef HAVE_WHEEL_POSITION
+int wheel_status(void)
+{
+ return wheel_position;
+}
+
+void wheel_send_events(bool send)
+{
+ send_events = send;
+}
+#endif
+
+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;
+}
+
+void button_init_device(void)
+{
+ 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;
+}
+
+/*
+ * Get button pressed from hardware
+ */
+int button_read_device(void)
+{
+ 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);
+
+ /* The int_btn variable is set in the button interrupt handler */
+ return int_btn;
+}
+
+bool button_hold(void)
+{
+ return (GPIOA_INPUT_VAL & 0x20)?false:true;
+}
diff --git a/firmware/target/arm/ipod/button-mini1g.c b/firmware/target/arm/ipod/button-mini1g.c
new file mode 100644
index 0000000000..07885bc159
--- /dev/null
+++ b/firmware/target/arm/ipod/button-mini1g.c
@@ -0,0 +1,217 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg
+ *
+ * iPod driver based on code from the ipodlinux project - http://ipodlinux.org
+ * Adapted for Rockbox in December 2005
+ * Original file: linux/arch/armnommu/mach-ipod/keyboard.c
+ * Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
+ *
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+/*
+ * Rockbox button functions
+ */
+
+#include <stdlib.h>
+#include "config.h"
+#include "cpu.h"
+#include "system.h"
+#include "button.h"
+#include "kernel.h"
+#include "backlight.h"
+#include "adc.h"
+#include "serial.h"
+#include "power.h"
+#include "system.h"
+#include "powermgmt.h"
+
+/* 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
+
+/* 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;
+}
+
+/* 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;
+}
+
+void button_init_device(void)
+{
+ /* 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;
+}
+
+/*
+ * Get button pressed from hardware
+ */
+int button_read_device(void)
+{
+ 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);
+
+ /* The int_btn variable is set in the button interrupt handler */
+ return int_btn;
+}
+
+bool button_hold(void)
+{
+ return (GPIOA_INPUT_VAL & 0x20)?false:true;
+}
diff --git a/firmware/target/arm/ipod/button-target.h b/firmware/target/arm/ipod/button-target.h
new file mode 100644
index 0000000000..d736effb72
--- /dev/null
+++ b/firmware/target/arm/ipod/button-target.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardell
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef _BUTTON_TARGET_H_
+#define _BUTTON_TARGET_H_
+
+#include <stdbool.h>
+#include "config.h"
+
+#define HAS_BUTTON_HOLD
+
+bool button_hold(void);
+void button_init_device(void);
+int button_read_device(void);
+
+void handle_scroll_wheel(int new_scroll, int was_hold, int reverse);
+void ipod_mini_button_int(void);
+void ipod_4g_button_int(void);
+
+/* iPod specific button codes */
+
+#define BUTTON_SELECT 0x00000001
+#define BUTTON_MENU 0x00000002
+
+#define BUTTON_LEFT 0x00000004
+#define BUTTON_RIGHT 0x00000008
+#define BUTTON_SCROLL_FWD 0x00000010
+#define BUTTON_SCROLL_BACK 0x00000020
+
+#define BUTTON_PLAY 0x00000040
+
+#define BUTTON_MAIN (BUTTON_SELECT|BUTTON_MENU\
+ |BUTTON_LEFT|BUTTON_RIGHT|BUTTON_SCROLL_FWD\
+ |BUTTON_SCROLL_BACK|BUTTON_PLAY)
+
+#define BUTTON_REMOTE 0
+
+/* This is for later
+#define BUTTON_SCROLL_TOUCH 0x00000200
+*/
+
+
+#define POWEROFF_BUTTON BUTTON_PLAY
+#define POWEROFF_COUNT 40
+
+#endif /* _BUTTON_TARGET_H_ */
diff --git a/firmware/target/arm/ipod/power-ipod.c b/firmware/target/arm/ipod/power-ipod.c
new file mode 100644
index 0000000000..8932b95cdd
--- /dev/null
+++ b/firmware/target/arm/ipod/power-ipod.c
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "cpu.h"
+#include <stdbool.h>
+#include "adc.h"
+#include "kernel.h"
+#include "system.h"
+#include "power.h"
+#include "hwcompat.h"
+#include "logf.h"
+#include "pcf50605.h"
+#include "usb.h"
+#include "lcd.h"
+
+void power_init(void)
+{
+ pcf50605_init();
+}
+
+bool charger_inserted(void)
+{
+#ifdef IPOD_VIDEO
+ return (GPIOL_INPUT_VAL & 0x08)?false:true;
+#else
+ /* This needs filling in for other ipods. */
+ return false;
+#endif
+}
+
+/* Returns true if the unit is charging the batteries. */
+bool charging_state(void) {
+ return (GPIOB_INPUT_VAL & 0x01)?false:true;
+}
+
+
+void ide_power_enable(bool on)
+{
+ /* We do nothing on the iPod */
+ (void)on;
+}
+
+bool ide_powered(void)
+{
+ /* pretend we are always powered - we don't turn it off on the ipod */
+ return true;
+}
+
+void power_off(void)
+{
+#if defined(HAVE_LCD_COLOR)
+ /* Clear the screen and backdrop to
+ remove ghosting effect on shutdown */
+ lcd_set_backdrop(NULL);
+ lcd_set_background(LCD_WHITE);
+ lcd_clear_display();
+ lcd_update();
+ sleep(HZ/16);
+#endif
+
+#ifndef BOOTLOADER
+ /* We don't turn off the ipod, we put it in a deep sleep */
+ pcf50605_standby_mode();
+#endif
+}
diff --git a/firmware/target/arm/ipod/usb-ipod.c b/firmware/target/arm/ipod/usb-ipod.c
new file mode 100644
index 0000000000..c481355768
--- /dev/null
+++ b/firmware/target/arm/ipod/usb-ipod.c
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * iPod driver based on code from the ipodlinux project - http://ipodlinux.org
+ * Adapted for Rockbox in January 2006
+ * Original file: podzilla/usb.c
+ * Copyright (C) 2005 Adam Johnston
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "cpu.h"
+#include "kernel.h"
+#include "thread.h"
+#include "system.h"
+#include "debug.h"
+#include "ata.h"
+#include "fat.h"
+#include "disk.h"
+#include "panic.h"
+#include "lcd.h"
+#include "adc.h"
+#include "usb.h"
+#include "button.h"
+#include "sprintf.h"
+#include "string.h"
+#include "hwcompat.h"
+
+void usb_init_device(void)
+{
+ int r0;
+ outl(inl(0x70000084) | 0x200, 0x70000084);
+
+ outl(inl(0x7000002C) | 0x3000000, 0x7000002C);
+ outl(inl(0x6000600C) | 0x400000, 0x6000600C);
+
+ outl(inl(0x60006004) | 0x400000, 0x60006004); /* reset usb start */
+ outl(inl(0x60006004) & ~0x400000, 0x60006004); /* reset usb end */
+
+ outl(inl(0x70000020) | 0x80000000, 0x70000020);
+ while ((inl(0x70000028) & 0x80) == 0);
+
+ outl(inl(0xc5000184) | 0x100, 0xc5000184);
+ while ((inl(0xc5000184) & 0x100) != 0);
+
+ outl(inl(0xc50001A4) | 0x5F000000, 0xc50001A4);
+ if ((inl(0xc50001A4) & 0x100) == 0) {
+ outl(inl(0xc50001A8) & ~0x3, 0xc50001A8);
+ outl(inl(0xc50001A8) | 0x2, 0xc50001A8);
+ outl(inl(0x70000028) | 0x4000, 0x70000028);
+ outl(inl(0x70000028) | 0x2, 0x70000028);
+ } else {
+ outl(inl(0xc50001A8) | 0x3, 0xc50001A8);
+ outl(inl(0x70000028) &~0x4000, 0x70000028);
+ outl(inl(0x70000028) | 0x2, 0x70000028);
+ }
+ outl(inl(0xc5000140) | 0x2, 0xc5000140);
+ while((inl(0xc5000140) & 0x2) != 0);
+ r0 = inl(0xc5000184);
+
+ /* Note from IPL source (referring to next 5 lines of code:
+ THIS NEEDS TO BE CHANGED ONCE THERE IS KERNEL USB */
+ outl(inl(0x70000020) | 0x80000000, 0x70000020);
+ outl(inl(0x6000600C) | 0x400000, 0x6000600C);
+ while ((inl(0x70000028) & 0x80) == 0);
+ outl(inl(0x70000028) | 0x2, 0x70000028);
+
+ udelay(0x186A0);
+}
+
+void usb_enable(bool on)
+{
+ /* For the ipod, we can only do one thing with USB mode - reboot
+ into Apple's flash-based disk-mode. This does not return. */
+ if (on)
+ {
+ /* The following code is copied from ipodlinux */
+#if defined(IPOD_COLOR) || defined(IPOD_3G) || \
+ defined(IPOD_4G) || defined(IPOD_MINI)
+ unsigned char* storage_ptr = (unsigned char *)0x40017F00;
+#elif defined(IPOD_NANO) || defined(IPOD_VIDEO) || defined(IPOD_MINI2G)
+ unsigned char* storage_ptr = (unsigned char *)0x4001FF00;
+#endif
+ memcpy(storage_ptr, "diskmode\0\0hotstuff\0\0\1", 21);
+ DEV_RS |= 4; /* Reboot */
+ }
+}
+
+bool usb_detect(void)
+{
+ bool current_status;
+
+ /* The following check is in the ipodlinux source, with the
+ comment "USB2D_IDENT is bad" if USB2D_IDENT != 0x22FA05 */
+ if (USB2D_IDENT != 0x22FA05) {
+ return false;
+ }
+ current_status = (USB_STATUS & 0x800)?true:false;
+
+ return current_status;
+}
diff --git a/firmware/target/arm/ipod/usb-target.h b/firmware/target/arm/ipod/usb-target.h
new file mode 100644
index 0000000000..69a81472f8
--- /dev/null
+++ b/firmware/target/arm/ipod/usb-target.h
@@ -0,0 +1,24 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Barry Wardelll
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#ifndef USB_TARGET_H
+#define USB_TARGET_H
+
+bool usb_init_device(void);
+
+#endif
diff --git a/firmware/usb.c b/firmware/usb.c
index ce9d1ce69f..f83cb44e17 100644
--- a/firmware/usb.c
+++ b/firmware/usb.c
@@ -175,23 +175,6 @@ void usb_enable(bool on)
or_l(0x00000008,&GPIO1_OUT);
#endif
}
-
-#elif defined(USB_IPODSTYLE)
- /* For the ipod, we can only do one thing with USB mode - reboot
- into Apple's flash-based disk-mode. This does not return. */
- if (on)
- {
- /* The following code is copied from ipodlinux */
-#if defined(IPOD_COLOR) || defined(IPOD_3G) || \
- defined(IPOD_4G) || defined(IPOD_MINI)
- unsigned char* storage_ptr = (unsigned char *)0x40017F00;
-#elif defined(IPOD_NANO) || defined(IPOD_VIDEO) || defined(IPOD_MINI2G)
- unsigned char* storage_ptr = (unsigned char *)0x4001FF00;
-#endif
- memcpy(storage_ptr, "diskmode\0\0hotstuff\0\0\1", 21);
- DEV_RS |= 4; /* Reboot */
- }
-
#elif defined(USB_ISP1582)
/* TODO: Implement USB_ISP1582 */
(void) on;
@@ -496,7 +479,9 @@ void usb_init(void)
usb_monitor_enabled = false;
countdown = -1;
-#ifdef USB_IRIVERSTYLE
+#ifdef TARGET_TREE
+ usb_init_device();
+#elif defined USB_IRIVERSTYLE
or_l(0x00000080, &GPIO1_FUNCTION); /* GPIO39 is the USB detect input */
#ifdef IRIVER_H300_SERIES
@@ -514,45 +499,6 @@ void usb_init(void)
or_l(0x01000040, &GPIO_FUNCTION);
#endif
-#elif defined(USB_IPODSTYLE)
- int r0;
- outl(inl(0x70000084) | 0x200, 0x70000084);
-
- outl(inl(0x7000002C) | 0x3000000, 0x7000002C);
- outl(inl(0x6000600C) | 0x400000, 0x6000600C);
-
- outl(inl(0x60006004) | 0x400000, 0x60006004); /* reset usb start */
- outl(inl(0x60006004) & ~0x400000, 0x60006004); /* reset usb end */
-
- outl(inl(0x70000020) | 0x80000000, 0x70000020);
- while ((inl(0x70000028) & 0x80) == 0);
-
- outl(inl(0xc5000184) | 0x100, 0xc5000184);
- while ((inl(0xc5000184) & 0x100) != 0);
-
- outl(inl(0xc50001A4) | 0x5F000000, 0xc50001A4);
- if ((inl(0xc50001A4) & 0x100) == 0) {
- outl(inl(0xc50001A8) & ~0x3, 0xc50001A8);
- outl(inl(0xc50001A8) | 0x2, 0xc50001A8);
- outl(inl(0x70000028) | 0x4000, 0x70000028);
- outl(inl(0x70000028) | 0x2, 0x70000028);
- } else {
- outl(inl(0xc50001A8) | 0x3, 0xc50001A8);
- outl(inl(0x70000028) &~0x4000, 0x70000028);
- outl(inl(0x70000028) | 0x2, 0x70000028);
- }
- outl(inl(0xc5000140) | 0x2, 0xc5000140);
- while((inl(0xc5000140) & 0x2) != 0);
- r0 = inl(0xc5000184);
-
- /* Note from IPL source (referring to next 5 lines of code:
- THIS NEEDS TO BE CHANGED ONCE THERE IS KERNEL USB */
- outl(inl(0x70000020) | 0x80000000, 0x70000020);
- outl(inl(0x6000600C) | 0x400000, 0x6000600C);
- while ((inl(0x70000028) & 0x80) == 0);
- outl(inl(0x70000028) | 0x2, 0x70000028);
-
- udelay(0x186A0);
#endif
usb_enable(false);
diff --git a/tools/configure b/tools/configure
index bbbdc50150..b0f54e96c4 100755
--- a/tools/configure
+++ b/tools/configure
@@ -777,6 +777,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="color"
;;
21|ipodnano)
@@ -799,6 +803,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="nano"
;;
22|ipodvideo)
@@ -821,6 +829,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="video"
;;
23|ipod3g)
@@ -843,6 +855,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="3g"
;;
24|ipod4g)
@@ -865,6 +881,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="4g"
;;
25|ipodmini)
@@ -887,6 +907,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="mini"
;;
13|ifp7xx)
@@ -953,6 +977,10 @@ EOF
# toolset is the tools within the tools directory that we build for
# this particular target.
toolset=$ipodbitmaptools
+ # architecture, manufacturer and model for the target-tree build
+ t_cpu="arm"
+ t_manufacturer="ipod"
+ t_model="mini2g"
;;
14|h10)