summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2007-08-01 22:44:02 +0000
committerJens Arnold <amiconn@rockbox.org>2007-08-01 22:44:02 +0000
commitcb896cdd04ae04cbf9cb59990c920e579ea6887a (patch)
tree27fa4213a221e5b3827321d25d1c8c0d8dd06419 /firmware/target
parenta049fa7c82cf155314c7e141f72ac8f8a7cf92fb (diff)
Firewire detection with reboot into diskmode for all iPods that support it (all but Nano and Video). * Hack for compiling iPod G3 removed. * Code cleanup.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14131 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/usb-fw-pp5002.c70
-rw-r--r--firmware/target/arm/usb-fw-pp502x.c (renamed from firmware/target/arm/usb-pp.c)35
2 files changed, 93 insertions, 12 deletions
diff --git a/firmware/target/arm/usb-fw-pp5002.c b/firmware/target/arm/usb-fw-pp5002.c
new file mode 100644
index 0000000000..e64d4f8f81
--- /dev/null
+++ b/firmware/target/arm/usb-fw-pp5002.c
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2007 by Jens Arnold
+ *
+ * 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 "ata.h"
+#include "cpu.h"
+#include "string.h"
+#include "system.h"
+#include "usb.h"
+#include "usb-target.h"
+
+void usb_init_device(void)
+{
+ /* TODO: add USB init for iPod 3rd gen */
+
+#if defined(IPOD_1G2G) || defined(IPOD_3G)
+ /* GPIO C bit 7 is firewire detect */
+ GPIOC_ENABLE |= 0x80;
+ GPIOC_OUTPUT_EN &= ~0x80;
+#endif
+}
+
+void usb_enable(bool on)
+{
+ /* This device specific code will eventually give way to proper USB
+ handling, which should be the same for all PP5002 targets. */
+ if (on)
+ {
+#ifdef IPOD_ARCH
+ /* For iPod, we can only do one thing with USB mode atm - reboot
+ into the flash-based disk-mode. This does not return. */
+
+ ata_sleepnow(); /* Immediately spindown the disk. */
+ sleep(HZ*2);
+
+ memcpy((void *)0x40017f00, "diskmodehotstuff\1", 17);
+
+ system_reboot(); /* Reboot */
+#endif
+ }
+}
+
+bool usb_detect(void)
+{
+#if defined(IPOD_1G2G) || defined(IPOD_3G)
+ /* GPIO C bit 7 is firewire detect */
+ if (!(GPIOC_INPUT_VAL & 0x80))
+ return true;
+#endif
+
+ /* TODO: add USB detection for iPod 3rd gen */
+
+ return false;
+}
diff --git a/firmware/target/arm/usb-pp.c b/firmware/target/arm/usb-fw-pp502x.c
index b497e86804..92e3dee562 100644
--- a/firmware/target/arm/usb-pp.c
+++ b/firmware/target/arm/usb-fw-pp502x.c
@@ -86,27 +86,25 @@ void usb_init_device(void)
udelay(0x186A0);
-
dr_controller_setup();
+
+#if defined(IPOD_COLOR) || defined(IPOD_4G) \
+ || defined(IPOD_MINI) || defined(IPOD_MINI2G)
+ /* GPIO C bit 1 is firewire detect */
+ GPIOC_ENABLE |= 0x02;
+ GPIOC_OUTPUT_EN &= ~0x02;
+#endif
}
void usb_enable(bool on)
{
/* This device specific code will eventually give way to proper USB
- handling, which should be the same for all PortalPlayer targets. */
+ handling, which should be the same for all PP502x targets. */
if (on)
{
#if defined(IPOD_ARCH) || defined(IRIVER_H10) || defined (IRIVER_H10_5GB)
/* For the H10 and iPod, we can only do one thing with USB mode - reboot
into the flash-based disk-mode. This does not return. */
-
- /* 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
#if defined(IRIVER_H10) || defined (IRIVER_H10_5GB)
if(button_status()==BUTTON_RIGHT)
@@ -114,9 +112,15 @@ void usb_enable(bool on)
{
ata_sleepnow(); /* Immediately spindown the disk. */
sleep(HZ*2);
-#ifdef IPOD_ARCH
- memcpy(storage_ptr, "diskmode\0\0hotstuff\0\0\1", 21);
+
+#ifdef IPOD_ARCH /* The following code is based on ipodlinux */
+#if CONFIG_CPU == PP5020
+ memcpy((void *)0x40017f00, "diskmode\0\0hotstuff\0\0\1", 21);
+#elif CONFIG_CPU == PP5022
+ memcpy((void *)0x4001ff00, "diskmode\0\0hotstuff\0\0\1", 21);
#endif
+#endif
+
system_reboot(); /* Reboot */
}
#endif
@@ -128,6 +132,13 @@ bool usb_detect(void)
static bool prev_usbstatus1 = false;
bool usbstatus1,usbstatus2;
+#if defined(IPOD_COLOR) || defined(IPOD_4G) \
+ || defined(IPOD_MINI) || defined(IPOD_MINI2G)
+ /* GPIO C bit 1 is firewire detect */
+ if (!(GPIOC_INPUT_VAL & 0x02))
+ return true;
+#endif
+
/* UDC_ID should have the bit format:
[31:24] = 0x0
[23:16] = 0x22 (Revision number)