diff options
| author | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-28 16:09:44 +0000 |
|---|---|---|
| committer | Linus Nielsen Feltzing <linus@haxx.se> | 2002-07-28 16:09:44 +0000 |
| commit | d0abfe86e00f3cec41970231ad90710914c73025 (patch) | |
| tree | 9504918753d01f438df1c988ec813af28cbe3a89 /apps/settings.c | |
| parent | b92c0cf3ebe5c1069c3410db388db81648bca00c (diff) | |
| download | rockbox-d0abfe86e00f3cec41970231ad90710914c73025.zip rockbox-d0abfe86e00f3cec41970231ad90710914c73025.tar.gz rockbox-d0abfe86e00f3cec41970231ad90710914c73025.tar.bz2 rockbox-d0abfe86e00f3cec41970231ad90710914c73025.tar.xz | |
Experimental disk save by Yves. #define SAVE_TO_DISK to try it
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1484 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/settings.c')
| -rw-r--r-- | apps/settings.c | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/apps/settings.c b/apps/settings.c index 5eebc61..68f5e66 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -20,6 +20,7 @@ #include <stdio.h> #include "config.h" +#include "kernel.h" #include "settings.h" #include "disk.h" #include "panic.h" @@ -28,11 +29,11 @@ #include "lcd.h" #include "mpeg.h" #include "string.h" +#include "ata.h" +#include "power.h" struct user_settings global_settings; -#ifdef HAVE_RTC - /******************************************** Config block as saved on the battery-packed RTC user RAM memory block @@ -60,7 +61,6 @@ offset abs the geeky but useless statistics part: 0x24 <total uptime in seconds: 32 bits uint, actually unused for now> -0x28 <boots: 16 bits uint> 0x2a <checksum 2 bytes: xor of 0x0-0x29> @@ -113,6 +113,7 @@ static void init_config_buffer( void ) rtc_config_block[3] = 0x0; /* config block version number */ } +#ifdef HAVE_RTC /* * save the config block buffer on the RTC RAM */ @@ -184,8 +185,61 @@ static int load_config_buffer( void ) return 1; } +#else /* HAVE_RTC */ +/* + * save the config block buffer on the 61 Sector + */ +static int save_config_buffer( void ) +{ + DEBUGF( "save_config_buffer()\n" ); + + /* update the checksum in the end of the block before saving */ + calculate_config_checksum(rtc_config_block + sizeof(rtc_config_block) - 2); +#ifdef SAVE_TO_DISK + if(battery_level_safe()) + return !ata_write_sectors( 61, 1, rtc_config_block); + else + return -1; +#else + return 0; +#endif +} + +/* + * load the config block buffer from disk + */ +static int load_config_buffer( void ) +{ +#ifdef SAVE_TO_DISK + unsigned char cksum[2]; + + DEBUGF( "load_config_buffer()\n" ); + + ata_read_sectors( 61, 1, rtc_config_block); + + /* calculate the checksum, check it and the header */ + calculate_config_checksum(cksum); + + if (rtc_config_block[0x0] == 'R' + && rtc_config_block[0x1] == 'o' + && rtc_config_block[0x2] == 'c' + && rtc_config_block[0x3] == 0x0 + && cksum[0] == rtc_config_block[0x2a] + && cksum[1] == rtc_config_block[0x2b]) { + DEBUGF( "load_config_buffer: header & checksum test ok\n" ); + return 0; /* header and checksum is valid */ + } +#endif + /* if checksum is not valid, initialize the config buffer to all-unused */ + DEBUGF( "load_config_buffer: header & checksum test failed\n" ); + init_config_buffer(); + return 1; +} + + #endif /* HAVE_RTC */ + /* * persist all runtime user settings to disk or RTC RAM */ @@ -193,7 +247,6 @@ int settings_save( void ) { DEBUGF( "settings_save()\n" ); -#ifdef HAVE_RTC /* update the config block buffer with current settings and save the block in the RTC */ rtc_config_block[0x4] = (unsigned char)global_settings.volume; @@ -220,12 +273,22 @@ int settings_save( void ) rtc_config_block[0x11] = (unsigned char)global_settings.avc; memcpy(&rtc_config_block[0x24], &global_settings.total_uptime, 4); - memcpy(&rtc_config_block[0x28], &global_settings.total_boots, 2); - - save_config_buffer(); -#endif /* HAVE_RTC */ - return 1; + if(save_config_buffer()) + { + lcd_clear_display(); +#ifdef HAVE_LCD_CHARCELLS + lcd_puts(0, 0, "Save failed"); + lcd_puts(0, 1, "Batt. low?"); +#else + lcd_puts(4, 2, "Save failed"); + lcd_puts(2, 4, "Is battery low?"); + lcd_update(); +#endif + sleep(HZ*2); + return -1; + } + return 0; } /* @@ -233,16 +296,13 @@ int settings_save( void ) */ void settings_load(void) { -#ifdef HAVE_RTC unsigned char c; -#endif DEBUGF( "reload_all_settings()\n" ); /* populate settings with default values */ settings_reset(); -#ifdef HAVE_RTC /* load the buffer from the RTC (resets it to all-unused if the block is invalid) and decode the settings which are set in the block */ if (!load_config_buffer()) { @@ -286,11 +346,7 @@ void settings_load(void) if (rtc_config_block[0x24] != 0xFF) memcpy(&global_settings.total_uptime, &rtc_config_block[0x24], 4); - if (rtc_config_block[0x28] != 0xFF) - memcpy(&global_settings.total_boots, &rtc_config_block[0x28], 2); } - -#endif /* HAVE_RTC */ } /* @@ -314,7 +370,6 @@ void settings_reset(void) { global_settings.mp3filter = true; global_settings.sort_case = false; global_settings.playlist_shuffle = false; - global_settings.total_boots = 0; global_settings.total_uptime = 0; global_settings.scroll_speed = 8; } |