ac7d42e
[qi.git] / src / start_qi.c
1 /*
2  * (C) Copyright 2007 OpenMoko, Inc.
3  * Author: xiangfu liu <xiangfu@openmoko.org>
4  *         Andy Green <andy@openmoko.com>
5  *
6  * Configuation settings for the OPENMOKO Neo GTA02 Linux GSM phone
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 /* NOTE this stuff runs in steppingstone context! */
25
26
27 #include <qi.h>
28 #include "blink_led.h"
29 #include "nand_read.h"
30 #include <neo_gta02.h>
31 #include <neo_gta03.h>
32
33 #define stringify2(s) stringify1(s)
34 #define stringify1(s) #s
35
36 extern void bootloader_second_phase(void);
37
38 const struct board_api * boards[] = {
39         &board_api_gta02,
40         &board_api_gta03,
41 };
42
43 struct board_api const * this_board;
44
45 void start_qi(void)
46 {
47         int n = 0;
48         int board = 0;
49         const struct board_variant * board_variant;
50         const u32 * p_is_jtag = (const u32 *)4;
51
52         /*
53          * well, we can be running on this CPU two different ways.
54          *
55          * 1) We were copied into steppingstone and TEXT_BASE already
56          *    by JTAG.  We don't have to do anything else.  JTAG script
57          *    then sets data at address 0x4 to 0xffffffff as a signal we
58          *    are running by JTAG.
59          *
60          * 2) We only got our first 4K into steppingstone, we need to copy
61          *    the rest of ourselves into TEXT_BASE.
62          *
63          * So we do the copy out of NAND only if we see we did not come up
64          * under control of JTAG.
65          */
66
67         if (!*p_is_jtag)
68                 /*
69                 * We got the first 4KBytes of the bootloader pulled into the
70                 * steppingstone SRAM for free.  Now we pull the whole bootloader
71                 * image into SDRAM.
72                 *
73                 * This code and the .S files are arranged by the linker script
74                 * to expect to run from 0x0.  But the linker script has told
75                 * everything else to expect to run from 0x33000000+.  That's
76                 * why we are going to be able to copy this code and not have it
77                 * crash when we run it from there.
78                 */
79
80                 /* We randomly pull 32KBytes of bootloader */
81                 if (nand_read_ll((u8 *)TEXT_BASE, 0, 32 * 1024 / 512) < 0)
82                         goto unhappy;
83
84         /* ask all the boards we support in turn if they recognize this
85          * hardware we are running on, accept the first positive answer
86          */
87
88         this_board = boards[board];
89         while (!n) {
90                 if (board > ARRAY_SIZE(boards))
91                         /* can't put diagnostic on serial... too early */
92                         goto unhappy;
93
94                 if (this_board->is_this_board())
95                         n = 1;
96                 else 
97                         this_board = boards[board++];
98         }
99
100         /* okay, do the critical port and serial init for our board */
101
102         this_board->port_init();
103
104         /* stick some hello messages on debug console */
105
106         puts("\n\n\nQi Bootloader  "stringify2(BUILD_HOST)" "
107                                     stringify2(BUILD_VERSION)" "
108                                     stringify2(BUILD_DATE)"\n");
109
110         puts("Copyright (C) 2008 Openmoko, Inc.\n");
111         puts("This is free software; see the source for copying conditions.\n"
112              "There is NO warranty; not even for MERCHANTABILITY or "
113              "FITNESS FOR A PARTICULAR PURPOSE.\n\n     Detected: ");
114
115         puts(this_board->name);
116         puts(", ");
117         board_variant = (this_board->get_board_variant)();
118         puts(board_variant->name);
119
120         /*
121          * jump to bootloader_second_phase() running from DRAM copy
122          */
123         bootloader_second_phase();
124
125 unhappy:
126         while(1)
127                 blink_led();
128
129 }