iPod 3G support in Bootloader from Seven Le Mesle
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8587 a1c6a512-1295-4272-9138-f99709370657
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index 6b72d08..0c9aa8b 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -1,4 +1,4 @@
-#if (CONFIG_CPU == PP5020)
+#if (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5020)
ipod.c
#else
main.c
diff --git a/bootloader/ipod.c b/bootloader/ipod.c
index 97a4ceb..63b7b22 100644
--- a/bootloader/ipod.c
+++ b/bootloader/ipod.c
@@ -39,9 +39,12 @@
#include "power.h"
#include "file.h"
-#define DRAM_START 0x10000000
-#define IPOD_PP5020_RTC 0x60005010
-
+#if (CONFIG_CPU == PP5020)
+#define DRAM_START 0x10000000
+#else
+#define IPOD_LCD_BASE 0xc0001000
+#define DRAM_START 0x28000000
+#endif
#define IPOD_HW_REVISION (*((volatile unsigned long*)(0x00002084)))
/* We copy the hardware revision to the last four bytes of SDRAM and then
@@ -52,6 +55,7 @@
#define BUTTON_MENU 2
#define BUTTON_RIGHT 3
#define BUTTON_PLAY 4
+#define BUTTON_HOLD 5
/* Size of the buffer to store the loaded Rockbox/Linux image */
#define MAX_LOADSIZE (4*1024*1024)
@@ -96,35 +100,17 @@
}
}
-/* get current usec counter */
-int timer_get_current(void)
-{
- return inl(IPOD_PP5020_RTC);
-}
-
+#if CONFIG_KEYPAD == IPOD_4G_PAD
/* check if number of seconds has past */
int timer_check(int clock_start, unsigned int usecs)
{
- if ((inl(IPOD_PP5020_RTC) - clock_start) >= usecs) {
+ if ((USEC_TIMER - clock_start) >= usecs) {
return 1;
} else {
return 0;
}
}
-/* This isn't a sleep, but let's call it that. */
-int usleep(unsigned int usecs)
-{
- unsigned int start = inl(IPOD_PP5020_RTC);
-
- while ((inl(IPOD_PP5020_RTC) - start) < usecs) {
- // empty
- }
-
- return 0;
-}
-
-
static void ser_opto_keypad_cfg(int val)
{
int start_time;
@@ -138,7 +124,7 @@
outl(inl(0x6000d024) & ~0x10, 0x6000d024);
outl(inl(0x6000d014) | 0x10, 0x6000d014);
- start_time = timer_get_current();
+ start_time = USEC_TIMER;
do {
if ((inl(0x7000c104) & 0x80000000) == 0) {
break;
@@ -167,7 +153,7 @@
ser_opto_keypad_cfg(0x8000023a);
- start_time = timer_get_current();
+ start_time = USEC_TIMER;
do {
if (inl(0x7000c104) & 0x4000000) {
had_io = 1;
@@ -197,16 +183,26 @@
return 0;
}
+#endif
static int key_pressed(void)
{
unsigned char state;
+#if CONFIG_KEYPAD == IPOD_4G_PAD
state = opto_keypad_read();
if ((state & 0x4) == 0) return BUTTON_LEFT;
if ((state & 0x10) == 0) return BUTTON_MENU;
if ((state & 0x8) == 0) return BUTTON_PLAY;
if ((state & 0x2) == 0) return BUTTON_RIGHT;
+#elif CONFIG_KEYPAD == IPOD_3G_PAD
+ state = inb(0xcf000030);
+ if (((state & 0x20) == 0)) return BUTTON_HOLD; /* hold on */
+ if ((state & 0x08) == 0) return BUTTON_LEFT;
+ if ((state & 0x10) == 0) return BUTTON_MENU;
+ if ((state & 0x04) == 0) return BUTTON_PLAY;
+ if ((state & 0x01) == 0) return BUTTON_RIGHT;
+#endif
return 0;
}
@@ -336,7 +332,8 @@
/* set port L07 on */
outl(((0x100 | 1) << 7), 0x6000d12c);
-
+#elif CONFIG_BACKLIGHT==BL_IPOD3G
+ outl(inl(IPOD_LCD_BASE) | 0x2, IPOD_LCD_BASE);
#endif
TMP_IPOD_HW_REVISION = IPOD_HW_REVISION;
@@ -441,12 +438,11 @@
}
/* If everything else failed, try the original firmware */
-
lcd_puts(0, line, "Loading original firmware...");
lcd_update();
/* Pause for 5 seconds so we can see what's happened */
-// usleep(5000000);
+// udelay(5000000);
entry = tblp->addr + tblp->entryOffset;
if (imageno || ((int)tblp->addr & 0xffffff) != 0) {