blob: 1e54f5d37d968f753791187ab701a6615ca62fd8 [file] [log] [blame]
Dave Chapman28f6ae42007-10-28 11:08:10 +00001/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2007 by Dave Chapman
11 *
12 * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing
13 *
Daniel Stenberg2acc0ac2008-06-28 18:10:04 +000014 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
Dave Chapman28f6ae42007-10-28 11:08:10 +000018 *
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
21 *
22 ****************************************************************************/
23#include "config.h"
24
25#include <stdlib.h>
26#include <stdio.h>
27#include <string.h>
28#include "cpu.h"
29#include "system.h"
30#include "lcd.h"
31#include "kernel.h"
32#include "thread.h"
Frank Gevaerts2f8a0082008-11-01 16:14:28 +000033#include "storage.h"
Dave Chapman28f6ae42007-10-28 11:08:10 +000034#include "fat.h"
35#include "disk.h"
36#include "font.h"
Dave Chapmana4d48d02007-11-01 23:38:57 +000037#include "button.h"
Dave Chapman28f6ae42007-10-28 11:08:10 +000038#include "adc.h"
39#include "adc-target.h"
Rob Purchase3b466712008-03-29 17:26:16 +000040#include "backlight.h"
Dave Chapman28f6ae42007-10-28 11:08:10 +000041#include "backlight-target.h"
42#include "panic.h"
43#include "power.h"
44#include "file.h"
45#include "common.h"
46
Rob Purchase9f0fbec2008-11-17 21:16:00 +000047/* Show the Rockbox logo - in show_logo.c */
48extern int show_logo(void);
Dave Chapmand462a642008-09-06 17:50:59 +000049
Dave Chapman85807cd2008-09-22 19:15:18 +000050/* Address to load main Rockbox image to */
51#define LOAD_ADDRESS 0x20000000 /* DRAM_START */
Rob Purchase47ea0302008-01-14 22:04:48 +000052
Dave Chapman28f6ae42007-10-28 11:08:10 +000053char version[] = APPSVERSION;
54
55extern int line;
56
Rob Purchasec8836112008-03-12 20:57:19 +000057#define MAX_LOAD_SIZE (8*1024*1024) /* Arbitrary, but plenty. */
58
Dave Chapmanf2042982008-05-02 19:12:09 +000059/* The following function is just test/development code */
60#ifdef CPU_TCC77X
61void show_debug_screen(void)
62{
63 int button;
64 int power_count = 0;
65 int count = 0;
66 bool do_power_off = false;
Marc Guayb93667b2008-06-21 15:18:36 +000067
Dave Chapman85807cd2008-09-22 19:15:18 +000068 lcd_puts_scroll(0,0,"this is a very long line to test scrolling");
69 while (!do_power_off) {
Dave Chapmanf2042982008-05-02 19:12:09 +000070 line = 1;
71 button = button_get(false);
Marc Guayb93667b2008-06-21 15:18:36 +000072
Dave Chapman85807cd2008-09-22 19:15:18 +000073 /* Power-off if POWER button has been held for a time
Dave Chapmanf2042982008-05-02 19:12:09 +000074 This loop is currently running at about 100 iterations/second
75 */
76 if (button & POWEROFF_BUTTON) {
77 power_count++;
Marc Guayf6cde722008-07-06 21:32:59 +000078 if (power_count > 100)
Dave Chapmanf2042982008-05-02 19:12:09 +000079 do_power_off = true;
80 } else {
81 power_count = 0;
82 }
Dave Chapman85807cd2008-09-22 19:15:18 +000083#if 0
Marc Guayb93667b2008-06-21 15:18:36 +000084 if (button & BUTTON_SELECT){
Dave Chapmand462a642008-09-06 17:50:59 +000085 _backlight_off();
Marc Guayb93667b2008-06-21 15:18:36 +000086 }
87 else{
88 _backlight_on();
89 }
Dave Chapmand462a642008-09-06 17:50:59 +000090#endif
Dave Chapman85807cd2008-09-22 19:15:18 +000091 printf("Btn: 0x%08x",button);
92#if 0
Dave Chapmanf2042982008-05-02 19:12:09 +000093 printf("Tick: %d",current_tick);
Dave Chapmanf2042982008-05-02 19:12:09 +000094 printf("GPIOA: 0x%08x",GPIOA);
95 printf("GPIOB: 0x%08x",GPIOB);
96 printf("GPIOC: 0x%08x",GPIOC);
97 printf("GPIOD: 0x%08x",GPIOD);
Dave Chapman85807cd2008-09-22 19:15:18 +000098 printf("GPIOE: 0x%08x",GPIOE);
99#endif
Dave Chapmanf2042982008-05-02 19:12:09 +0000100
101#if 0
102 int i;
Dave Chapman85807cd2008-09-22 19:15:18 +0000103 for (i = 0; i<4; i++)
Dave Chapmanf2042982008-05-02 19:12:09 +0000104 {
105 printf("ADC%d: 0x%04x",i,adc_read(i));
106 }
107#endif
108 count++;
109 printf("Count: %d",count);
110 sleep(HZ/10);
111
112 }
113
114 lcd_clear_display();
115 line = 0;
116 printf("POWER-OFF");
117
118 /* Power-off */
119 power_off();
120
121 printf("(NOT) POWERED OFF");
122 while (true);
123}
Dave Chapman85807cd2008-09-22 19:15:18 +0000124
Dave Chapmanf2042982008-05-02 19:12:09 +0000125#else /* !CPU_TCC77X */
Dave Chapman85807cd2008-09-22 19:15:18 +0000126
Rob Purchase3b466712008-03-29 17:26:16 +0000127void show_debug_screen(void)
Dave Chapman28f6ae42007-10-28 11:08:10 +0000128{
Dave Chapmana4d48d02007-11-01 23:38:57 +0000129 int button;
130 int power_count = 0;
131 int count = 0;
132 bool do_power_off = false;
Rob Purchase18b004b2008-04-27 13:30:11 +0000133#ifdef HAVE_BUTTON_DATA
134 unsigned int data;
135#endif
Rob Purchase3b466712008-03-29 17:26:16 +0000136
137 while(!do_power_off) {
138 line = 0;
139 printf("Hello World!");
140
Rob Purchase18b004b2008-04-27 13:30:11 +0000141#ifdef HAVE_BUTTON_DATA
142 button = button_read_device(&data);
143#else
Rob Purchase3b466712008-03-29 17:26:16 +0000144 button = button_read_device();
Rob Purchase18b004b2008-04-27 13:30:11 +0000145#endif
Rob Purchase3b466712008-03-29 17:26:16 +0000146
147 /* Power-off if POWER button has been held for a long time
148 This loop is currently running at about 100 iterations/second
149 */
150 if (button & POWEROFF_BUTTON) {
151 power_count++;
152 if (power_count > 200)
153 do_power_off = true;
154 } else {
155 power_count = 0;
156 }
157
158 printf("Btn: 0x%08x",button);
159
Rob Purchase3b466712008-03-29 17:26:16 +0000160 count++;
161 printf("Count: %d",count);
162 }
163
164 lcd_clear_display();
165 line = 0;
166 printf("POWER-OFF");
167
168 /* Power-off */
169 power_off();
170
171 printf("(NOT) POWERED OFF");
172 while (true);
173}
Dave Chapmanf2042982008-05-02 19:12:09 +0000174#endif
Rob Purchase3b466712008-03-29 17:26:16 +0000175
176void* main(void)
177{
Dave Chapman85807cd2008-09-22 19:15:18 +0000178#ifdef TCCBOOT
Rob Purchasec8836112008-03-12 20:57:19 +0000179 int rc;
180 unsigned char* loadbuffer = (unsigned char*)LOAD_ADDRESS;
Rob Purchaseaddb5222008-02-13 23:50:44 +0000181#endif
Dave Chapman28f6ae42007-10-28 11:08:10 +0000182
Rob Purchaseaddb5222008-02-13 23:50:44 +0000183 system_init();
Dave Chapmand462a642008-09-06 17:50:59 +0000184 power_init();
Dave Chapmanf2042982008-05-02 19:12:09 +0000185#ifndef COWON_D2
186 /* The D2 doesn't enable threading or interrupts */
187 kernel_init();
188 enable_irq();
189#endif
Rob Purchase562b9de2008-03-05 00:21:56 +0000190 lcd_init();
Rob Purchaseaddb5222008-02-13 23:50:44 +0000191
192 adc_init();
193 button_init();
194 backlight_init();
195
Dave Chapman28f6ae42007-10-28 11:08:10 +0000196 font_init();
Rob Purchaseaddb5222008-02-13 23:50:44 +0000197 lcd_setfont(FONT_SYSFIXED);
Rob Purchase9f0fbec2008-11-17 21:16:00 +0000198
199 show_logo();
Rob Purchaseaddb5222008-02-13 23:50:44 +0000200
Jens Arnoldef12b3b2007-11-12 18:49:53 +0000201 _backlight_on();
Dave Chapman28f6ae42007-10-28 11:08:10 +0000202
Rob Purchasec8836112008-03-12 20:57:19 +0000203/* Only load the firmware if TCCBOOT is defined - this ensures SDRAM_START is
204 available for loading the firmware. Otherwise display the debug screen. */
Dave Chapman85807cd2008-09-22 19:15:18 +0000205#ifdef TCCBOOT
Rob Purchasec8836112008-03-12 20:57:19 +0000206 printf("Rockbox boot loader");
207 printf("Version %s", version);
208
Rob Purchaseaddb5222008-02-13 23:50:44 +0000209 printf("ATA");
Frank Gevaerts2f8a0082008-11-01 16:14:28 +0000210 rc = storage_init();
Rob Purchaseaddb5222008-02-13 23:50:44 +0000211 if(rc)
212 {
213 reset_screen();
214 error(EATA, rc);
215 }
216
217 printf("mount");
218 rc = disk_mount_all();
219 if (rc<=0)
220 {
221 error(EDISK,rc);
222 }
223
Rob Purchasec8836112008-03-12 20:57:19 +0000224 rc = load_firmware(loadbuffer, BOOTFILE, MAX_LOAD_SIZE);
Rob Purchaseaddb5222008-02-13 23:50:44 +0000225
Rob Purchasec8836112008-03-12 20:57:19 +0000226 if (rc < 0)
Rob Purchaseaddb5222008-02-13 23:50:44 +0000227 {
Rob Purchasec8836112008-03-12 20:57:19 +0000228 error(EBOOTFILE,rc);
Rob Purchaseaddb5222008-02-13 23:50:44 +0000229 }
Rob Purchasec8836112008-03-12 20:57:19 +0000230 else if (rc == EOK)
Rob Purchaseaddb5222008-02-13 23:50:44 +0000231 {
Rob Purchasec8836112008-03-12 20:57:19 +0000232 int(*kernel_entry)(void);
233
234 kernel_entry = (void*) loadbuffer;
Rob Purchase18b004b2008-04-27 13:30:11 +0000235 rc = kernel_entry();
Dave Chapman28f6ae42007-10-28 11:08:10 +0000236 }
Rob Purchase18b004b2008-04-27 13:30:11 +0000237#else
Rob Purchase3b466712008-03-29 17:26:16 +0000238 show_debug_screen();
Rob Purchase18b004b2008-04-27 13:30:11 +0000239#endif
Rob Purchasec8836112008-03-12 20:57:19 +0000240
Dave Chapman28f6ae42007-10-28 11:08:10 +0000241 return 0;
242}