summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/config-ipodnano2g.h7
-rw-r--r--firmware/export/nand.h3
-rw-r--r--firmware/export/storage.h16
-rw-r--r--firmware/powermgmt.c8
-rw-r--r--firmware/storage.c29
-rw-r--r--firmware/target/arm/ata-nand-telechips.c6
-rw-r--r--firmware/target/arm/s5l8700/ata-nand-s5l8700.c14
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c13
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/pmu-nano2g.c2
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/power-nano2g.c7
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/rtc-nano2g.c1
-rw-r--r--firmware/target/mips/ingenic_jz47xx/ata-nand-jz4740.c7
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);
37void nand_close(void); 37void nand_close(void);
38int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf); 38int nand_read_sectors(IF_MD2(int drive,) unsigned long start, int count, void* buf);
39int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf); 39int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count, const void* buf);
40#ifdef HAVE_STORAGE_FLUSH
41int nand_flush(void);
42#endif
40void nand_spin(void); 43void nand_spin(void);
41int nand_spinup_time(void); /* ticks */ 44int 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);
187int storage_init(void); 202int storage_init(void);
188int storage_read_sectors(int drive, unsigned long start, int count, void* buf); 203int storage_read_sectors(int drive, unsigned long start, int count, void* buf);
189int storage_write_sectors(int drive, unsigned long start, int count, const void* buf); 204int storage_write_sectors(int drive, unsigned long start, int count, const void* buf);
205int storage_flush(void);
190void storage_spin(void); 206void storage_spin(void);
191void storage_spindown(int seconds); 207void storage_spindown(int seconds);
192long storage_last_disk_activity(void); 208long 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
297int 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
296void storage_spin(void) 325void 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
870int nand_flush(void)
871{
872 return 0;
873}
874#endif
869 875
870#ifdef STORAGE_GET_INFO 876#ifdef STORAGE_GET_INFO
871void nand_get_info(IF_MD2(int drive,) struct storage_info *info) 877void 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 **/
37static bool initialized = false; 37static bool initialized = false;
38 38
39static long next_yield = 0;
40#define MIN_YIELD_PERIOD 2000
41
42/* API Functions */ 39/* API Functions */
43 40
44void nand_led(bool onoff) 41void nand_led(bool onoff)
@@ -67,6 +64,10 @@ void nand_sleep(void)
67{ 64{
68} 65}
69 66
67void nand_sleepnow(void)
68{
69}
70
70void nand_spin(void) 71void 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
91int nand_flush(void)
92{
93 return ftl_sync();
94}
95#endif
96
89int nand_init(void) 97int 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 128void lcd_shutdown(void)
128
129void 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
157void lcd_off(void)
158{
159}
160
154void lcd_on(void) 161void 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
33void power_off(void) 33void 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)
52int rtc_write_datetime(const struct tm *tm) 52int 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
689int nand_flush(void)
690{
691 return 0;
692}
693#endif
694
688void nand_spindown(int seconds) 695void nand_spindown(int seconds)
689{ 696{
690 /* null */ 697 /* null */