diff options
author | Jens Arnold <amiconn@rockbox.org> | 2007-08-01 22:44:02 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2007-08-01 22:44:02 +0000 |
commit | cb896cdd04ae04cbf9cb59990c920e579ea6887a (patch) | |
tree | 27fa4213a221e5b3827321d25d1c8c0d8dd06419 /firmware/target | |
parent | a049fa7c82cf155314c7e141f72ac8f8a7cf92fb (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.c | 70 | ||||
-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) |