blob: a24892458d2ff9527ade38d3b3b83209eb5a9364 [file] [log] [blame]
Jonathan Gordon9db22ef2007-09-09 11:20:20 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2006 by Barry Wardell
11 *
12 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
13 * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach
14 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000015 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
Jonathan Gordon9db22ef2007-09-09 11:20:20 +000019 *
20 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21 * KIND, either express or implied.
22 *
23 ****************************************************************************/
Dave Chapman82a1f8e2007-11-08 20:37:16 +000024
Jonathan Gordon9db22ef2007-09-09 11:20:20 +000025#include <stdio.h>
26#include <stdlib.h>
27#include "common.h"
28#include "cpu.h"
29#include "file.h"
30#include "system.h"
31#include "kernel.h"
32#include "lcd.h"
33#include "font.h"
Frank Gevaerts2f8a0082008-11-01 16:14:28 +000034#include "storage.h"
Jonathan Gordon9db22ef2007-09-09 11:20:20 +000035#include "button.h"
36#include "disk.h"
37#include "crc32-mi4.h"
38#include <string.h>
39#include "i2c.h"
40#include "backlight-target.h"
Jonathan Gordond777a362007-10-14 11:16:20 +000041#include "power.h"
Jonathan Gordon9db22ef2007-09-09 11:20:20 +000042
43/* Bootloader version */
44char version[] = APPSVERSION;
45
46#define START_SECTOR_OF_ROM 1
47#define ROMSECTOR_TO_HACK 63
48#define HACK_OFFSET 498
Dave Chapman82a1f8e2007-11-08 20:37:16 +000049#define KNOWN_CRC32 0x5a09c266 /* E200R CRC before patching */
50#define PATCHED_CRC32 0x0a162b34 /* E200R CRC after patching */
51
52static unsigned char knownBytes[] = {0x00, 0x24, 0x07, 0xe1};
53static unsigned char changedBytes[] = {0xc0, 0x46, 0xc0, 0x46 };
54
55/*
56 CRC32s of sector 63 from E200 bootloaders - so we can tell users if they're
57 trying to use e200rpatcher with a vanilla e200.
58
59 These are all known E200 bootloaders as of 8 November 2007.
60
61*/
62
63static uint32_t e200_crcs[] =
64{
65 0xbeceba58,
66 0x4e6b038f,
67 0x5e4f4219,
68 0xae087742,
69 0x3dd94852,
70 0x72fa69f3,
71 0x4ce0d10b
72};
73
74#define NUM_E200_CRCS ((int)((sizeof(e200_crcs) / sizeof(uint32_t))))
75
76static bool is_e200(uint32_t crc)
77{
78 int i;
79
80 for (i = 0 ; i < NUM_E200_CRCS ; i++)
81 {
82 if (crc == e200_crcs[i])
83 return true;
84 }
85
86 return false;
87}
88
89
Jonathan Gordon9db22ef2007-09-09 11:20:20 +000090void* main(void)
91{
92 int i;
93 int btn;
94 int num_partitions;
95 int crc32;
96 char sector[512];
97 struct partinfo* pinfo;
Dave Chapman82a1f8e2007-11-08 20:37:16 +000098
Jonathan Gordon9db22ef2007-09-09 11:20:20 +000099 chksum_crc32gentab ();
100
101 system_init();
102 kernel_init();
103 lcd_init();
104 font_init();
105 button_init();
106 i2c_init();
Jens Arnoldef12b3b2007-11-12 18:49:53 +0000107 _backlight_on();
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000108
109 lcd_set_foreground(LCD_WHITE);
110 lcd_set_background(LCD_BLACK);
111 lcd_clear_display();
112
113 btn = button_read_device();
114 verbose = true;
115
116 lcd_setfont(FONT_SYSFIXED);
117
118 printf("Rockbox e200R installer");
119 printf("Version: %s", version);
120 printf(MODEL_NAME);
Jonathan Gordond777a362007-10-14 11:16:20 +0000121 printf("");
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000122
Frank Gevaerts2f8a0082008-11-01 16:14:28 +0000123 i=storage_init();
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000124 disk_init(IF_MV(0));
125 num_partitions = disk_mount_all();
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000126
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000127 if (num_partitions<=0)
128 {
129 error(EDISK,num_partitions);
130 }
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000131
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000132 pinfo = disk_partinfo(1);
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000133
Jonathan Gordond777a362007-10-14 11:16:20 +0000134#if 0 /* not needed in release builds */
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000135 printf("--- Partition info ---");
136 printf("start: %x", pinfo->start);
137 printf("size: %x", pinfo->size);
138 printf("type: %x", pinfo->type);
139 printf("reading: %x", (START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK)*512);
Jonathan Gordond777a362007-10-14 11:16:20 +0000140#endif
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000141
Jonathan Gordon76e662b2008-11-24 04:43:31 +0000142 storage_read_sectors(0,
143 pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
144 1 , sector);
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000145 crc32 = chksum_crc32 (sector, 512);
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000146
Jonathan Gordond777a362007-10-14 11:16:20 +0000147#if 0 /* not needed in release builds */
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000148 printf("--- Hack Status ---");
149 printf("Sector checksum: %x", crc32);
Jonathan Gordond777a362007-10-14 11:16:20 +0000150#endif
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000151
152 if (crc32 == PATCHED_CRC32)
153 {
154 /* Bootloader already patched */
Dave Chapmaneaed7852007-11-09 08:37:14 +0000155 printf("Already unlocked");
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000156 printf("Proceed to Step 2");
157 } else if ((crc32 == KNOWN_CRC32) &&
158 !memcmp(&sector[HACK_OFFSET], knownBytes,
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000159 sizeof(knownBytes)/sizeof(*knownBytes)))
160 {
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000161 /* E200R bootloader detected - patch it */
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000162 memcpy(&sector[HACK_OFFSET], changedBytes,
163 sizeof(changedBytes)/sizeof(*changedBytes));
Jonathan Gordon76e662b2008-11-24 04:43:31 +0000164 storage_write_sectors(0,
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000165 pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
166 1 , sector);
Dave Chapmaneaed7852007-11-09 08:37:14 +0000167 printf("Firmware unlocked");
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000168 printf("Proceed to Step 2");
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000169 } else if (is_e200(crc32))
170 {
171 printf("Vanilla E200 detected!");
172 printf("Please install using");
173 printf("Sansapatcher");
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000174 }
175 else
Jonathan Gordond777a362007-10-14 11:16:20 +0000176 {
177 printf("Unknown bootloader");
178 printf("Rockbox installer cannot");
179 printf("continue");
180 }
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000181
182 /* Turn button lights off */
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000183 GPIOG_OUTPUT_VAL &=~0x80;
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000184
Jonathan Gordond777a362007-10-14 11:16:20 +0000185 printf("");
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000186
Jonathan Gordond777a362007-10-14 11:16:20 +0000187 if (button_hold())
188 printf("Release Hold and");
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000189
Jonathan Gordond777a362007-10-14 11:16:20 +0000190 printf("Press any key to shutdown");
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000191
192 while(button_read_device() == BUTTON_NONE);
193
Jonathan Gordond777a362007-10-14 11:16:20 +0000194 power_off();
Dave Chapman82a1f8e2007-11-08 20:37:16 +0000195
Jonathan Gordon9db22ef2007-09-09 11:20:20 +0000196 return NULL;
197}