Index: firmware/SOURCES
===================================================================
RCS file: /cvsroot/rockbox/firmware/SOURCES,v
retrieving revision 1.115
diff -u -r1.115 SOURCES
--- firmware/SOURCES	29 Sep 2006 11:01:26 -0000	1.115
+++ firmware/SOURCES	1 Oct 2006 16:54:45 -0000
@@ -87,13 +87,6 @@
 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/adc-tpj1022.c
 #endif
 #endif
+
+#ifdef IPOD_4G
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipod4g/backlight-ipod4g.c
+target/arm/apple/button-apple-4g.c
+target/arm/apple/power-apple.c
+target/arm/apple/usb-apple.c
+#endif
+#endif
+
+#ifdef IPOD_COLOR
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipodcolor/backlight-ipodcolor.c
+target/arm/apple/button-apple-4g.c
+target/arm/apple/power-apple.c
+target/arm/apple/usb-apple.c
+#endif
+#endif
+
+#ifdef IPOD_NANO
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipodnano/backlight-ipodnano.c
+target/arm/apple/button-apple-4g.c
+target/arm/apple/power-apple.c
+target/arm/apple/usb-apple.c
+#endif
+#endif
+
+#ifdef IPOD_VIDEO
+#ifndef SIMULATOR
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipodvideo/backlight-ipodvideo.c
+target/arm/apple/button-apple-4g.c
+target/arm/apple/ipodvideo/power-ipodvideo.c
+target/arm/apple/usb-apple.c
+target/arm/apple/ipodvideo/lcd-ipodvideo.c
+#endif
+#endif
+
+#ifdef IPOD_3G
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipod3g/backlight-ipod3g.c
+target/arm/apple/ipod3g/button-ipod3g.c
+target/arm/apple/power-apple.c
+target/arm/apple/usb-apple.c
+#endif
+#endif
+
+#ifdef IPOD_MINI
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipodmini/backlight-ipodmini.c
+target/arm/apple/ipodmini/button-ipodmini.c
+target/arm/apple/power-apple.c
+target/arm/apple/usb-apple.c
+#endif
+#endif
+
+
+#ifdef IPOD_MINI2G
+#ifndef SIMULATOR
+drivers/lcd-ipod.c
+drivers/pcf50605.c
+target/arm/ata-pp5020.c
+target/arm/apple/adc-apple.c
+target/arm/apple/ipodmini2g/backlight-ipodmini2g.c
+target/arm/apple/button-apple-4g.c
+target/arm/apple/power-apple.c
+target/arm/apple/usb-apple.c
+#endif
+#endif
Index: firmware/backlight.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/backlight.c,v
retrieving revision 1.102
diff -u -r1.102 backlight.c
--- firmware/backlight.c	16 Sep 2006 20:32:20 -0000	1.102
+++ firmware/backlight.c	1 Oct 2006 16:54:46 -0000
@@ -77,23 +77,6 @@
     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 @@
     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
Index: firmware/powermgmt.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/powermgmt.c,v
retrieving revision 1.124
diff -u -r1.124 powermgmt.c
--- firmware/powermgmt.c	23 Sep 2006 17:47:53 -0000	1.124
+++ firmware/powermgmt.c	1 Oct 2006 16:54:48 -0000
@@ -1077,15 +1077,6 @@
 #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    
Index: firmware/usb.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/usb.c,v
retrieving revision 1.95
diff -u -r1.95 usb.c
--- firmware/usb.c	20 Sep 2006 23:21:58 -0000	1.95
+++ firmware/usb.c	1 Oct 2006 16:54:48 -0000
@@ -175,23 +175,6 @@
         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 @@
     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 @@
     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);
Index: firmware/drivers/adc.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/drivers/adc.c,v
retrieving revision 1.38
diff -u -r1.38 adc.c
--- firmware/drivers/adc.c	10 Sep 2006 02:00:34 -0000	1.38
+++ firmware/drivers/adc.c	1 Oct 2006 16:54:49 -0000
@@ -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 @@
     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];
Index: firmware/drivers/button.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/drivers/button.c,v
retrieving revision 1.153
diff -u -r1.153 button.c
--- firmware/drivers/button.c	26 Sep 2006 19:25:51 -0000	1.153
+++ firmware/drivers/button.c	1 Oct 2006 16:54:50 -0000
@@ -72,8 +72,7 @@
 #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 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 @@
     /* 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 @@
     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 @@
     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 @@
     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);
Index: firmware/drivers/lcd-ipodvideo.c
===================================================================
RCS file: firmware/drivers/lcd-ipodvideo.c
diff -N firmware/drivers/lcd-ipodvideo.c
--- firmware/drivers/lcd-ipodvideo.c	17 Aug 2006 08:37:35 -0000	1.17
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,389 +0,0 @@
-/***************************************************************************
- *             __________               __   ___.
- *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
- *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
- *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
- *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
- *                     \/            \/     \/    \/            \/
- * $Id: lcd-ipodvideo.c,v 1.17 2006-08-17 08:37:35 dave Exp $
- *
- * LCD driver for iPod Video
- * 
- * Based on code from the ipodlinux project - http://ipodlinux.org/
- * Adapted for Rockbox in December 2005
- *
- * Original file: linux/arch/armnommu/mach-ipod/fb.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.
- *
- ****************************************************************************/
-#include "config.h"
-#include "cpu.h"
-#include "lcd.h"
-#include "kernel.h"
-#include "system.h"
-
-/*** hardware configuration ***/
-
-void lcd_set_contrast(int val)
-{
-  /* TODO: Implement lcd_set_contrast() */
-  (void)val;
-}
-
-void lcd_set_invert_display(bool yesno)
-{
-  /* TODO: Implement lcd_set_invert_display() */
-  (void)yesno;
-}
-
-/* turn the display upside down (call lcd_update() afterwards) */
-void lcd_set_flip(bool yesno)
-{
-  /* TODO: Implement lcd_set_flip() */
-  (void)yesno;
-}
-
-/* LCD init */
-void lcd_init_device(void)
-{  
-    /* iPodLinux doesn't appear have any LCD init code for the Video */
-}
-
-/*** update functions ***/
-
-/* Performance function that works with an external buffer
-   note that by and bheight are in 4-pixel units! */
-void lcd_blit(const fb_data* data, int x, int by, int width,
-              int bheight, int stride)
-{
-    /* TODO: Implement lcd_blit() */
-    (void)data;
-    (void)x;
-    (void)by;
-    (void)width;
-    (void)bheight;
-    (void)stride;
-}
-
-static inline void lcd_bcm_write32(unsigned address, unsigned value)
-{
-    /* write out destination address as two 16bit values */
-    outw(address, 0x30010000);
-    outw((address >> 16), 0x30010000);
-
-    /* wait for it to be write ready */
-    while ((inw(0x30030000) & 0x2) == 0);
-
-    /* write out the value low 16, high 16 */
-    outw(value, 0x30000000);
-    outw((value >> 16), 0x30000000);
-}
-
-static void lcd_bcm_setup_rect(unsigned cmd,
-                               unsigned start_horiz, 
-                               unsigned start_vert, 
-                               unsigned max_horiz,
-                               unsigned max_vert, 
-                               unsigned count)
-{
-    lcd_bcm_write32(0x1F8, 0xFFFA0005);
-    lcd_bcm_write32(0xE0000, cmd);
-    lcd_bcm_write32(0xE0004, start_horiz);
-    lcd_bcm_write32(0xE0008, start_vert);
-    lcd_bcm_write32(0xE000C, max_horiz);
-    lcd_bcm_write32(0xE0010, max_vert);
-    lcd_bcm_write32(0xE0014, count);
-    lcd_bcm_write32(0xE0018, count);
-    lcd_bcm_write32(0xE001C, 0);
-}
-
-static unsigned lcd_bcm_read32(unsigned address) {
-    while ((inw(0x30020000) & 1) == 0);
-
-    /* write out destination address as two 16bit values */
-    outw(address, 0x30020000);
-    outw((address >> 16), 0x30020000);
-
-    /* wait for it to be read ready */
-    while ((inw(0x30030000) & 0x10) == 0);
-
-    /* read the value */
-    return inw(0x30000000) | inw(0x30000000) << 16;
-}
-
-static int finishup_needed = 0;
-
-/* Update a fraction of the display. */
-void lcd_update_rect(int x, int y, int width, int height) ICODE_ATTR;
-void lcd_update_rect(int x, int y, int width, int height)
-{
-    {
-        int endy = x + width;
-        /* Ensure x and width are both even - so we can read 32-bit aligned 
-           data from lcd_framebuffer */
-        x &= ~1;
-        width &= ~1;
-        if (x + width < endy) {
-            width += 2;
-        }
-    }
-
-    if (finishup_needed) {
-        unsigned int data;
-        /* Bottom-half of original lcd_bcm_finishup() function */
-        do {
-            /* This function takes about 14ms to execute - so we yield() */
-            yield();
-            data = lcd_bcm_read32(0x1F8);
-        } while (data == 0xFFFA0005 || data == 0xFFFF);
-    }
-
-    lcd_bcm_read32(0x1FC);
-
-    {
-        int rect1, rect2, rect3, rect4;
-        int count = (width * height) << 1;
-        /* calculate the drawing region */
-        rect1 = x;                         /* start horiz */
-        rect2 = y;                         /* start vert */
-        rect3 = (x + width) - 1;           /* max horiz */
-        rect4 = (y + height) - 1;          /* max vert */
-
-        /* setup the drawing region */
-        lcd_bcm_setup_rect(0x34, rect1, rect2, rect3, rect4, count);
-    }
-
-    /* write out destination address as two 16bit values */
-    outw((0xE0020 & 0xffff), 0x30010000);
-    outw((0xE0020 >> 16), 0x30010000);
-
-    /* wait for it to be write ready */
-    while ((inw(0x30030000) & 0x2) == 0);
-
-    {
-        unsigned short *src = (unsigned short*)&lcd_framebuffer[y][x];
-        unsigned short *end = &src[LCD_WIDTH * height];
-        int line_rem = (LCD_WIDTH - width);
-        while (src < end) {
-            /* Duff's Device to unroll loop */
-            register int count = width ;
-            register int n=( count + 7 ) / 8;
-            switch( count % 8 ) {
-                case 0: do{ outw(*(src++), 0x30000000);
-                case 7:     outw(*(src++), 0x30000000);
-                case 6:     outw(*(src++), 0x30000000);
-                case 5:     outw(*(src++), 0x30000000);
-                case 4:     outw(*(src++), 0x30000000);
-                case 3:     outw(*(src++), 0x30000000);
-                case 2:     outw(*(src++), 0x30000000);
-                case 1:     outw(*(src++), 0x30000000);
-              } while(--n>0);
-            }
-            src += line_rem;
-        }
-    }
-
-    /* Top-half of original lcd_bcm_finishup() function */
-    outw(0x31, 0x30030000); 
-
-    lcd_bcm_read32(0x1FC);
-
-    finishup_needed = 1;
-}
-
-/* Update the display.
-   This must be called after all other LCD functions that change the display. */
-void lcd_update(void)
-{
-    lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
-}
-
-#define CSUB_X 2
-#define CSUB_Y 2
-
-#define RYFAC (31*257)
-#define GYFAC (31*257)
-#define BYFAC (31*257)
-#define RVFAC 11170     /* 31 * 257 *  1.402    */
-#define GVFAC (-5690)  /* 31 * 257 * -0.714136 */
-#define GUFAC (-2742)   /* 31 * 257 * -0.344136 */
-#define BUFAC 14118     /* 31 * 257 *  1.772    */
-
-#define ROUNDOFFS (127*257)
-#define ROUNDOFFSG (63*257)
-
-/* Performance function to blit a YUV bitmap directly to the LCD */
-void lcd_yuv_blit(unsigned char * const src[3],
-                  int src_x, int src_y, int stride,
-                  int x, int y, int width, int height)
-{
-    int ymax;
-
-    width = (width + 1) & ~1;
-
-    if (finishup_needed) {
-        unsigned int data;
-        /* Bottom-half of original lcd_bcm_finishup() function */
-        data = lcd_bcm_read32(0x1F8);
-        while (data == 0xFFFA0005 || data == 0xFFFF) {
-            /* This loop can wait for up to 14ms - so we yield() */
-            yield();
-            data = lcd_bcm_read32(0x1F8);
-        } 
-    }
-
-    lcd_bcm_read32(0x1FC);
-
-    {
-        int rect1, rect2, rect3, rect4;
-        int count = (width * height) << 1;
-        /* calculate the drawing region */
-        rect1 = x;                         /* start horiz */
-        rect2 = y;                         /* start vert */
-        rect3 = (x + width) - 1;           /* max horiz */
-        rect4 = (y + height) - 1;          /* max vert */
-
-        /* setup the drawing region */
-        lcd_bcm_setup_rect(0x34, rect1, rect2, rect3, rect4, count);
-    }
-
-    /* write out destination address as two 16bit values */
-    outw((0xE0020 & 0xffff), 0x30010000);
-    outw((0xE0020 >> 16), 0x30010000);
-
-    /* wait for it to be write ready */
-    while ((inw(0x30030000) & 0x2) == 0);
-
-    ymax = y + height - 1 ;
-
-    const int stride_div_csub_x = stride/CSUB_X;
-
-    for (; y <= ymax ; y++)
-    {
-        /* upsampling, YUV->RGB conversion and reduction to RGB565 in one go */
-        const unsigned char *ysrc = src[0] + stride * src_y + src_x;
-
-        const int uvoffset = stride_div_csub_x * (src_y/CSUB_Y) +
-                             (src_x/CSUB_X);
-
-        const unsigned char *usrc = src[1] + uvoffset;
-        const unsigned char *vsrc = src[2] + uvoffset;
-        const unsigned char *row_end = ysrc + width;
-
-        int y, u, v;
-        int red1, green1, blue1;
-        int red2, green2, blue2;
-        unsigned rbits, gbits, bbits;
-
-        int rc, gc, bc;
-
-        do
-        {
-            u = *usrc++ - 128;
-            v = *vsrc++ - 128;
-            rc = RVFAC * v + ROUNDOFFS;
-            gc = GVFAC * v + GUFAC * u + ROUNDOFFSG;
-            bc = BUFAC * u + ROUNDOFFS;
-
-            /* Pixel 1 */
-            y = *ysrc++;
-
-            red1   = RYFAC * y + rc;
-            green1 = GYFAC * y + gc;
-            blue1  = BYFAC * y + bc;
-
-            /* Pixel 2 */
-            y = *ysrc++;
-            red2   = RYFAC * y + rc;
-            green2 = GYFAC * y + gc;
-            blue2  = BYFAC * y + bc;
-
-            /* Since out of bounds errors are relatively rare, we check two
-               pixels at once to see if any components are out of bounds, and
-               then fix whichever is broken. This works due to high values and
-               negative values both becoming larger than the cutoff when
-               casted to unsigned.  And ORing them together checks all of them
-               simultaneously.  */
-            if (((unsigned)(red1 | green1 | blue1 |
-                     red2 | green2 | blue2)) > (RYFAC*255+ROUNDOFFS)) {
-                if (((unsigned)(red1 | green1 | blue1)) > 
-                    (RYFAC*255+ROUNDOFFS)) {
-                    if ((unsigned)red1 > (RYFAC*255+ROUNDOFFS))
-                    {
-                        if (red1 < 0)
-                            red1 = 0;
-                        else
-                            red1 = (RYFAC*255+ROUNDOFFS);
-                    }
-                    if ((unsigned)green1 > (GYFAC*255+ROUNDOFFSG))
-                    {
-                        if (green1 < 0)
-                            green1 = 0;
-                        else
-                            green1 = (GYFAC*255+ROUNDOFFSG);
-                    }
-                    if ((unsigned)blue1 > (BYFAC*255+ROUNDOFFS))
-                    {
-                        if (blue1 < 0)
-                            blue1 = 0;
-                        else
-                            blue1 = (BYFAC*255+ROUNDOFFS);
-                    }
-                }
-
-                if (((unsigned)(red2 | green2 | blue2)) > 
-                    (RYFAC*255+ROUNDOFFS)) {
-                    if ((unsigned)red2 > (RYFAC*255+ROUNDOFFS))
-                    {
-                        if (red2 < 0)
-                            red2 = 0;
-                        else
-                            red2 = (RYFAC*255+ROUNDOFFS);
-                    }
-                    if ((unsigned)green2 > (GYFAC*255+ROUNDOFFSG))
-                    {
-                        if (green2 < 0)
-                            green2 = 0;
-                        else
-                            green2 = (GYFAC*255+ROUNDOFFSG);
-                    }
-                    if ((unsigned)blue2 > (BYFAC*255+ROUNDOFFS))
-                    {
-                        if (blue2 < 0)
-                            blue2 = 0;
-                        else
-                            blue2 = (BYFAC*255+ROUNDOFFS);
-                    }
-                }
-            }
-                
-            rbits = red1 >> 16 ;
-            gbits = green1 >> 15 ;
-            bbits = blue1 >> 16 ;
-
-            outw((rbits << 11) | (gbits << 5) | bbits, 0x30000000);
-
-            rbits = red2 >> 16 ;
-            gbits = green2 >> 15 ;
-            bbits = blue2 >> 16 ;
-            outw((rbits << 11) | (gbits << 5) | bbits, 0x30000000);
-        }
-        while (ysrc < row_end);
-
-        src_y++;
-    }
-
-    /* Top-half of original lcd_bcm_finishup() function */
-    outw(0x31, 0x30030000); 
-
-    lcd_bcm_read32(0x1FC);
-
-    finishup_needed = 1;
-}
Index: firmware/drivers/power.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/drivers/power.c,v
retrieving revision 1.85
diff -u -r1.85 power.c
--- firmware/drivers/power.c	28 Aug 2006 22:38:40 -0000	1.85
+++ firmware/drivers/power.c	1 Oct 2006 16:54:50 -0000
@@ -84,8 +84,6 @@
     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 @@
     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 @@
     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 @@
         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 @@
     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 @@
 #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;
Index: firmware/export/adc.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/adc.h,v
retrieving revision 1.22
diff -u -r1.22 adc.h
--- firmware/export/adc.h	22 Aug 2006 20:17:08 -0000	1.22
+++ firmware/export/adc.h	1 Oct 2006 16:54:50 -0000
@@ -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
Index: firmware/export/button.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/button.h,v
retrieving revision 1.54
diff -u -r1.54 button.h
--- firmware/export/button.h	26 Sep 2006 19:25:51 -0000	1.54
+++ firmware/export/button.h	1 Oct 2006 16:54:50 -0000
@@ -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 @@
 
 #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 */
Index: firmware/export/config-ipod3g.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipod3g.h,v
retrieving revision 1.16
diff -u -r1.16 config-ipod3g.h
--- firmware/export/config-ipod3g.h	26 Sep 2006 11:15:33 -0000	1.16
+++ firmware/export/config-ipod3g.h	1 Oct 2006 16:54:51 -0000
@@ -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,9 @@
 
 #define USB_NONE
 
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING        5
+#define MAX_CONTRAST_SETTING        63
 
 /* Virtual LED (icon) */
 #define CONFIG_LED LED_VIRTUAL
Index: firmware/export/config-ipod4g.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipod4g.h,v
retrieving revision 1.15
diff -u -r1.15 config-ipod4g.h
--- firmware/export/config-ipod4g.h	26 Sep 2006 19:25:51 -0000	1.15
+++ firmware/export/config-ipod4g.h	1 Oct 2006 16:54:51 -0000
@@ -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,10 @@
 
 #define USB_IPODSTYLE
 
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING        5
+#define MAX_CONTRAST_SETTING        63
+
 /* define this if the unit can be powered or charged via USB */
 #define HAVE_USB_POWER
 
Index: firmware/export/config-ipodcolor.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipodcolor.h,v
retrieving revision 1.24
diff -u -r1.24 config-ipodcolor.h
--- firmware/export/config-ipodcolor.h	26 Sep 2006 19:25:51 -0000	1.24
+++ firmware/export/config-ipodcolor.h	1 Oct 2006 16:54:51 -0000
@@ -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
Index: firmware/export/config-ipodmini.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipodmini.h,v
retrieving revision 1.17
diff -u -r1.17 config-ipodmini.h
--- firmware/export/config-ipodmini.h	26 Sep 2006 11:15:33 -0000	1.17
+++ firmware/export/config-ipodmini.h	1 Oct 2006 16:54:51 -0000
@@ -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,10 @@
 
 #define USB_IPODSTYLE
 
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING        5
+#define MAX_CONTRAST_SETTING        63
+
 /* define this if the unit can be powered or charged via USB */
 #define HAVE_USB_POWER
 
Index: firmware/export/config-ipodmini2g.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipodmini2g.h,v
retrieving revision 1.17
diff -u -r1.17 config-ipodmini2g.h
--- firmware/export/config-ipodmini2g.h	26 Sep 2006 19:25:52 -0000	1.17
+++ firmware/export/config-ipodmini2g.h	1 Oct 2006 16:54:51 -0000
@@ -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,10 @@
 
 #define USB_IPODSTYLE
 
+/* LCD contrast */
+#define MIN_CONTRAST_SETTING        5
+#define MAX_CONTRAST_SETTING        63
+
 /* define this if the unit can be powered or charged via USB */
 #define HAVE_USB_POWER
 
Index: firmware/export/config-ipodnano.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipodnano.h,v
retrieving revision 1.26
diff -u -r1.26 config-ipodnano.h
--- firmware/export/config-ipodnano.h	26 Sep 2006 19:25:52 -0000	1.26
+++ firmware/export/config-ipodnano.h	1 Oct 2006 16:54:51 -0000
@@ -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
Index: firmware/export/config-ipodvideo.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-ipodvideo.h,v
retrieving revision 1.22
diff -u -r1.22 config-ipodvideo.h
--- firmware/export/config-ipodvideo.h	26 Sep 2006 19:25:52 -0000	1.22
+++ firmware/export/config-ipodvideo.h	1 Oct 2006 16:54:51 -0000
@@ -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
Index: firmware/export/pcf50605.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/pcf50605.h,v
retrieving revision 1.5
diff -u -r1.5 pcf50605.h
--- firmware/export/pcf50605.h	2 May 2006 08:08:10 -0000	1.5
+++ firmware/export/pcf50605.h	1 Oct 2006 16:54:51 -0000
@@ -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 @@
 bool pcf50605_charger_inserted(void);
 void pcf50605_standby_mode(void);
 void pcf50605_init(void);
-#endif
 
 #endif
Index: firmware/target/arm/apple/adc-apple.c
===================================================================
RCS file: firmware/target/arm/apple/adc-apple.c
diff -N firmware/target/arm/apple/adc-apple.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/adc-apple.c	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,80 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: adc.c,v 1.38 2006-09-10 02:00:34 jethead71 Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/adc-target.h
===================================================================
RCS file: firmware/target/arm/apple/adc-target.h
diff -N firmware/target/arm/apple/adc-target.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/adc-target.h	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,29 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: adc-target.h,v 1.1 2006-08-22 20:17:09 barrywardell Exp $
+ *
+ * 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
Index: firmware/target/arm/apple/backlight-target.h
===================================================================
RCS file: firmware/target/arm/apple/backlight-target.h
diff -N firmware/target/arm/apple/backlight-target.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/backlight-target.h	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,25 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight-target.h,v 1.2 2006-09-01 17:58:47 barrywardell Exp $
+ *
+ * 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
Index: firmware/target/arm/apple/button-apple-4g.c
===================================================================
RCS file: firmware/target/arm/apple/button-apple-4g.c
diff -N firmware/target/arm/apple/button-apple-4g.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/button-apple-4g.c	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,237 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: button.c,v 1.150 2006-09-25 18:45:02 barrywardell Exp $
+ *
+ * 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;
+}
Index: firmware/target/arm/apple/button-target.h
===================================================================
RCS file: firmware/target/arm/apple/button-target.h
diff -N firmware/target/arm/apple/button-target.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/button-target.h	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,61 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: button-target.h,v 1.1 2006-08-03 20:18:26 bagder Exp $
+ *
+ * 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_ */
Index: firmware/target/arm/apple/power-apple.c
===================================================================
RCS file: firmware/target/arm/apple/power-apple.c
diff -N firmware/target/arm/apple/power-apple.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/power-apple.c	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,77 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: power.c,v 1.85 2006-08-28 22:38:40 jethead71 Exp $
+ *
+ * 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)
+{
+    /* This needs filling in for other ipods. */
+    return false;
+}
+
+/* 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
+}
Index: firmware/target/arm/apple/usb-apple.c
===================================================================
RCS file: firmware/target/arm/apple/usb-apple.c
diff -N firmware/target/arm/apple/usb-apple.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/usb-apple.c	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,114 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: usb.c,v 1.95 2006-09-20 23:21:58 barrywardell Exp $
+ *
+ * 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;
+}
Index: firmware/target/arm/apple/usb-target.h
===================================================================
RCS file: firmware/target/arm/apple/usb-target.h
diff -N firmware/target/arm/apple/usb-target.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/usb-target.h	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,24 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: usb-target.h,v 1.1 2006-08-03 20:18:31 bagder Exp $
+ *
+ * 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
Index: firmware/target/arm/apple/ipod3g/backlight-ipod3g.c
===================================================================
RCS file: firmware/target/arm/apple/ipod3g/backlight-ipod3g.c
diff -N firmware/target/arm/apple/ipod3g/backlight-ipod3g.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipod3g/backlight-ipod3g.c	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,42 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipod3g/backlight-target.h
===================================================================
RCS file: firmware/target/arm/apple/ipod3g/backlight-target.h
diff -N firmware/target/arm/apple/ipod3g/backlight-target.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipod3g/backlight-target.h	1 Oct 2006 16:54:52 -0000
@@ -0,0 +1,25 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight-target.h,v 1.2 2006-09-01 17:58:47 barrywardell Exp $
+ *
+ * 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
Index: firmware/target/arm/apple/ipod3g/button-ipod3g.c
===================================================================
RCS file: firmware/target/arm/apple/ipod3g/button-ipod3g.c
diff -N firmware/target/arm/apple/ipod3g/button-ipod3g.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipod3g/button-ipod3g.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,189 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: button.c,v 1.150 2006-09-25 18:45:02 barrywardell Exp $
+ *
+ * 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;
+}
Index: firmware/target/arm/apple/ipod4g/backlight-ipod4g.c
===================================================================
RCS file: firmware/target/arm/apple/ipod4g/backlight-ipod4g.c
diff -N firmware/target/arm/apple/ipod4g/backlight-ipod4g.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipod4g/backlight-ipod4g.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipodcolor/backlight-ipodcolor.c
===================================================================
RCS file: firmware/target/arm/apple/ipodcolor/backlight-ipodcolor.c
diff -N firmware/target/arm/apple/ipodcolor/backlight-ipodcolor.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodcolor/backlight-ipodcolor.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipodmini/backlight-ipodmini.c
===================================================================
RCS file: firmware/target/arm/apple/ipodmini/backlight-ipodmini.c
diff -N firmware/target/arm/apple/ipodmini/backlight-ipodmini.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodmini/backlight-ipodmini.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,44 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipodmini/button-ipodmini.c
===================================================================
RCS file: firmware/target/arm/apple/ipodmini/button-ipodmini.c
diff -N firmware/target/arm/apple/ipodmini/button-ipodmini.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodmini/button-ipodmini.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,217 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: button.c,v 1.150 2006-09-25 18:45:02 barrywardell Exp $
+ *
+ * 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;
+}
Index: firmware/target/arm/apple/ipodmini2g/backlight-ipodmini2g.c
===================================================================
RCS file: firmware/target/arm/apple/ipodmini2g/backlight-ipodmini2g.c
diff -N firmware/target/arm/apple/ipodmini2g/backlight-ipodmini2g.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodmini2g/backlight-ipodmini2g.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,44 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipodnano/backlight-ipodnano.c
===================================================================
RCS file: firmware/target/arm/apple/ipodnano/backlight-ipodnano.c
diff -N firmware/target/arm/apple/ipodnano/backlight-ipodnano.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodnano/backlight-ipodnano.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,50 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipodvideo/backlight-ipodvideo.c
===================================================================
RCS file: firmware/target/arm/apple/ipodvideo/backlight-ipodvideo.c
diff -N firmware/target/arm/apple/ipodvideo/backlight-ipodvideo.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodvideo/backlight-ipodvideo.c	1 Oct 2006 16:54:53 -0000
@@ -0,0 +1,50 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: backlight.c,v 1.102 2006-09-16 20:32:20 peter Exp $
+ *
+ * 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);
+}
Index: firmware/target/arm/apple/ipodvideo/lcd-ipodvideo.c
===================================================================
RCS file: firmware/target/arm/apple/ipodvideo/lcd-ipodvideo.c
diff -N firmware/target/arm/apple/ipodvideo/lcd-ipodvideo.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodvideo/lcd-ipodvideo.c	1 Oct 2006 16:54:54 -0000
@@ -0,0 +1,389 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: lcd-ipodvideo.c,v 1.17 2006-08-17 08:37:35 dave Exp $
+ *
+ * LCD driver for iPod Video
+ * 
+ * Based on code from the ipodlinux project - http://ipodlinux.org/
+ * Adapted for Rockbox in December 2005
+ *
+ * Original file: linux/arch/armnommu/mach-ipod/fb.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.
+ *
+ ****************************************************************************/
+#include "config.h"
+#include "cpu.h"
+#include "lcd.h"
+#include "kernel.h"
+#include "system.h"
+
+/*** hardware configuration ***/
+
+void lcd_set_contrast(int val)
+{
+  /* TODO: Implement lcd_set_contrast() */
+  (void)val;
+}
+
+void lcd_set_invert_display(bool yesno)
+{
+  /* TODO: Implement lcd_set_invert_display() */
+  (void)yesno;
+}
+
+/* turn the display upside down (call lcd_update() afterwards) */
+void lcd_set_flip(bool yesno)
+{
+  /* TODO: Implement lcd_set_flip() */
+  (void)yesno;
+}
+
+/* LCD init */
+void lcd_init_device(void)
+{  
+    /* iPodLinux doesn't appear have any LCD init code for the Video */
+}
+
+/*** update functions ***/
+
+/* Performance function that works with an external buffer
+   note that by and bheight are in 4-pixel units! */
+void lcd_blit(const fb_data* data, int x, int by, int width,
+              int bheight, int stride)
+{
+    /* TODO: Implement lcd_blit() */
+    (void)data;
+    (void)x;
+    (void)by;
+    (void)width;
+    (void)bheight;
+    (void)stride;
+}
+
+static inline void lcd_bcm_write32(unsigned address, unsigned value)
+{
+    /* write out destination address as two 16bit values */
+    outw(address, 0x30010000);
+    outw((address >> 16), 0x30010000);
+
+    /* wait for it to be write ready */
+    while ((inw(0x30030000) & 0x2) == 0);
+
+    /* write out the value low 16, high 16 */
+    outw(value, 0x30000000);
+    outw((value >> 16), 0x30000000);
+}
+
+static void lcd_bcm_setup_rect(unsigned cmd,
+                               unsigned start_horiz, 
+                               unsigned start_vert, 
+                               unsigned max_horiz,
+                               unsigned max_vert, 
+                               unsigned count)
+{
+    lcd_bcm_write32(0x1F8, 0xFFFA0005);
+    lcd_bcm_write32(0xE0000, cmd);
+    lcd_bcm_write32(0xE0004, start_horiz);
+    lcd_bcm_write32(0xE0008, start_vert);
+    lcd_bcm_write32(0xE000C, max_horiz);
+    lcd_bcm_write32(0xE0010, max_vert);
+    lcd_bcm_write32(0xE0014, count);
+    lcd_bcm_write32(0xE0018, count);
+    lcd_bcm_write32(0xE001C, 0);
+}
+
+static unsigned lcd_bcm_read32(unsigned address) {
+    while ((inw(0x30020000) & 1) == 0);
+
+    /* write out destination address as two 16bit values */
+    outw(address, 0x30020000);
+    outw((address >> 16), 0x30020000);
+
+    /* wait for it to be read ready */
+    while ((inw(0x30030000) & 0x10) == 0);
+
+    /* read the value */
+    return inw(0x30000000) | inw(0x30000000) << 16;
+}
+
+static int finishup_needed = 0;
+
+/* Update a fraction of the display. */
+void lcd_update_rect(int x, int y, int width, int height) ICODE_ATTR;
+void lcd_update_rect(int x, int y, int width, int height)
+{
+    {
+        int endy = x + width;
+        /* Ensure x and width are both even - so we can read 32-bit aligned 
+           data from lcd_framebuffer */
+        x &= ~1;
+        width &= ~1;
+        if (x + width < endy) {
+            width += 2;
+        }
+    }
+
+    if (finishup_needed) {
+        unsigned int data;
+        /* Bottom-half of original lcd_bcm_finishup() function */
+        do {
+            /* This function takes about 14ms to execute - so we yield() */
+            yield();
+            data = lcd_bcm_read32(0x1F8);
+        } while (data == 0xFFFA0005 || data == 0xFFFF);
+    }
+
+    lcd_bcm_read32(0x1FC);
+
+    {
+        int rect1, rect2, rect3, rect4;
+        int count = (width * height) << 1;
+        /* calculate the drawing region */
+        rect1 = x;                         /* start horiz */
+        rect2 = y;                         /* start vert */
+        rect3 = (x + width) - 1;           /* max horiz */
+        rect4 = (y + height) - 1;          /* max vert */
+
+        /* setup the drawing region */
+        lcd_bcm_setup_rect(0x34, rect1, rect2, rect3, rect4, count);
+    }
+
+    /* write out destination address as two 16bit values */
+    outw((0xE0020 & 0xffff), 0x30010000);
+    outw((0xE0020 >> 16), 0x30010000);
+
+    /* wait for it to be write ready */
+    while ((inw(0x30030000) & 0x2) == 0);
+
+    {
+        unsigned short *src = (unsigned short*)&lcd_framebuffer[y][x];
+        unsigned short *end = &src[LCD_WIDTH * height];
+        int line_rem = (LCD_WIDTH - width);
+        while (src < end) {
+            /* Duff's Device to unroll loop */
+            register int count = width ;
+            register int n=( count + 7 ) / 8;
+            switch( count % 8 ) {
+                case 0: do{ outw(*(src++), 0x30000000);
+                case 7:     outw(*(src++), 0x30000000);
+                case 6:     outw(*(src++), 0x30000000);
+                case 5:     outw(*(src++), 0x30000000);
+                case 4:     outw(*(src++), 0x30000000);
+                case 3:     outw(*(src++), 0x30000000);
+                case 2:     outw(*(src++), 0x30000000);
+                case 1:     outw(*(src++), 0x30000000);
+              } while(--n>0);
+            }
+            src += line_rem;
+        }
+    }
+
+    /* Top-half of original lcd_bcm_finishup() function */
+    outw(0x31, 0x30030000); 
+
+    lcd_bcm_read32(0x1FC);
+
+    finishup_needed = 1;
+}
+
+/* Update the display.
+   This must be called after all other LCD functions that change the display. */
+void lcd_update(void)
+{
+    lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
+}
+
+#define CSUB_X 2
+#define CSUB_Y 2
+
+#define RYFAC (31*257)
+#define GYFAC (31*257)
+#define BYFAC (31*257)
+#define RVFAC 11170     /* 31 * 257 *  1.402    */
+#define GVFAC (-5690)  /* 31 * 257 * -0.714136 */
+#define GUFAC (-2742)   /* 31 * 257 * -0.344136 */
+#define BUFAC 14118     /* 31 * 257 *  1.772    */
+
+#define ROUNDOFFS (127*257)
+#define ROUNDOFFSG (63*257)
+
+/* Performance function to blit a YUV bitmap directly to the LCD */
+void lcd_yuv_blit(unsigned char * const src[3],
+                  int src_x, int src_y, int stride,
+                  int x, int y, int width, int height)
+{
+    int ymax;
+
+    width = (width + 1) & ~1;
+
+    if (finishup_needed) {
+        unsigned int data;
+        /* Bottom-half of original lcd_bcm_finishup() function */
+        data = lcd_bcm_read32(0x1F8);
+        while (data == 0xFFFA0005 || data == 0xFFFF) {
+            /* This loop can wait for up to 14ms - so we yield() */
+            yield();
+            data = lcd_bcm_read32(0x1F8);
+        } 
+    }
+
+    lcd_bcm_read32(0x1FC);
+
+    {
+        int rect1, rect2, rect3, rect4;
+        int count = (width * height) << 1;
+        /* calculate the drawing region */
+        rect1 = x;                         /* start horiz */
+        rect2 = y;                         /* start vert */
+        rect3 = (x + width) - 1;           /* max horiz */
+        rect4 = (y + height) - 1;          /* max vert */
+
+        /* setup the drawing region */
+        lcd_bcm_setup_rect(0x34, rect1, rect2, rect3, rect4, count);
+    }
+
+    /* write out destination address as two 16bit values */
+    outw((0xE0020 & 0xffff), 0x30010000);
+    outw((0xE0020 >> 16), 0x30010000);
+
+    /* wait for it to be write ready */
+    while ((inw(0x30030000) & 0x2) == 0);
+
+    ymax = y + height - 1 ;
+
+    const int stride_div_csub_x = stride/CSUB_X;
+
+    for (; y <= ymax ; y++)
+    {
+        /* upsampling, YUV->RGB conversion and reduction to RGB565 in one go */
+        const unsigned char *ysrc = src[0] + stride * src_y + src_x;
+
+        const int uvoffset = stride_div_csub_x * (src_y/CSUB_Y) +
+                             (src_x/CSUB_X);
+
+        const unsigned char *usrc = src[1] + uvoffset;
+        const unsigned char *vsrc = src[2] + uvoffset;
+        const unsigned char *row_end = ysrc + width;
+
+        int y, u, v;
+        int red1, green1, blue1;
+        int red2, green2, blue2;
+        unsigned rbits, gbits, bbits;
+
+        int rc, gc, bc;
+
+        do
+        {
+            u = *usrc++ - 128;
+            v = *vsrc++ - 128;
+            rc = RVFAC * v + ROUNDOFFS;
+            gc = GVFAC * v + GUFAC * u + ROUNDOFFSG;
+            bc = BUFAC * u + ROUNDOFFS;
+
+            /* Pixel 1 */
+            y = *ysrc++;
+
+            red1   = RYFAC * y + rc;
+            green1 = GYFAC * y + gc;
+            blue1  = BYFAC * y + bc;
+
+            /* Pixel 2 */
+            y = *ysrc++;
+            red2   = RYFAC * y + rc;
+            green2 = GYFAC * y + gc;
+            blue2  = BYFAC * y + bc;
+
+            /* Since out of bounds errors are relatively rare, we check two
+               pixels at once to see if any components are out of bounds, and
+               then fix whichever is broken. This works due to high values and
+               negative values both becoming larger than the cutoff when
+               casted to unsigned.  And ORing them together checks all of them
+               simultaneously.  */
+            if (((unsigned)(red1 | green1 | blue1 |
+                     red2 | green2 | blue2)) > (RYFAC*255+ROUNDOFFS)) {
+                if (((unsigned)(red1 | green1 | blue1)) > 
+                    (RYFAC*255+ROUNDOFFS)) {
+                    if ((unsigned)red1 > (RYFAC*255+ROUNDOFFS))
+                    {
+                        if (red1 < 0)
+                            red1 = 0;
+                        else
+                            red1 = (RYFAC*255+ROUNDOFFS);
+                    }
+                    if ((unsigned)green1 > (GYFAC*255+ROUNDOFFSG))
+                    {
+                        if (green1 < 0)
+                            green1 = 0;
+                        else
+                            green1 = (GYFAC*255+ROUNDOFFSG);
+                    }
+                    if ((unsigned)blue1 > (BYFAC*255+ROUNDOFFS))
+                    {
+                        if (blue1 < 0)
+                            blue1 = 0;
+                        else
+                            blue1 = (BYFAC*255+ROUNDOFFS);
+                    }
+                }
+
+                if (((unsigned)(red2 | green2 | blue2)) > 
+                    (RYFAC*255+ROUNDOFFS)) {
+                    if ((unsigned)red2 > (RYFAC*255+ROUNDOFFS))
+                    {
+                        if (red2 < 0)
+                            red2 = 0;
+                        else
+                            red2 = (RYFAC*255+ROUNDOFFS);
+                    }
+                    if ((unsigned)green2 > (GYFAC*255+ROUNDOFFSG))
+                    {
+                        if (green2 < 0)
+                            green2 = 0;
+                        else
+                            green2 = (GYFAC*255+ROUNDOFFSG);
+                    }
+                    if ((unsigned)blue2 > (BYFAC*255+ROUNDOFFS))
+                    {
+                        if (blue2 < 0)
+                            blue2 = 0;
+                        else
+                            blue2 = (BYFAC*255+ROUNDOFFS);
+                    }
+                }
+            }
+                
+            rbits = red1 >> 16 ;
+            gbits = green1 >> 15 ;
+            bbits = blue1 >> 16 ;
+
+            outw((rbits << 11) | (gbits << 5) | bbits, 0x30000000);
+
+            rbits = red2 >> 16 ;
+            gbits = green2 >> 15 ;
+            bbits = blue2 >> 16 ;
+            outw((rbits << 11) | (gbits << 5) | bbits, 0x30000000);
+        }
+        while (ysrc < row_end);
+
+        src_y++;
+    }
+
+    /* Top-half of original lcd_bcm_finishup() function */
+    outw(0x31, 0x30030000); 
+
+    lcd_bcm_read32(0x1FC);
+
+    finishup_needed = 1;
+}
Index: firmware/target/arm/apple/ipodvideo/power-ipodvideo.c
===================================================================
RCS file: firmware/target/arm/apple/ipodvideo/power-ipodvideo.c
diff -N firmware/target/arm/apple/ipodvideo/power-ipodvideo.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/apple/ipodvideo/power-ipodvideo.c	1 Oct 2006 16:54:54 -0000
@@ -0,0 +1,74 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: power.c,v 1.85 2006-08-28 22:38:40 jethead71 Exp $
+ *
+ * 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)
+{
+    return (GPIOL_INPUT_VAL & 0x08)?false:true;
+}
+
+/* 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)
+{
+    /* 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);
+    
+#ifndef BOOTLOADER
+    /* We don't turn off the ipod, we put it in a deep sleep */
+    pcf50605_standby_mode();
+#endif
+}
Index: tools/configure
===================================================================
RCS file: /cvsroot/rockbox/tools/configure,v
retrieving revision 1.223
diff -u -r1.223 configure
--- tools/configure	29 Sep 2006 20:04:36 -0000	1.223
+++ tools/configure	1 Oct 2006 16:54:58 -0000
@@ -777,6 +777,10 @@
     # 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="apple"
+    t_model="ipodcolor"
     ;;
 
    21|ipodnano)
@@ -799,6 +803,10 @@
     # 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="apple"
+    t_model="ipodnano"
     ;;
 
    22|ipodvideo)
@@ -821,6 +829,10 @@
     # 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="apple"
+    t_model="ipodvideo"
     ;;
 
    23|ipod3g)
@@ -843,6 +855,10 @@
     # 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="apple"
+    t_model="ipod3g"
     ;;
     
    24|ipod4g)
@@ -865,6 +881,10 @@
     # 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="apple"
+    t_model="ipod4g"
     ;;
     
    25|ipodmini)
@@ -887,6 +907,10 @@
     # 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="apple"
+    t_model="ipodmini"
     ;;
     
    13|ifp7xx)
@@ -953,6 +977,10 @@
     # 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="apple"
+    t_model="ipodmini2g"
     ;;
 
    14|h10)
