diff options
| author | Michael Sparmann <theseven@rockbox.org> | 2009-10-11 12:45:27 +0000 |
|---|---|---|
| committer | Michael Sparmann <theseven@rockbox.org> | 2009-10-11 12:45:27 +0000 |
| commit | 264d877889c698736143df6d2cf9648c472c3c52 (patch) | |
| tree | 6955149c11a2fe02590f3ac775083f46188d68f7 | |
| parent | a79dc877615c2af571bf0416dd2867c000701e7e (diff) | |
| download | rockbox-264d877889c698736143df6d2cf9648c472c3c52.zip rockbox-264d877889c698736143df6d2cf9648c472c3c52.tar.gz rockbox-264d877889c698736143df6d2cf9648c472c3c52.tar.bz2 rockbox-264d877889c698736143df6d2cf9648c472c3c52.tar.xz | |
Add a thread to power down the NAND after inactivity on the iPod Nano 2G
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23106 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | firmware/target/arm/s5l8700/ata-nand-s5l8700.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c index 308f0a5..d005802 100644 --- a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c +++ b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c @@ -37,6 +37,8 @@ long last_disk_activity = -1; /** static, private data **/ static bool initialized = false; +static long nand_stack[20]; + /* API Functions */ void nand_led(bool onoff) @@ -47,13 +49,17 @@ void nand_led(bool onoff) int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int incount, void* inbuf) { - return ftl_read(start, incount, inbuf); + int rc = ftl_read(start, incount, inbuf); + last_disk_activity = current_tick; + return rc; } int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* outbuf) { - return ftl_write(start, count, outbuf); + int rc = ftl_write(start, count, outbuf); + last_disk_activity = current_tick; + return rc; } void nand_spindown(int seconds) @@ -73,6 +79,7 @@ void nand_sleepnow(void) void nand_spin(void) { + last_disk_activity = current_tick; nand_power_up(); } @@ -88,20 +95,38 @@ void nand_get_info(IF_MD2(int drive,) struct storage_info *info) long nand_last_disk_activity(void) { - return 0; + return last_disk_activity; } #ifdef HAVE_STORAGE_FLUSH int nand_flush(void) { + last_disk_activity = current_tick; return ftl_sync(); } #endif +static void nand_thread(void) +{ + while (1) + { + if (TIME_AFTER(current_tick, last_disk_activity + HZ / 5)) + nand_power_down(); + sleep(HZ / 10); + } +} + int nand_init(void) { if (ftl_init()) return 1; + last_disk_activity = current_tick; + + create_thread(nand_thread, nand_stack, + sizeof(nand_stack), 0, "nand" + IF_PRIO(, PRIORITY_USER_INTERFACE) + IF_COP(, CPU)); + initialized = true; return 0; } |