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
This commit is contained in:
parent
8e3e5e7a59
commit
f0a96580ae
12 changed files with 98 additions and 15 deletions
|
@ -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,10 @@
|
|||
|
||||
#define CONFIG_NAND NAND_SAMSUNG
|
||||
|
||||
/* define this if at least one storage driver
|
||||
needs to do cleanup on shutdown */
|
||||
#define HAVE_STORAGE_FLUSH
|
||||
|
||||
/* The NAND flash has 2048-byte sectors, and is our only storage */
|
||||
#define SECTOR_SIZE 2048
|
||||
|
||||
|
|
|
@ -37,6 +37,9 @@ int nand_init(void);
|
|||
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);
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
int nand_flush(void);
|
||||
#endif
|
||||
void nand_spin(void);
|
||||
int nand_spinup_time(void); /* ticks */
|
||||
|
||||
|
|
|
@ -69,6 +69,9 @@ struct storage_info
|
|||
#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)
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
#define storage_flush() (void)0
|
||||
#endif
|
||||
#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 +95,9 @@ struct storage_info
|
|||
#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)
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
#define storage_flush() (void)0
|
||||
#endif
|
||||
#define storage_last_disk_activity() sd_last_disk_activity()
|
||||
#define storage_spinup_time() 0
|
||||
#define storage_get_identify() sd_get_identify()
|
||||
|
@ -115,6 +121,9 @@ struct storage_info
|
|||
#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)
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
#define storage_flush() (void)0
|
||||
#endif
|
||||
#define storage_last_disk_activity() mmc_last_disk_activity()
|
||||
#define storage_spinup_time() 0
|
||||
#define storage_get_identify() mmc_get_identify()
|
||||
|
@ -138,6 +147,9 @@ struct storage_info
|
|||
#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)
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
#define storage_flush() nand_flush()
|
||||
#endif
|
||||
#define storage_last_disk_activity() nand_last_disk_activity()
|
||||
#define storage_spinup_time() 0
|
||||
#define storage_get_identify() nand_get_identify()
|
||||
|
@ -161,6 +173,9 @@ struct storage_info
|
|||
#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)
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
#define storage_flush() (void)0
|
||||
#endif
|
||||
#define storage_last_disk_activity() ramdisk_last_disk_activity()
|
||||
#define storage_spinup_time() 0
|
||||
#define storage_get_identify() ramdisk_get_identify()
|
||||
|
@ -187,6 +202,7 @@ int storage_soft_reset(void);
|
|||
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);
|
||||
|
|
|
@ -749,6 +749,14 @@ void shutdown_hw(void)
|
|||
#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 HAVE_STORAGE_FLUSH
|
||||
storage_flush();
|
||||
#endif
|
||||
|
||||
if (storage_disk_is_active())
|
||||
storage_spindown(1);
|
||||
}
|
||||
|
|
|
@ -293,6 +293,35 @@ int storage_soft_reset(void)
|
|||
return rc;
|
||||
}
|
||||
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
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;
|
||||
}
|
||||
#endif
|
||||
|
||||
void storage_spin(void)
|
||||
{
|
||||
#if (CONFIG_STORAGE & STORAGE_ATA)
|
||||
|
|
|
@ -866,6 +866,12 @@ int nand_write_sectors(IF_MD2(int drive,) unsigned long start, int count,
|
|||
return -1;
|
||||
}
|
||||
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
int nand_flush(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef STORAGE_GET_INFO
|
||||
void nand_get_info(IF_MD2(int drive,) struct storage_info *info)
|
||||
|
|
|
@ -36,9 +36,6 @@ long last_disk_activity = -1;
|
|||
/** 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_sleep(void)
|
|||
{
|
||||
}
|
||||
|
||||
void nand_sleepnow(void)
|
||||
{
|
||||
}
|
||||
|
||||
void nand_spin(void)
|
||||
{
|
||||
}
|
||||
|
@ -86,6 +87,13 @@ long nand_last_disk_activity(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
int nand_flush(void)
|
||||
{
|
||||
return ftl_sync();
|
||||
}
|
||||
#endif
|
||||
|
||||
int nand_init(void)
|
||||
{
|
||||
if (ftl_init()) return 1;
|
||||
|
|
|
@ -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_set_flip(bool yesno)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void lcd_off(void)
|
||||
void lcd_shutdown(void)
|
||||
{
|
||||
pmu_write(0x2b, 0); /* Kill the backlight, instantly. */
|
||||
pmu_write(0x29, 0);
|
||||
|
||||
if (lcd_type == 0)
|
||||
{
|
||||
s5l_lcd_write_cmd_data(R_DISPLAY_CONTROL_1, 0x232);
|
||||
|
@ -151,6 +153,11 @@ void lcd_off(void)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void lcd_off(void)
|
||||
{
|
||||
}
|
||||
|
||||
void lcd_on(void)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -103,4 +103,4 @@ void pmu_switch_power(int gate, int onoff)
|
|||
if (onoff) newval |= 1 << (2 * (gate - 4));
|
||||
pmu_write(0x3C, newval);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -52,7 +52,6 @@ int rtc_read_datetime(struct tm *tm)
|
|||
int rtc_write_datetime(const struct tm *tm)
|
||||
{
|
||||
unsigned int i;
|
||||
int rc, oldlevel;
|
||||
unsigned char buf[7];
|
||||
|
||||
buf[0] = tm->tm_sec;
|
||||
|
|
|
@ -685,6 +685,13 @@ int nand_write_sectors(IF_MV2(int drive,) unsigned long start, int count, const
|
|||
return -1;
|
||||
}
|
||||
|
||||
#ifdef HAVE_STORAGE_FLUSH
|
||||
int nand_flush(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void nand_spindown(int seconds)
|
||||
{
|
||||
/* null */
|
||||
|
|
Loading…
Reference in a new issue