From cb896cdd04ae04cbf9cb59990c920e579ea6887a Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Wed, 1 Aug 2007 22:44:02 +0000 Subject: [PATCH] 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 --- apps/bitmaps/native/SOURCES | 4 + apps/bitmaps/native/usblogo.fw.128x39x2.bmp | Bin 0 -> 5062 bytes firmware/SOURCES | 23 +++--- firmware/export/config-ipod1g2g.h | 3 +- firmware/export/config-ipod3g.h | 3 +- firmware/export/pp5002.h | 5 -- firmware/target/arm/usb-fw-pp5002.c | 70 ++++++++++++++++++ .../target/arm/{usb-pp.c => usb-fw-pp502x.c} | 35 ++++++--- 8 files changed, 113 insertions(+), 30 deletions(-) create mode 100644 apps/bitmaps/native/usblogo.fw.128x39x2.bmp create mode 100644 firmware/target/arm/usb-fw-pp5002.c rename firmware/target/arm/{usb-pp.c => usb-fw-pp502x.c} (85%) diff --git a/apps/bitmaps/native/SOURCES b/apps/bitmaps/native/SOURCES index 62deb0afac..094b2d61b1 100644 --- a/apps/bitmaps/native/SOURCES +++ b/apps/bitmaps/native/SOURCES @@ -31,7 +31,11 @@ usblogo.176x48x16.bmp usblogo.128x37x16.bmp #endif #elif LCD_DEPTH > 1 /* greyscale */ +#ifdef IPOD_1G2G /* use firewire logo */ +usblogo.fw.128x39x2.bmp +#else usblogo.128x33x2.bmp +#endif #else /* monochrome */ #if LCD_WIDTH == 112 usblogo.100x20x1.bmp diff --git a/apps/bitmaps/native/usblogo.fw.128x39x2.bmp b/apps/bitmaps/native/usblogo.fw.128x39x2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bdf7af52b7ee492ecd8a721ca94fd5b4c682edb7 GIT binary patch literal 5062 zcmcInJ-XW<5Cl0z`t)g&bEHU@()Y>9T%^dg{AP9mEwCU7`>j3@AiT4)KS=)d=l{1L z@*Dk6w7+OS&|>(C9&5-L`jHa2-F!1q)0P)x#bCIEnT^!GcB((t;_C3%{$|t>6bJ zoF`(msnTqXx4HSWHg5g375of7vBKi-zR;vF?(kee{sGn3XE3=qiBCAa8XPkzJC_3kBVS1GBpte5zn>HNa{5Dt-?iYJ6rG zutp(x1)u5Ju_s(sDx3okWB9;#K;D`hZEuJE7jT-;v>Km|rdr;6S;B`JzRu3^$L0ht z_0*Vf7T?t3K18Lp+&S;~b4{(#G=K&8tY-B5y_2CU(W2dmTe0)N5RY5=|%A>DcY-7znol=z?H9{?;4 zSj3M!NUC;?Kk#V){lCZ`0koGKsV#TT{rD3U?@MOE3O;>D$%%-2;txQA?#;p1tpL{~ zWI57K2%S0-oBvw$<&{XDqLhP1di*_C1e3T~&f$mQ`>(;~w8JMq34R7O_mlWuqI))Z z`0Cz)0iTbbqbucSnCozYANKf%b^cPaw4sBRg;(&w$O(TNe z&fkDJLsS&bQ#!C|JH7^>1ub)aKUY$tcuqGvcmNZiZ$+z~nv=fllvFB)>A-Wk!5 ) \___| < | \_\ ( <_> > < < + * 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 similarity index 85% rename from firmware/target/arm/usb-pp.c rename to 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)