Index: firmware/target/arm/s5l8700/usb-nano2g-6g.c =================================================================== --- firmware/target/arm/s5l8700/usb-nano2g-6g.c (revision 31637) +++ firmware/target/arm/s5l8700/usb-nano2g-6g.c (working copy) @@ -37,7 +37,11 @@ int usb_detect(void) { +#ifdef IPOD_6G + if (~PDAT(12) & 8) +#else /* IPOD_NANO2G */ if (charger_inserted()) +#endif return USB_INSERTED; return USB_EXTRACTED; } Index: firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c =================================================================== --- firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c (revision 31637) +++ firmware/target/arm/s5l8702/ipod6g/power-ipod6g.c (working copy) @@ -31,7 +31,8 @@ void power_off(void) { - pmu_set_wake_condition(0x42); /* USB inserted or EXTON1 */ + /* USB inserted (EXTON2) or button press / unlock holdswitch (EXTON1) */ + pmu_set_wake_condition(0x06); pmu_enter_standby(); while(1); @@ -63,13 +64,28 @@ } #endif +#define IPOD6G_STATUS_CHARGING 0 +#define IPOD6G_STATUS_TOPOFF 1 +#define IPOD6G_STATUS_UNKNOWN 2 /* trickle ???, error ??? */ +#define IPOD6G_STATUS_DISCHARGING 3 + +static inline int get_charging_status(void) +{ + return ((PDAT(11) & 0x30) >> 4); +} + unsigned int power_input_status(void) { - return (PDAT(12) & 8) ? POWER_INPUT_NONE : POWER_INPUT_MAIN_CHARGER; + if (usb_detect()) + return POWER_INPUT_USB_CHARGER; + else if (get_charging_status() != IPOD6G_STATUS_DISCHARGING) + return POWER_INPUT_MAIN_CHARGER; + + return POWER_INPUT_NONE; } bool charging_state(void) { - return false; //TODO: Figure out + return (get_charging_status() == IPOD6G_STATUS_CHARGING); } #endif /* CONFIG_CHARGING */ Index: firmware/target/arm/s5l8702/debug-s5l8702.c =================================================================== --- firmware/target/arm/s5l8702/debug-s5l8702.c (revision 31637) +++ firmware/target/arm/s5l8702/debug-s5l8702.c (working copy) @@ -84,7 +84,8 @@ _DEBUG_PRINTF("cpu voltage: %dmV",625 + pmu_read(0x1e)*25); _DEBUG_PRINTF("memory voltage: %dmV",625 + pmu_read(0x22)*25); line++; - _DEBUG_PRINTF("charging: %s", charging_state() ? "true" : "false"); + _DEBUG_PRINTF("charging: %s, PWR input: 0x%02x", + charging_state() ? "true" : "false", power_input_status()); _DEBUG_PRINTF("backlight: %s", pmu_read(0x29) ? "on" : "off"); _DEBUG_PRINTF("brightness value: %d", pmu_read(0x28)); }