diff options
author | Michael Sparmann <theseven@rockbox.org> | 2009-10-09 20:36:09 +0000 |
---|---|---|
committer | Michael Sparmann <theseven@rockbox.org> | 2009-10-09 20:36:09 +0000 |
commit | f0a96580ae84cdfbb09db568f296491c699b6a4b (patch) | |
tree | 73d71563c1ab314f322e0fe10fc80c3b7f698ab7 | |
parent | 8e3e5e7a59f741c16eafc5ff0672af2eb1404835 (diff) | |
download | rockbox-f0a96580ae84cdfbb09db568f296491c699b6a4b.tar.gz rockbox-f0a96580ae84cdfbb09db568f296491c699b6a4b.zip |
Core changes to allow storage drivers to do cleanup on shutdown, and iPod Nano 2G shutdown code rework (FS#10668)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23057 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/export/config-ipodnano2g.h | 7 | ||||
-rw-r--r-- | firmware/export/nand.h | 3 | ||||
-rw-r--r-- | firmware/export/storage.h | 16 | ||||
-rw-r--r-- | firmware/powermgmt.c | 8 | ||||
-rw-r--r-- | firmware/storage.c | 29 | ||||
-rw-r--r-- | firmware/target/arm/ata-nand-telechips.c | 6 | ||||
-rw-r--r-- | firmware/target/arm/s5l8700/ata-nand-s5l8700.c | 14 | ||||
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c | 13 | ||||
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c | 7 | ||||
-rw-r--r-- | firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c | 1 | ||||
-rw-r--r-- | firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c | 7 |
12 files changed, 98 insertions, 15 deletions
diff --git a/firmware/export/config-ipodnano2g.h b/firmware/export/config-ipodnano2g.h index 9d36a37046..641e88860b 100644 --- a/firmware/export/config-ipodnano2g.h +++ b/firmware/export/config-ipodnano2g.h | |||
@@ -39,6 +39,9 @@ | |||
39 | /* define this to enable JPEG decoding */ | 39 | /* define this to enable JPEG decoding */ |
40 | #define HAVE_JPEG | 40 | #define HAVE_JPEG |
41 | 41 | ||
42 | /* define this if the LCD can shut down */ | ||
43 | #define HAVE_LCD_SHUTDOWN | ||
44 | |||
42 | /* define this if you can invert the colours on your LCD */ | 45 | /* define this if you can invert the colours on your LCD */ |
43 | //#define HAVE_LCD_INVERT | 46 | //#define HAVE_LCD_INVERT |
44 | 47 | ||
@@ -58,6 +61,10 @@ | |||
58 | 61 | ||
59 | #define CONFIG_NAND NAND_SAMSUNG | 62 | #define CONFIG_NAND NAND_SAMSUNG |
60 | 63 | ||
64 | /* define this if at least one storage driver | ||
65 | needs to do cleanup on shutdown */ | ||
66 | #define HAVE_STORAGE_FLUSH | ||
67 | |||
61 | /* The NAND flash has 2048-byte sectors, and is our only storage */ | 68 | /* The NAND flash has 2048-byte sectors, and is our only storage */ |
62 | #define SECTOR_SIZE 2048 | 69 | #define SECTOR_SIZE 2048 |
63 | 70 | ||
diff --git a/firmware/export/nand.h b/firmware/export/nand.h index 67ebe73ddf..60b986dc2f 100644 --- a/firmware/export/nand.h +++ b/firmware/export/nand.h | |||
@@ -37,6 +37,9 @@ int nand_init(void); | |||
37 | void nand_close(void); | 37 | void nand_close(void); |
38 | int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf); | 38 | int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf); |
39 | int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf); | 39 | int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf); |
40 | #ifdef HAVE_STORAGE_FLUSH | ||
41 | int nand_flush(void); | ||
42 | #endif | ||
40 | void nand_spin(void); | 43 | void nand_spin(void); |
41 | int nand_spinup_time(void); /* ticks */ | 44 | int nand_spinup_time(void); /* ticks */ |
42 | 45 | ||
diff --git a/firmware/export/storage.h b/firmware/export/storage.h index fc49d0ce31..cb4ad7fc3a 100644 --- a/firmware/export/storage.h +++ b/firmware/export/storage.h | |||
@@ -69,6 +69,9 @@ struct storage_info | |||
69 | #define storage_close() ata_close() | 69 | #define storage_close() ata_close() |
70 | #define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MD2(drive,) start, count, buf) | 70 | #define storage_read_sectors(drive, start, count, buf) ata_read_sectors(IF_MD2(drive,) start, count, buf) |
71 | #define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MD2(drive,) start, count, buf) | 71 | #define storage_write_sectors(drive, start, count, buf) ata_write_sectors(IF_MD2(drive,) start, count, buf) |
72 | #ifdef HAVE_STORAGE_FLUSH | ||
73 | #define storage_flush() (void)0 | ||
74 | #endif | ||
72 | #define storage_last_disk_activity() ata_last_disk_activity() | 75 | #define storage_last_disk_activity() ata_last_disk_activity() |
73 | #define storage_spinup_time() ata_spinup_time() | 76 | #define storage_spinup_time() ata_spinup_time() |
74 | #define storage_get_identify() ata_get_identify() | 77 | #define storage_get_identify() ata_get_identify() |
@@ -92,6 +95,9 @@ struct storage_info | |||
92 | #define storage_init() sd_init() | 95 | #define storage_init() sd_init() |
93 | #define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MD2(drive,) start, count, buf) | 96 | #define storage_read_sectors(drive, start, count, buf) sd_read_sectors(IF_MD2(drive,) start, count, buf) |
94 | #define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MD2(drive,) start, count, buf) | 97 | #define storage_write_sectors(drive, start, count, buf) sd_write_sectors(IF_MD2(drive,) start, count, buf) |
98 | #ifdef HAVE_STORAGE_FLUSH | ||
99 | #define storage_flush() (void)0 | ||
100 | #endif | ||
95 | #define storage_last_disk_activity() sd_last_disk_activity() | 101 | #define storage_last_disk_activity() sd_last_disk_activity() |
96 | #define storage_spinup_time() 0 | 102 | #define storage_spinup_time() 0 |
97 | #define storage_get_identify() sd_get_identify() | 103 | #define storage_get_identify() sd_get_identify() |
@@ -115,6 +121,9 @@ struct storage_info | |||
115 | #define storage_init() mmc_init() | 121 | #define storage_init() mmc_init() |
116 | #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MD2(drive,) start, count, buf) | 122 | #define storage_read_sectors(drive, start, count, buf) mmc_read_sectors(IF_MD2(drive,) start, count, buf) |
117 | #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MD2(drive,) start, count, buf) | 123 | #define storage_write_sectors(drive, start, count, buf) mmc_write_sectors(IF_MD2(drive,) start, count, buf) |
124 | #ifdef HAVE_STORAGE_FLUSH | ||
125 | #define storage_flush() (void)0 | ||
126 | #endif | ||
118 | #define storage_last_disk_activity() mmc_last_disk_activity() | 127 | #define storage_last_disk_activity() mmc_last_disk_activity() |
119 | #define storage_spinup_time() 0 | 128 | #define storage_spinup_time() 0 |
120 | #define storage_get_identify() mmc_get_identify() | 129 | #define storage_get_identify() mmc_get_identify() |
@@ -138,6 +147,9 @@ struct storage_info | |||
138 | #define storage_init() nand_init() | 147 | #define storage_init() nand_init() |
139 | #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MD2(drive,) start, count, buf) | 148 | #define storage_read_sectors(drive, start, count, buf) nand_read_sectors(IF_MD2(drive,) start, count, buf) |
140 | #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MD2(drive,) start, count, buf) | 149 | #define storage_write_sectors(drive, start, count, buf) nand_write_sectors(IF_MD2(drive,) start, count, buf) |
150 | #ifdef HAVE_STORAGE_FLUSH | ||
151 | #define storage_flush() nand_flush() | ||
152 | #endif | ||
141 | #define storage_last_disk_activity() nand_last_disk_activity() | 153 | #define storage_last_disk_activity() nand_last_disk_activity() |
142 | #define storage_spinup_time() 0 | 154 | #define storage_spinup_time() 0 |
143 | #define storage_get_identify() nand_get_identify() | 155 | #define storage_get_identify() nand_get_identify() |
@@ -161,6 +173,9 @@ struct storage_info | |||
161 | #define storage_init() ramdisk_init() | 173 | #define storage_init() ramdisk_init() |
162 | #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MD2(drive,) start, count, buf) | 174 | #define storage_read_sectors(drive, start, count, buf) ramdisk_read_sectors(IF_MD2(drive,) start, count, buf) |
163 | #define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MD2(drive,) start, count, buf) | 175 | #define storage_write_sectors(drive, start, count, buf) ramdisk_write_sectors(IF_MD2(drive,) start, count, buf) |
176 | #ifdef HAVE_STORAGE_FLUSH | ||
177 | #define storage_flush() (void)0 | ||
178 | #endif | ||
164 | #define storage_last_disk_activity() ramdisk_last_disk_activity() | 179 | #define storage_last_disk_activity() ramdisk_last_disk_activity() |
165 | #define storage_spinup_time() 0 | 180 | #define storage_spinup_time() 0 |
166 | #define storage_get_identify() ramdisk_get_identify() | 181 | #define storage_get_identify() ramdisk_get_identify() |
@@ -187,6 +202,7 @@ int storage_soft_reset(void); | |||
187 | int storage_init(void); | 202 | int storage_init(void); |
188 | int storage_read_sectors(int drive, unsigned long start, int count, void* buf); | 203 | int storage_read_sectors(int drive, unsigned long start, int count, void* buf); |
189 | int storage_write_sectors(int drive, unsigned long start, int count, const void* buf); | 204 | int storage_write_sectors(int drive, unsigned long start, int count, const void* buf); |
205 | int storage_flush(void); | ||
190 | void storage_spin(void); | 206 | void storage_spin(void); |
191 | void storage_spindown(int seconds); | 207 | void storage_spindown(int seconds); |
192 | long storage_last_disk_activity(void); | 208 | long storage_last_disk_activity(void); |
diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c index 6ec0307ae5..e756bac3c2 100644 --- a/firmware/powermgmt.c +++ b/firmware/powermgmt.c | |||
@@ -749,6 +749,14 @@ void shutdown_hw(void) | |||
749 | #ifdef HAVE_LCD_BITMAP | 749 | #ifdef HAVE_LCD_BITMAP |
750 | glyph_cache_save(); | 750 | glyph_cache_save(); |
751 | #endif | 751 | #endif |
752 | |||
753 | /* Commit pending writes if needed. Even though we don't do write caching, | ||
754 | things like flash translation layers may need this to commit scattered | ||
755 | pages to there final locations. So far only used for iPod Nano 2G. */ | ||
756 | #ifdef HAVE_STORAGE_FLUSH | ||
757 | storage_flush(); | ||
758 | #endif | ||
759 | |||
752 | if (storage_disk_is_active()) | 760 | if (storage_disk_is_active()) |
753 | storage_spindown(1); | 761 | storage_spindown(1); |
754 | } | 762 | } |
diff --git a/firmware/storage.c b/firmware/storage.c index cee7d1cc8b..d6700d1148 100644 --- a/firmware/storage.c +++ b/firmware/storage.c | |||
@@ -293,6 +293,35 @@ int storage_soft_reset(void) | |||
293 | return rc; | 293 | return rc; |
294 | } | 294 | } |
295 | 295 | ||
296 | #ifdef HAVE_STORAGE_FLUSH | ||
297 | int storage_flush(void) | ||
298 | { | ||
299 | int rc=0; | ||
300 | |||
301 | #if (CONFIG_STORAGE & STORAGE_ATA) | ||
302 | //if ((rc=ata_flush())) return rc; | ||
303 | #endif | ||
304 | |||
305 | #if (CONFIG_STORAGE & STORAGE_MMC) | ||
306 | //if ((rc=mmc_flush())) return rc; | ||
307 | #endif | ||
308 | |||
309 | #if (CONFIG_STORAGE & STORAGE_SD) | ||
310 | //if ((rc=sd_flush())) return rc; | ||
311 | #endif | ||
312 | |||
313 | #if (CONFIG_STORAGE & STORAGE_NAND) | ||
314 | if ((rc=nand_flush())) return rc; | ||
315 | #endif | ||
316 | |||
317 | #if (CONFIG_STORAGE & STORAGE_RAMDISK) | ||
318 | //if ((rc=ramdisk_flush())) return rc; | ||
319 | #endif | ||
320 | |||
321 | return rc; | ||
322 | } | ||
323 | #endif | ||
324 | |||
296 | void storage_spin(void) | 325 | void storage_spin(void) |
297 | { | 326 | { |
298 | #if (CONFIG_STORAGE & STORAGE_ATA) | 327 | #if (CONFIG_STORAGE & STORAGE_ATA) |
diff --git a/firmware/target/arm/ata-nand-telechips.c b/firmware/target/arm/ata-nand-telechips.c index 8fd1bbf521..81dde33938 100644 --- a/firmware/target/arm/ata-nand-telechips.c +++ b/firmware/target/arm/ata-nand-telechips.c | |||
@@ -866,6 +866,12 @@ int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, | |||
866 | return -1; | 866 | return -1; |
867 | } | 867 | } |
868 | 868 | ||
869 | #ifdef HAVE_STORAGE_FLUSH | ||
870 | int nand_flush(void) | ||
871 | { | ||
872 | return 0; | ||
873 | } | ||
874 | #endif | ||
869 | 875 | ||
870 | #ifdef STORAGE_GET_INFO | 876 | #ifdef STORAGE_GET_INFO |
871 | void nand_get_info(IF_MD2(int drive,) struct storage_info *info) | 877 | void nand_get_info(IF_MD2(int drive,) struct storage_info *info) |
diff --git a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c index b3b1314a50..883c167c78 100644 --- a/firmware/target/arm/s5l8700/ata-nand-s5l8700.c +++ b/firmware/target/arm/s5l8700/ata-nand-s5l8700.c | |||
@@ -36,9 +36,6 @@ long last_disk_activity = -1; | |||
36 | /** static, private data **/ | 36 | /** static, private data **/ |
37 | static bool initialized = false; | 37 | static bool initialized = false; |
38 | 38 | ||
39 | static long next_yield = 0; | ||
40 | #define MIN_YIELD_PERIOD 2000 | ||
41 | |||
42 | /* API Functions */ | 39 | /* API Functions */ |
43 | 40 | ||
44 | void nand_led(bool onoff) | 41 | void nand_led(bool onoff) |
@@ -67,6 +64,10 @@ void nand_sleep(void) | |||
67 | { | 64 | { |
68 | } | 65 | } |
69 | 66 | ||
67 | void nand_sleepnow(void) | ||
68 | { | ||
69 | } | ||
70 | |||
70 | void nand_spin(void) | 71 | void nand_spin(void) |
71 | { | 72 | { |
72 | } | 73 | } |
@@ -86,6 +87,13 @@ long nand_last_disk_activity(void) | |||
86 | return 0; | 87 | return 0; |
87 | } | 88 | } |
88 | 89 | ||
90 | #ifdef HAVE_STORAGE_FLUSH | ||
91 | int nand_flush(void) | ||
92 | { | ||
93 | return ftl_sync(); | ||
94 | } | ||
95 | #endif | ||
96 | |||
89 | int nand_init(void) | 97 | int nand_init(void) |
90 | { | 98 | { |
91 | if (ftl_init()) return 1; | 99 | if (ftl_init()) return 1; |
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c index 76e35ead30..c430a327a2 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include "lcd.h" | 25 | #include "lcd.h" |
26 | #include "system.h" | 26 | #include "system.h" |
27 | #include "cpu.h" | 27 | #include "cpu.h" |
28 | #include "pmu-target.h" | ||
28 | 29 | ||
29 | 30 | ||
30 | /* The Nano 2G has two different LCD types. What we call "type 0" | 31 | /* The Nano 2G has two different LCD types. What we call "type 0" |
@@ -124,10 +125,11 @@ void lcd_set_flip(bool yesno) | |||
124 | } | 125 | } |
125 | } | 126 | } |
126 | 127 | ||
127 | 128 | void lcd_shutdown(void) | |
128 | |||
129 | void lcd_off(void) | ||
130 | { | 129 | { |
130 | pmu_write(0x2b, 0); /* Kill the backlight, instantly. */ | ||
131 | pmu_write(0x29, 0); | ||
132 | |||
131 | if (lcd_type == 0) | 133 | if (lcd_type == 0) |
132 | { | 134 | { |
133 | s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x232); | 135 | s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x232); |
@@ -151,6 +153,11 @@ void lcd_off(void) | |||
151 | } | 153 | } |
152 | } | 154 | } |
153 | 155 | ||
156 | |||
157 | void lcd_off(void) | ||
158 | { | ||
159 | } | ||
160 | |||
154 | void lcd_on(void) | 161 | void lcd_on(void) |
155 | { | 162 | { |
156 | } | 163 | } |
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c index 4dd295c21a..ca2b5f2775 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c | |||
@@ -103,4 +103,4 @@ void pmu_switch_power(int gate, int onoff) | |||
103 | if (onoff) newval |= 1 << (2 * (gate - 4)); | 103 | if (onoff) newval |= 1 << (2 * (gate - 4)); |
104 | pmu_write(0x3C, newval); | 104 | pmu_write(0x3C, newval); |
105 | } | 105 | } |
106 | } \ No newline at end of file | 106 | } |
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c index 31f23ff9ff..cba1514aad 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c | |||
@@ -32,13 +32,6 @@ | |||
32 | 32 | ||
33 | void power_off(void) | 33 | void power_off(void) |
34 | { | 34 | { |
35 | if (ftl_sync() != 0) panicf("Failed to unmount flash!"); | ||
36 | |||
37 | pmu_write(0x2b, 0); /* Kill the backlight, instantly. */ | ||
38 | pmu_write(0x29, 0); | ||
39 | |||
40 | lcd_off(); | ||
41 | |||
42 | pmu_switch_power(0, 0); | 35 | pmu_switch_power(0, 0); |
43 | pmu_switch_power(2, 0); | 36 | pmu_switch_power(2, 0); |
44 | pmu_switch_power(3, 0); | 37 | pmu_switch_power(3, 0); |
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c index 01d64f1c54..bad9581d8f 100644 --- a/firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c +++ b/firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c | |||
@@ -52,7 +52,6 @@ int rtc_read_datetime(struct tm *tm) | |||
52 | int rtc_write_datetime(const struct tm *tm) | 52 | int rtc_write_datetime(const struct tm *tm) |
53 | { | 53 | { |
54 | unsigned int i; | 54 | unsigned int i; |
55 | int rc, oldlevel; | ||
56 | unsigned char buf[7]; | 55 | unsigned char buf[7]; |
57 | 56 | ||
58 | buf[0] = tm->tm_sec; | 57 | buf[0] = tm->tm_sec; |
diff --git a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c index a51dc5e882..bbfffc3264 100644 --- a/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c +++ b/firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c | |||
@@ -685,6 +685,13 @@ int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const | |||
685 | return -1; | 685 | return -1; |
686 | } | 686 | } |
687 | 687 | ||
688 | #ifdef HAVE_STORAGE_FLUSH | ||
689 | int nand_flush(void) | ||
690 | { | ||
691 | return 0; | ||
692 | } | ||
693 | #endif | ||
694 | |||
688 | void nand_spindown(int seconds) | 695 | void nand_spindown(int seconds) |
689 | { | 696 | { |
690 | /* null */ | 697 | /* null */ |