Index: firmware/export/config-ipodnano2g.h =================================================================== --- firmware/export/config-ipodnano2g.h (revision 23050) +++ firmware/export/config-ipodnano2g.h (working copy) @@ -39,6 +39,9 @@ /* define this to enable JPEG decoding */ #define HAVE_JPEG +/* define this if the LCD can shut down */ +#define HAVE_LCD_SHUTDOWN + /* define this if you can invert the colours on your LCD */ //#define HAVE_LCD_INVERT @@ -58,6 +61,8 @@ #define CONFIG_NAND NAND_SAMSUNG +#define NEEDS_STORAGE_FLUSH + /* The NAND flash has 2048-byte sectors, and is our only storage */ #define SECTOR_SIZE 2048 Index: firmware/export/nand.h =================================================================== --- firmware/export/nand.h (revision 23050) +++ firmware/export/nand.h (working copy) @@ -37,6 +37,7 @@ void nand_close(void); int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf); int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf); +int nand_flush(void); void nand_spin(void); int nand_spinup_time(void); /* ticks */ Index: firmware/export/storage.h =================================================================== --- firmware/export/storage.h (revision 23050) +++ firmware/export/storage.h (working copy) @@ -69,6 +69,7 @@ #define storage_close() ata_close() #define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MD2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MD2(drive,) start, count, buf) + #define storage_flush() (void)0 #define storage_last_disk_activity() ata_last_disk_activity() #define storage_spinup_time() ata_spinup_time() #define storage_get_identify() ata_get_identify() @@ -92,6 +93,7 @@ #define storage_init() sd_init() #define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MD2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MD2(drive,) start, count, buf) + #define storage_flush() (void)0 #define storage_last_disk_activity() sd_last_disk_activity() #define storage_spinup_time() 0 #define storage_get_identify() sd_get_identify() @@ -115,6 +117,7 @@ #define storage_init() mmc_init() #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MD2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MD2(drive,) start, count, buf) + #define storage_flush() (void)0 #define storage_last_disk_activity() mmc_last_disk_activity() #define storage_spinup_time() 0 #define storage_get_identify() mmc_get_identify() @@ -138,6 +141,7 @@ #define storage_init() nand_init() #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MD2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MD2(drive,) start, count, buf) + #define storage_flush() nand_flush() #define storage_last_disk_activity() nand_last_disk_activity() #define storage_spinup_time() 0 #define storage_get_identify() nand_get_identify() @@ -161,6 +165,7 @@ #define storage_init() ramdisk_init() #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MD2(drive,) start, count, buf) #define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MD2(drive,) start, count, buf) + #define storage_flush() (void)0 #define storage_last_disk_activity() ramdisk_last_disk_activity() #define storage_spinup_time() 0 #define storage_get_identify() ramdisk_get_identify() @@ -187,6 +192,7 @@ int storage_init(void); int storage_read_sectors(int drive, unsigned long start, int count, void* buf); int storage_write_sectors(int drive, unsigned long start, int count, const void* buf); +int storage_flush(void); void storage_spin(void); void storage_spindown(int seconds); long storage_last_disk_activity(void); Index: firmware/powermgmt.c =================================================================== --- firmware/powermgmt.c (revision 23050) +++ firmware/powermgmt.c (working copy) @@ -749,6 +749,14 @@ #ifdef HAVE_LCD_BITMAP glyph_cache_save(); #endif + +/* Commit pending writes if needed. Even though we don't do write caching, + things like flash translation layers may need this to commit scattered + pages to there final locations. So far only used for iPod Nano 2G. */ +#ifdef NEEDS_STORAGE_FLUSH + storage_flush(); +#endif + if (storage_disk_is_active()) storage_spindown(1); } Index: firmware/storage.c =================================================================== --- firmware/storage.c (revision 23050) +++ firmware/storage.c (working copy) @@ -293,6 +293,33 @@ return rc; } +int storage_flush(void) +{ + int rc=0; + +#if (CONFIG_STORAGE & STORAGE_ATA) + //if ((rc=ata_flush())) return rc; +#endif + +#if (CONFIG_STORAGE & STORAGE_MMC) + //if ((rc=mmc_flush())) return rc; +#endif + +#if (CONFIG_STORAGE & STORAGE_SD) + //if ((rc=sd_flush())) return rc; +#endif + +#if (CONFIG_STORAGE & STORAGE_NAND) + if ((rc=nand_flush())) return rc; +#endif + +#if (CONFIG_STORAGE & STORAGE_RAMDISK) + //if ((rc=ramdisk_flush())) return rc; +#endif + + return rc; +} + void storage_spin(void) { #if (CONFIG_STORAGE & STORAGE_ATA) Index: firmware/target/arm/ata-nand-telechips.c =================================================================== --- firmware/target/arm/ata-nand-telechips.c (revision 23050) +++ firmware/target/arm/ata-nand-telechips.c (working copy) @@ -866,6 +866,10 @@ return -1; } +int nand_flush(void) +{ + return 0; +} #ifdef STORAGE_GET_INFO void nand_get_info(IF_MD2(int drive,) struct storage_info *info) Index: firmware/target/arm/s5l8700/ata-nand-s5l8700.c =================================================================== --- firmware/target/arm/s5l8700/ata-nand-s5l8700.c (revision 23050) +++ firmware/target/arm/s5l8700/ata-nand-s5l8700.c (working copy) @@ -36,9 +36,6 @@ /** static, private data **/ static bool initialized = false; -static long next_yield = 0; -#define MIN_YIELD_PERIOD 2000 - /* API Functions */ void nand_led(bool onoff) @@ -67,6 +64,10 @@ { } +void nand_sleepnow(void) +{ +} + void nand_spin(void) { } @@ -86,6 +87,11 @@ return 0; } +int nand_flush(void) +{ + return ftl_sync(); +} + int nand_init(void) { if (ftl_init()) return 1; Index: firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c =================================================================== --- firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c (revision 23050) +++ firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c (working copy) @@ -25,6 +25,7 @@ #include "lcd.h" #include "system.h" #include "cpu.h" +#include "pmu-target.h" /* The Nano 2G has two different LCD types. What we call "type 0" @@ -124,10 +125,11 @@ } } +void lcd_shutdown(void) +{ + pmu_write(0x2b, 0); /* Kill the backlight, instantly. */ + pmu_write(0x29, 0); - -void lcd_off(void) -{ if (lcd_type == 0) { s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x232); @@ -151,6 +153,11 @@ } } + +void lcd_off(void) +{ +} + void lcd_on(void) { } Index: firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c =================================================================== --- firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c (revision 23050) +++ firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c (working copy) @@ -103,4 +103,4 @@ if (onoff) newval |= 1 << (2 * (gate - 4)); pmu_write(0x3C, newval); } -} \ No newline at end of file +} Index: firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c =================================================================== --- firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c (revision 23050) +++ firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c (working copy) @@ -32,13 +32,6 @@ void power_off(void) { - if (ftl_sync() != 0) panicf("Failed to unmount flash!"); - - pmu_write(0x2b, 0); /* Kill the backlight, instantly. */ - pmu_write(0x29, 0); - - lcd_off(); - pmu_switch_power(0, 0); pmu_switch_power(2, 0); pmu_switch_power(3, 0); Index: firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c =================================================================== --- firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c (revision 23050) +++ firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c (working copy) @@ -52,7 +52,6 @@ int rtc_write_datetime(const struct tm *tm) { unsigned int i; - int rc, oldlevel; unsigned char buf[7]; buf[0] = tm->tm_sec; Index: firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c =================================================================== --- firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c (revision 23050) +++ firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c (working copy) @@ -685,6 +685,11 @@ return -1; } +int nand_flush(void) +{ + return 0; +} + void nand_spindown(int seconds) { /* null */