1
0
Fork 0
forked from len0rd/rockbox

Bootloader support to search firmware also from flash. Bootloader <->

Rockbox communication when Rockbox has been flashed.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10499 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Miika Pekkarinen 2006-08-09 12:04:13 +00:00
parent 0f87f8fd36
commit e1eb91b976
8 changed files with 115 additions and 24 deletions

View file

@ -120,7 +120,9 @@ int init_dircache(void)
# ifdef HAVE_EEPROM # ifdef HAVE_EEPROM
if (firmware_settings.initialized && firmware_settings.disk_clean) if (firmware_settings.initialized && firmware_settings.disk_clean)
{ {
if (dircache_load(DIRCACHE_FILE) == 0) result = dircache_load(DIRCACHE_FILE);
remove(DIRCACHE_FILE);
if (result == 0)
return 0; return 0;
} }
# endif # endif

View file

@ -381,12 +381,13 @@ void show_fatal_error(void)
int flash_bootloader(const char *filename) int flash_bootloader(const char *filename)
{ {
// char buf[32]; char buf[32];
int pos, i, len, rc; int pos, i, len, rc;
unsigned long checksum, sum, crc32; unsigned long checksum, sum, crc32;
unsigned char *p8; unsigned char *p8;
uint16_t *p16; uint16_t *p16;
(void)buf;
len = load_firmware_file(filename, &checksum); len = load_firmware_file(filename, &checksum);
if (len < 0) if (len < 0)
return len * 10; return len * 10;
@ -399,15 +400,16 @@ int flash_bootloader(const char *filename)
/* Verify the crc32 checksum also. */ /* Verify the crc32 checksum also. */
crc32 = crc_32(audiobuf, len, 0xffffffff); crc32 = crc_32(audiobuf, len, 0xffffffff);
// rb->snprintf(buf, sizeof buf, "crc32 = 0x%08x", crc32); #if 0
// rb->splash(HZ*10, true, buf); rb->snprintf(buf, sizeof buf, "crc32 = 0x%08x", crc32);
rb->splash(HZ*10, true, buf);
if (crc32 != 0x5361a679) #else
if (crc32 != 0xa930906d)
{ {
rb->splash(HZ*3, true, "Untested bootloader"); rb->splash(HZ*3, true, "Untested bootloader");
return -2; return -2;
} }
#endif
rb->lcd_puts(0, 3, "Processing critical sections..."); rb->lcd_puts(0, 3, "Processing critical sections...");
rb->lcd_update(); rb->lcd_update();

View file

@ -22,3 +22,4 @@ wav,viewers/mp3_encoder, 00 00 00 00 00 00
wav,viewers/wavplay,60 7F 05 35 3F 00 wav,viewers/wavplay,60 7F 05 35 3F 00
bmp,rocks/rockpaint, 01 10 01 10 01 10 bmp,rocks/rockpaint, 01 10 01 10 01 10
m2v,viewers/mpegplayer,5D 7F 5D 7F 5D 7F m2v,viewers/mpegplayer,5D 7F 5D 7F 5D 7F
iriver,viewers/iriver_flash,2A 7F 41 41 7F 2A

View file

@ -20,6 +20,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "inttypes.h"
#include "string.h"
#include "cpu.h" #include "cpu.h"
#include "system.h" #include "system.h"
#include "lcd.h" #include "lcd.h"
@ -39,6 +41,7 @@
#include "power.h" #include "power.h"
#include "file.h" #include "file.h"
#include "uda1380.h" #include "uda1380.h"
#include "eeprom_settings.h"
#include "pcf50606.h" #include "pcf50606.h"
@ -151,6 +154,21 @@ int load_firmware(void)
return 0; return 0;
} }
int load_flashed_rockbox(void)
{
struct flash_header hdr;
unsigned char *buf = (unsigned char *)DRAM_START;
uint8_t *src = (uint8_t *)FLASH_ENTRYPOINT;
cpu_boost(true);
memcpy(&hdr, src, sizeof(struct flash_header));
src += sizeof(struct flash_header);
memcpy(buf, src, hdr.length);
cpu_boost(false);
return 0;
}
void start_firmware(void) void start_firmware(void)
{ {
@ -171,12 +189,14 @@ void main(void)
int rc; int rc;
bool rc_on_button = false; bool rc_on_button = false;
bool on_button = false; bool on_button = false;
bool rec_button = false;
int data; int data;
int adc_battery, battery_voltage, batt_int, batt_frac; int adc_battery, battery_voltage, batt_int, batt_frac;
#ifdef IAUDIO_X5 #ifdef IAUDIO_X5
(void)rc_on_button; (void)rc_on_button;
(void)on_button; (void)on_button;
(void)rec_button;
(void)data; (void)data;
power_init(); power_init();
@ -311,13 +331,66 @@ void main(void)
lcd_update(); lcd_update();
sleep(HZ/50); /* Allow the button driver to check the buttons */ sleep(HZ/50); /* Allow the button driver to check the buttons */
rec_button = ((button_status() & BUTTON_REC) == BUTTON_REC)
|| ((button_status() & BUTTON_RC_REC) == BUTTON_RC_REC);
/* Holding REC while starting runs the original firmware */ #ifdef HAVE_EEPROM
if(((button_status() & BUTTON_REC) == BUTTON_REC) || firmware_settings.initialized = false;
((button_status() & BUTTON_RC_REC) == BUTTON_RC_REC)) { #endif
printf("Starting original firmware..."); if (detect_flashed_rockbox())
{
bool load_from_flash;
load_from_flash = !rec_button;
#ifdef HAVE_EEPROM
if (eeprom_settings_init())
{
/* If bootloader version has not been reset, disk might
* not be intact. */
if (firmware_settings.bl_version)
firmware_settings.disk_clean = false;
firmware_settings.bl_version = 7;
/* Invert the record button if we want to load from disk
* by default. */
if (firmware_settings.boot_disk)
load_from_flash = rec_button;
}
#endif
if (load_from_flash)
{
/* Load firmware from flash */
i = load_flashed_rockbox();
printf("Result: %d", i);
lcd_update();
if (i == 0)
{
#ifdef HAVE_EEPROM
eeprom_settings_store();
#endif
start_firmware();
printf("Fatal: Corrupted firmware");
printf("Hold down REC on next boot");
lcd_update();
sleep(HZ*2);
power_off();
}
}
printf("Loading from disk...");
lcd_update(); lcd_update();
start_iriver_fw(); }
else
{
/* Holding REC while starting runs the original firmware */
if (rec_button)
{
printf("Starting original firmware...");
lcd_update();
start_iriver_fw();
}
} }
/* Don't start if the Hold button is active on the device you /* Don't start if the Hold button is active on the device you
@ -384,6 +457,13 @@ void main(void)
sleep(HZ); sleep(HZ);
#endif #endif
#ifdef HAVE_EEPROM
if (firmware_settings.initialized)
{
firmware_settings.disk_clean = false;
eeprom_settings_store();
}
#endif
ata_spin(); ata_spin();
ata_enable(false); ata_enable(false);
usb_enable(true); usb_enable(true);
@ -423,6 +503,11 @@ void main(void)
printf("Result: %d", i); printf("Result: %d", i);
lcd_update(); lcd_update();
#ifdef HAVE_EEPROM
if (firmware_settings.initialized)
eeprom_settings_store();
#endif
if(i == 0) if(i == 0)
start_firmware(); start_firmware();

View file

@ -82,10 +82,6 @@ static void sw_i2c_start(void)
static void sw_i2c_stop(void) static void sw_i2c_stop(void)
{ {
// SCL_LO;
// DELAY;
// SDA_LO;
// DELAY;
SCL_HI; SCL_HI;
DELAY; DELAY;
SDA_HI; SDA_HI;
@ -294,7 +290,7 @@ int eeprom_24cxx_read_byte(unsigned int address, char *c)
if (ret < 0) if (ret < 0)
{ {
/* keep between {} as logf is whitespace in normal builds */ /* keep between {} as logf is whitespace in normal builds */
logf("EEPROM Fail: %d/%d", ret, address); logf("EEPROM rFail: %d/%d", ret, address);
} }
} while (ret < 0 && count--); } while (ret < 0 && count--);
@ -325,7 +321,7 @@ int eeprom_24cxx_write_byte(unsigned int address, char c)
if (ret < 0) if (ret < 0)
{ {
/* keep between {} as logf is whitespace in normal builds */ /* keep between {} as logf is whitespace in normal builds */
logf("EEPROM Fail: %d/%d", ret, address); logf("EEPROM wFail: %d/%d", ret, address);
} }
} while (ret < 0 && count--) ; } while (ret < 0 && count--) ;
@ -357,7 +353,7 @@ int eeprom_24cxx_read(unsigned char address, void *dest, int length)
int eeprom_24cxx_write(unsigned char address, const void *src, int length) int eeprom_24cxx_write(unsigned char address, const void *src, int length)
{ {
const char *buf = (const char *)src; const char *buf = (const char *)src;
int count = 10; int count = 5;
int i; int i;
bool ok; bool ok;

View file

@ -21,6 +21,7 @@
#include "eeprom_24cxx.h" #include "eeprom_24cxx.h"
#include "crc32.h" #include "crc32.h"
#include "system.h"
#include "string.h" #include "string.h"
#include "logf.h" #include "logf.h"
@ -64,16 +65,17 @@ bool eeprom_settings_init(void)
sum = crc_32(&firmware_settings, sizeof(struct eeprom_settings)-4, sum = crc_32(&firmware_settings, sizeof(struct eeprom_settings)-4,
0xffffffff); 0xffffffff);
if (firmware_settings.checksum != sum) logf("BL version: %d", firmware_settings.bl_version);
if (firmware_settings.version != EEPROM_SETTINGS_VERSION)
{ {
logf("Checksum mismatch"); logf("Version mismatch");
reset_config(); reset_config();
return true; return true;
} }
if (firmware_settings.version != EEPROM_SETTINGS_VERSION) if (firmware_settings.checksum != sum)
{ {
logf("Version mismatch"); logf("Checksum mismatch");
reset_config(); reset_config();
return true; return true;
} }

View file

@ -124,6 +124,10 @@
#define BOOTFILE_EXT "iriver" #define BOOTFILE_EXT "iriver"
#define BOOTFILE "rockbox." BOOTFILE_EXT #define BOOTFILE "rockbox." BOOTFILE_EXT
#define BOOTLOADER_ENTRYPOINT 0x001F0000
#define FLASH_ENTRYPOINT 0x00001000
#define FLASH_MAGIC 0xfbfbfbf1
#define HAVE_BACKLIGHT_BRIGHTNESS #define HAVE_BACKLIGHT_BRIGHTNESS
/* define this if the unit can be powered or charged via USB */ /* define this if the unit can be powered or charged via USB */

View file

@ -40,7 +40,6 @@ struct eeprom_settings
extern struct eeprom_settings firmware_settings; extern struct eeprom_settings firmware_settings;
bool detect_flashed_rockbox(void);
bool eeprom_settings_init(void); bool eeprom_settings_init(void);
bool eeprom_settings_store(void); bool eeprom_settings_store(void);