Index: firmware/target/arm/ipod/power-ipod.c =================================================================== --- firmware/target/arm/ipod/power-ipod.c (revision 20042) +++ firmware/target/arm/ipod/power-ipod.c (working copy) @@ -150,3 +150,79 @@ #endif #endif } + +#ifdef HAVE_USB_CHARGING_ENABLE +/* This patch is EXPERIMENTAL and UNTESTED */ +bool usb_charging_enable(bool on) +{ + /* The bits should probably be set up for output. + These setups have probably already been done + */ +#if 0 +#if defined(IPOD_VIDEO) || defined(IPOD_NANO) + GPIOL_ENABLE |= 4; + GPIOL_OUTPUT_EN |= 4; + GPIOA_ENABLE |= 4; + GPIOA_OUTPUT_EN |= 4; +#if defined(IPOD_VIDEO) + GPO32_ENABLE |= 0x10000000; +#endif +#else /* !defined(IPOD_VIDEO) && !defined(IPOD_NANO) */ +#if defined(IPOD_MINI2G) + GPIOJ_ENABLE |= 2; + GPIOJ_OUTPUT_EN |= 2; +#else + GPO32_ENABLE |= 0x8000000; +#endif + GPO32_ENABLE |= 0x40; +#if defined(IPOD_4G) || defined(IPOD_COLOR) + GPO32_ENABLE |= 0x200; +#endif +#endif /* !defined(IPOD_VIDEO) && !defined(IPOD_NANO) */ +#endif /* 0 */ + + /* This should be 0 when others are 1. + Setting others to 0 and this to 1 is a valid but unknown state. + */ +#if defined(IPOD_VIDEO) || defined(IPOD_NANO) + GPIOL_OUTPUT_VAL &= ~4; +#elif defined(IPOD_MINI2G) + GPIOJ_OUTPUT_VAL &= ~2; +#else + GPO32_VAL &= ~0x8000000; +#endif + + /* This should enable USB charging */ +#if defined(IPOD_VIDEO) || defined(IPOD_NANO) + if (on) + GPIOA_OUTPUT_VAL |= 4; + else + GPIOA_OUTPUT_VAL &= ~4; +#else + if (on) + GPO32_VAL |= 0x40; + else + GPO32_VAL &= ~0x40; +#endif + + /* This bit may be set when USB charging is enabled. + It probably increases the USB current limit. + FIXME: This should probably only be done if you think the source + can supply 500 mA. + */ +#if defined(IPOD_VIDEO) + if (on) + GPO32_VAL |= 0x10000000; + else + GPO32_VAL &= ~0x10000000; +#elif defined(IPOD_4G) || defined(IPOD_COLOR) + if (on) + GPO32_VAL |= 0x200; + else + GPO32_VAL &= ~0x200; +#endif + /* This might be GPIOD & 40 on 2G */ + + return on; +} +#endif /* HAVE_USB_CHARGING_ENABLE */