Statistics
| Branch: | Revision:

root / hw / nseries.c @ 5e65a310

History | View | Annotate | Download (41.5 kB)

1 7e7c5e4c balrog
/*
2 7e7c5e4c balrog
 * Nokia N-series internet tablets.
3 7e7c5e4c balrog
 *
4 7e7c5e4c balrog
 * Copyright (C) 2007 Nokia Corporation
5 7e7c5e4c balrog
 * Written by Andrzej Zaborowski <andrew@openedhand.com>
6 7e7c5e4c balrog
 *
7 7e7c5e4c balrog
 * This program is free software; you can redistribute it and/or
8 7e7c5e4c balrog
 * modify it under the terms of the GNU General Public License as
9 7e7c5e4c balrog
 * published by the Free Software Foundation; either version 2 or
10 7e7c5e4c balrog
 * (at your option) version 3 of the License.
11 7e7c5e4c balrog
 *
12 7e7c5e4c balrog
 * This program is distributed in the hope that it will be useful,
13 7e7c5e4c balrog
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 7e7c5e4c balrog
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 7e7c5e4c balrog
 * GNU General Public License for more details.
16 7e7c5e4c balrog
 *
17 7e7c5e4c balrog
 * You should have received a copy of the GNU General Public License
18 7e7c5e4c balrog
 * along with this program; if not, write to the Free Software
19 7e7c5e4c balrog
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20 7e7c5e4c balrog
 * MA 02111-1307 USA
21 7e7c5e4c balrog
 */
22 7e7c5e4c balrog
23 7e7c5e4c balrog
#include "qemu-common.h"
24 7e7c5e4c balrog
#include "sysemu.h"
25 7e7c5e4c balrog
#include "omap.h"
26 7e7c5e4c balrog
#include "arm-misc.h"
27 7e7c5e4c balrog
#include "irq.h"
28 7e7c5e4c balrog
#include "console.h"
29 7e7c5e4c balrog
#include "boards.h"
30 7e7c5e4c balrog
#include "i2c.h"
31 7e7c5e4c balrog
#include "devices.h"
32 7e7c5e4c balrog
#include "flash.h"
33 7e7c5e4c balrog
#include "hw.h"
34 7e7c5e4c balrog
35 7e7c5e4c balrog
/* Nokia N8x0 support */
36 7e7c5e4c balrog
struct n800_s {
37 7e7c5e4c balrog
    struct omap_mpu_state_s *cpu;
38 7e7c5e4c balrog
39 7e7c5e4c balrog
    struct rfbi_chip_s blizzard;
40 e927bb00 balrog
    struct {
41 e927bb00 balrog
        void *opaque;
42 e927bb00 balrog
        uint32_t (*txrx)(void *opaque, uint32_t value, int len);
43 e927bb00 balrog
        struct uwire_slave_s *chip;
44 e927bb00 balrog
    } ts;
45 7e7c5e4c balrog
    i2c_bus *i2c;
46 7e7c5e4c balrog
47 7e7c5e4c balrog
    int keymap[0x80];
48 1d4e547b balrog
    i2c_slave *kbd;
49 7e7c5e4c balrog
50 942ac052 balrog
    struct tusb_s *usb;
51 7e7c5e4c balrog
    void *retu;
52 7e7c5e4c balrog
    void *tahvo;
53 7e7c5e4c balrog
};
54 7e7c5e4c balrog
55 7e7c5e4c balrog
/* GPIO pins */
56 e927bb00 balrog
#define N8X0_TUSB_ENABLE_GPIO                0
57 7e7c5e4c balrog
#define N800_MMC2_WP_GPIO                8
58 7e7c5e4c balrog
#define N800_UNKNOWN_GPIO0                9        /* out */
59 0941041e balrog
#define N810_MMC2_VIOSD_GPIO                9
60 7e7c5e4c balrog
#define N800_UNKNOWN_GPIO1                10        /* out */
61 7e7c5e4c balrog
#define N800_CAM_TURN_GPIO                12
62 e927bb00 balrog
#define N810_GPS_RESET_GPIO                12
63 7e7c5e4c balrog
#define N800_BLIZZARD_POWERDOWN_GPIO        15
64 7e7c5e4c balrog
#define N800_MMC1_WP_GPIO                23
65 0941041e balrog
#define N810_MMC2_VSD_GPIO                23
66 7e7c5e4c balrog
#define N8X0_ONENAND_GPIO                26
67 e927bb00 balrog
#define N810_BLIZZARD_RESET_GPIO        30
68 7e7c5e4c balrog
#define N800_UNKNOWN_GPIO2                53        /* out */
69 7e7c5e4c balrog
#define N8X0_TUSB_INT_GPIO                58
70 e927bb00 balrog
#define N8X0_BT_WKUP_GPIO                61
71 e927bb00 balrog
#define N8X0_STI_GPIO                        62
72 7e7c5e4c balrog
#define N8X0_CBUS_SEL_GPIO                64
73 e927bb00 balrog
#define N8X0_CBUS_DAT_GPIO                65
74 e927bb00 balrog
#define N8X0_CBUS_CLK_GPIO                66
75 e927bb00 balrog
#define N8X0_WLAN_IRQ_GPIO                87
76 e927bb00 balrog
#define N8X0_BT_RESET_GPIO                92
77 e927bb00 balrog
#define N8X0_TEA5761_CS_GPIO                93
78 7e7c5e4c balrog
#define N800_UNKNOWN_GPIO                94
79 e927bb00 balrog
#define N810_TSC_RESET_GPIO                94
80 7e7c5e4c balrog
#define N800_CAM_ACT_GPIO                95
81 e927bb00 balrog
#define N810_GPS_WAKEUP_GPIO                95
82 e927bb00 balrog
#define N8X0_MMC_CS_GPIO                96
83 e927bb00 balrog
#define N8X0_WLAN_PWR_GPIO                97
84 7e7c5e4c balrog
#define N8X0_BT_HOST_WKUP_GPIO                98
85 7e7c5e4c balrog
#define N800_UNKNOWN_GPIO3                101        /* out */
86 7e7c5e4c balrog
#define N810_KB_LOCK_GPIO                102
87 7e7c5e4c balrog
#define N800_TSC_TS_GPIO                103
88 e927bb00 balrog
#define N810_TSC_TS_GPIO                106
89 e927bb00 balrog
#define N8X0_HEADPHONE_GPIO                107
90 7e7c5e4c balrog
#define N8X0_RETU_GPIO                        108
91 7e7c5e4c balrog
#define N800_TSC_KP_IRQ_GPIO                109
92 7e7c5e4c balrog
#define N810_KEYBOARD_GPIO                109
93 7e7c5e4c balrog
#define N800_BAT_COVER_GPIO                110
94 7e7c5e4c balrog
#define N810_SLIDE_GPIO                        110
95 7e7c5e4c balrog
#define N8X0_TAHVO_GPIO                        111
96 7e7c5e4c balrog
#define N800_UNKNOWN_GPIO4                112        /* out */
97 e927bb00 balrog
#define N810_SLEEPX_LED_GPIO                112
98 1d4e547b balrog
#define N800_TSC_RESET_GPIO                118        /* ? */
99 1d4e547b balrog
#define N800_TSC_UNKNOWN_GPIO                119        /* out */
100 7e7c5e4c balrog
#define N8X0_TMP105_GPIO                125
101 7e7c5e4c balrog
102 7e7c5e4c balrog
/* Config */
103 7e7c5e4c balrog
#define XLDR_LL_UART                        1
104 7e7c5e4c balrog
105 1d4e547b balrog
/* Addresses on the I2C bus 0 */
106 1d4e547b balrog
#define N810_TLV320AIC33_ADDR                0x18        /* Audio CODEC */
107 1d4e547b balrog
#define N8X0_TCM825x_ADDR                0x29        /* Camera */
108 1d4e547b balrog
#define N810_LP5521_ADDR                0x32        /* LEDs */
109 1d4e547b balrog
#define N810_TSL2563_ADDR                0x3d        /* Light sensor */
110 1d4e547b balrog
#define N810_LM8323_ADDR                0x45        /* Keyboard */
111 1d4e547b balrog
/* Addresses on the I2C bus 1 */
112 1d4e547b balrog
#define N8X0_TMP105_ADDR                0x48        /* Temperature sensor */
113 1d4e547b balrog
#define N8X0_MENELAUS_ADDR                0x72        /* Power management */
114 7e7c5e4c balrog
115 7e7c5e4c balrog
/* Chipselects on GPMC NOR interface */
116 7e7c5e4c balrog
#define N8X0_ONENAND_CS                        0
117 7e7c5e4c balrog
#define N8X0_USB_ASYNC_CS                1
118 7e7c5e4c balrog
#define N8X0_USB_SYNC_CS                4
119 7e7c5e4c balrog
120 7e7c5e4c balrog
static void n800_mmc_cs_cb(void *opaque, int line, int level)
121 7e7c5e4c balrog
{
122 7e7c5e4c balrog
    /* TODO: this seems to actually be connected to the menelaus, to
123 7e7c5e4c balrog
     * which also both MMC slots connect.  */
124 7e7c5e4c balrog
    omap_mmc_enable((struct omap_mmc_s *) opaque, !level);
125 7e7c5e4c balrog
126 7e7c5e4c balrog
    printf("%s: MMC slot %i active\n", __FUNCTION__, level + 1);
127 7e7c5e4c balrog
}
128 7e7c5e4c balrog
129 e927bb00 balrog
static void n8x0_gpio_setup(struct n800_s *s)
130 7e7c5e4c balrog
{
131 7e7c5e4c balrog
    qemu_irq *mmc_cs = qemu_allocate_irqs(n800_mmc_cs_cb, s->cpu->mmc, 1);
132 e927bb00 balrog
    omap2_gpio_out_set(s->cpu->gpif, N8X0_MMC_CS_GPIO, mmc_cs[0]);
133 7e7c5e4c balrog
134 7e7c5e4c balrog
    qemu_irq_lower(omap2_gpio_in_get(s->cpu->gpif, N800_BAT_COVER_GPIO)[0]);
135 7e7c5e4c balrog
}
136 7e7c5e4c balrog
137 7e7c5e4c balrog
static void n8x0_nand_setup(struct n800_s *s)
138 7e7c5e4c balrog
{
139 7e7c5e4c balrog
    /* Either ec40xx or ec48xx are OK for the ID */
140 7e7c5e4c balrog
    omap_gpmc_attach(s->cpu->gpmc, N8X0_ONENAND_CS, 0, onenand_base_update,
141 7e7c5e4c balrog
                    onenand_base_unmap,
142 7e7c5e4c balrog
                    onenand_init(0xec4800, 1,
143 7e7c5e4c balrog
                            omap2_gpio_in_get(s->cpu->gpif,
144 7e7c5e4c balrog
                                    N8X0_ONENAND_GPIO)[0]));
145 7e7c5e4c balrog
}
146 7e7c5e4c balrog
147 e927bb00 balrog
static void n8x0_i2c_setup(struct n800_s *s)
148 7e7c5e4c balrog
{
149 7e7c5e4c balrog
    qemu_irq tmp_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_TMP105_GPIO)[0];
150 7e7c5e4c balrog
151 7e7c5e4c balrog
    /* Attach the CPU on one end of our I2C bus.  */
152 7e7c5e4c balrog
    s->i2c = omap_i2c_bus(s->cpu->i2c[0]);
153 7e7c5e4c balrog
154 7e7c5e4c balrog
    /* Attach a menelaus PM chip */
155 7e7c5e4c balrog
    i2c_set_slave_address(
156 7e7c5e4c balrog
                    twl92230_init(s->i2c,
157 7e7c5e4c balrog
                            s->cpu->irq[0][OMAP_INT_24XX_SYS_NIRQ]),
158 7e7c5e4c balrog
                    N8X0_MENELAUS_ADDR);
159 7e7c5e4c balrog
160 7e7c5e4c balrog
    /* Attach a TMP105 PM chip (A0 wired to ground) */
161 7e7c5e4c balrog
    i2c_set_slave_address(tmp105_init(s->i2c, tmp_irq), N8X0_TMP105_ADDR);
162 7e7c5e4c balrog
}
163 7e7c5e4c balrog
164 7e7c5e4c balrog
/* Touchscreen and keypad controller */
165 e927bb00 balrog
static struct mouse_transform_info_s n800_pointercal = {
166 e927bb00 balrog
    .x = 800,
167 e927bb00 balrog
    .y = 480,
168 e927bb00 balrog
    .a = { 14560, -68, -3455208, -39, -9621, 35152972, 65536 },
169 e927bb00 balrog
};
170 e927bb00 balrog
171 e927bb00 balrog
static struct mouse_transform_info_s n810_pointercal = {
172 e927bb00 balrog
    .x = 800,
173 e927bb00 balrog
    .y = 480,
174 e927bb00 balrog
    .a = { 15041, 148, -4731056, 171, -10238, 35933380, 65536 },
175 e927bb00 balrog
};
176 e927bb00 balrog
177 7e7c5e4c balrog
#define RETU_KEYCODE        61        /* F3 */
178 7e7c5e4c balrog
179 7e7c5e4c balrog
static void n800_key_event(void *opaque, int keycode)
180 7e7c5e4c balrog
{
181 7e7c5e4c balrog
    struct n800_s *s = (struct n800_s *) opaque;
182 7e7c5e4c balrog
    int code = s->keymap[keycode & 0x7f];
183 7e7c5e4c balrog
184 7e7c5e4c balrog
    if (code == -1) {
185 7e7c5e4c balrog
        if ((keycode & 0x7f) == RETU_KEYCODE)
186 7e7c5e4c balrog
            retu_key_event(s->retu, !(keycode & 0x80));
187 7e7c5e4c balrog
        return;
188 7e7c5e4c balrog
    }
189 7e7c5e4c balrog
190 e927bb00 balrog
    tsc210x_key_event(s->ts.chip, code, !(keycode & 0x80));
191 7e7c5e4c balrog
}
192 7e7c5e4c balrog
193 7e7c5e4c balrog
static const int n800_keys[16] = {
194 7e7c5e4c balrog
    -1,
195 7e7c5e4c balrog
    72,        /* Up */
196 7e7c5e4c balrog
    63,        /* Home (F5) */
197 7e7c5e4c balrog
    -1,
198 7e7c5e4c balrog
    75,        /* Left */
199 7e7c5e4c balrog
    28,        /* Enter */
200 7e7c5e4c balrog
    77,        /* Right */
201 7e7c5e4c balrog
    -1,
202 1d4e547b balrog
     1,        /* Cycle (ESC) */
203 7e7c5e4c balrog
    80,        /* Down */
204 7e7c5e4c balrog
    62,        /* Menu (F4) */
205 7e7c5e4c balrog
    -1,
206 7e7c5e4c balrog
    66,        /* Zoom- (F8) */
207 1d4e547b balrog
    64,        /* FullScreen (F6) */
208 7e7c5e4c balrog
    65,        /* Zoom+ (F7) */
209 7e7c5e4c balrog
    -1,
210 7e7c5e4c balrog
};
211 7e7c5e4c balrog
212 e927bb00 balrog
static void n800_tsc_kbd_setup(struct n800_s *s)
213 7e7c5e4c balrog
{
214 7e7c5e4c balrog
    int i;
215 7e7c5e4c balrog
216 7e7c5e4c balrog
    /* XXX: are the three pins inverted inside the chip between the
217 7e7c5e4c balrog
     * tsc and the cpu (N4111)?  */
218 7e7c5e4c balrog
    qemu_irq penirq = 0;        /* NC */
219 7e7c5e4c balrog
    qemu_irq kbirq = omap2_gpio_in_get(s->cpu->gpif, N800_TSC_KP_IRQ_GPIO)[0];
220 7e7c5e4c balrog
    qemu_irq dav = omap2_gpio_in_get(s->cpu->gpif, N800_TSC_TS_GPIO)[0];
221 7e7c5e4c balrog
222 e927bb00 balrog
    s->ts.chip = tsc2301_init(penirq, kbirq, dav, 0);
223 e927bb00 balrog
    s->ts.opaque = s->ts.chip->opaque;
224 e927bb00 balrog
    s->ts.txrx = tsc210x_txrx;
225 7e7c5e4c balrog
226 7e7c5e4c balrog
    for (i = 0; i < 0x80; i ++)
227 7e7c5e4c balrog
        s->keymap[i] = -1;
228 7e7c5e4c balrog
    for (i = 0; i < 0x10; i ++)
229 7e7c5e4c balrog
        if (n800_keys[i] >= 0)
230 7e7c5e4c balrog
            s->keymap[n800_keys[i]] = i;
231 7e7c5e4c balrog
232 7e7c5e4c balrog
    qemu_add_kbd_event_handler(n800_key_event, s);
233 7e7c5e4c balrog
234 e927bb00 balrog
    tsc210x_set_transform(s->ts.chip, &n800_pointercal);
235 e927bb00 balrog
}
236 e927bb00 balrog
237 e927bb00 balrog
static void n810_tsc_setup(struct n800_s *s)
238 e927bb00 balrog
{
239 e927bb00 balrog
    qemu_irq pintdav = omap2_gpio_in_get(s->cpu->gpif, N810_TSC_TS_GPIO)[0];
240 e927bb00 balrog
241 e927bb00 balrog
    s->ts.opaque = tsc2005_init(pintdav);
242 e927bb00 balrog
    s->ts.txrx = tsc2005_txrx;
243 e927bb00 balrog
244 e927bb00 balrog
    tsc2005_set_transform(s->ts.opaque, &n810_pointercal);
245 7e7c5e4c balrog
}
246 7e7c5e4c balrog
247 1d4e547b balrog
/* N810 Keyboard controller */
248 1d4e547b balrog
static void n810_key_event(void *opaque, int keycode)
249 1d4e547b balrog
{
250 1d4e547b balrog
    struct n800_s *s = (struct n800_s *) opaque;
251 1d4e547b balrog
    int code = s->keymap[keycode & 0x7f];
252 1d4e547b balrog
253 1d4e547b balrog
    if (code == -1) {
254 1d4e547b balrog
        if ((keycode & 0x7f) == RETU_KEYCODE)
255 1d4e547b balrog
            retu_key_event(s->retu, !(keycode & 0x80));
256 1d4e547b balrog
        return;
257 1d4e547b balrog
    }
258 1d4e547b balrog
259 1d4e547b balrog
    lm832x_key_event(s->kbd, code, !(keycode & 0x80));
260 1d4e547b balrog
}
261 1d4e547b balrog
262 1d4e547b balrog
#define M        0
263 1d4e547b balrog
264 1d4e547b balrog
static int n810_keys[0x80] = {
265 1d4e547b balrog
    [0x01] = 16,        /* Q */
266 1d4e547b balrog
    [0x02] = 37,        /* K */
267 1d4e547b balrog
    [0x03] = 24,        /* O */
268 1d4e547b balrog
    [0x04] = 25,        /* P */
269 1d4e547b balrog
    [0x05] = 14,        /* Backspace */
270 1d4e547b balrog
    [0x06] = 30,        /* A */
271 1d4e547b balrog
    [0x07] = 31,        /* S */
272 1d4e547b balrog
    [0x08] = 32,        /* D */
273 1d4e547b balrog
    [0x09] = 33,        /* F */
274 1d4e547b balrog
    [0x0a] = 34,        /* G */
275 1d4e547b balrog
    [0x0b] = 35,        /* H */
276 1d4e547b balrog
    [0x0c] = 36,        /* J */
277 1d4e547b balrog
278 1d4e547b balrog
    [0x11] = 17,        /* W */
279 1d4e547b balrog
    [0x12] = 62,        /* Menu (F4) */
280 1d4e547b balrog
    [0x13] = 38,        /* L */
281 1d4e547b balrog
    [0x14] = 40,        /* ' (Apostrophe) */
282 1d4e547b balrog
    [0x16] = 44,        /* Z */
283 1d4e547b balrog
    [0x17] = 45,        /* X */
284 1d4e547b balrog
    [0x18] = 46,        /* C */
285 1d4e547b balrog
    [0x19] = 47,        /* V */
286 1d4e547b balrog
    [0x1a] = 48,        /* B */
287 1d4e547b balrog
    [0x1b] = 49,        /* N */
288 1d4e547b balrog
    [0x1c] = 42,        /* Shift (Left shift) */
289 1d4e547b balrog
    [0x1f] = 65,        /* Zoom+ (F7) */
290 1d4e547b balrog
291 1d4e547b balrog
    [0x21] = 18,        /* E */
292 1d4e547b balrog
    [0x22] = 39,        /* ; (Semicolon) */
293 1d4e547b balrog
    [0x23] = 12,        /* - (Minus) */
294 1d4e547b balrog
    [0x24] = 13,        /* = (Equal) */
295 1d4e547b balrog
    [0x2b] = 56,        /* Fn (Left Alt) */
296 1d4e547b balrog
    [0x2c] = 50,        /* M */
297 1d4e547b balrog
    [0x2f] = 66,        /* Zoom- (F8) */
298 1d4e547b balrog
299 1d4e547b balrog
    [0x31] = 19,        /* R */
300 1d4e547b balrog
    [0x32] = 29 | M,        /* Right Ctrl */
301 1d4e547b balrog
    [0x34] = 57,        /* Space */
302 1d4e547b balrog
    [0x35] = 51,        /* , (Comma) */
303 1d4e547b balrog
    [0x37] = 72 | M,        /* Up */
304 1d4e547b balrog
    [0x3c] = 82 | M,        /* Compose (Insert) */
305 1d4e547b balrog
    [0x3f] = 64,        /* FullScreen (F6) */
306 1d4e547b balrog
307 1d4e547b balrog
    [0x41] = 20,        /* T */
308 1d4e547b balrog
    [0x44] = 52,        /* . (Dot) */
309 1d4e547b balrog
    [0x46] = 77 | M,        /* Right */
310 1d4e547b balrog
    [0x4f] = 63,        /* Home (F5) */
311 1d4e547b balrog
    [0x51] = 21,        /* Y */
312 1d4e547b balrog
    [0x53] = 80 | M,        /* Down */
313 1d4e547b balrog
    [0x55] = 28,        /* Enter */
314 1d4e547b balrog
    [0x5f] =  1,        /* Cycle (ESC) */
315 1d4e547b balrog
316 1d4e547b balrog
    [0x61] = 22,        /* U */
317 1d4e547b balrog
    [0x64] = 75 | M,        /* Left */
318 1d4e547b balrog
319 1d4e547b balrog
    [0x71] = 23,        /* I */
320 1d4e547b balrog
#if 0
321 1d4e547b balrog
    [0x75] = 28 | M,        /* KP Enter (KP Enter) */
322 1d4e547b balrog
#else
323 1d4e547b balrog
    [0x75] = 15,        /* KP Enter (Tab) */
324 1d4e547b balrog
#endif
325 1d4e547b balrog
};
326 1d4e547b balrog
327 1d4e547b balrog
#undef M
328 1d4e547b balrog
329 1d4e547b balrog
static void n810_kbd_setup(struct n800_s *s)
330 1d4e547b balrog
{
331 1d4e547b balrog
    qemu_irq kbd_irq = omap2_gpio_in_get(s->cpu->gpif, N810_KEYBOARD_GPIO)[0];
332 1d4e547b balrog
    int i;
333 1d4e547b balrog
334 1d4e547b balrog
    for (i = 0; i < 0x80; i ++)
335 1d4e547b balrog
        s->keymap[i] = -1;
336 1d4e547b balrog
    for (i = 0; i < 0x80; i ++)
337 1d4e547b balrog
        if (n810_keys[i] > 0)
338 1d4e547b balrog
            s->keymap[n810_keys[i]] = i;
339 1d4e547b balrog
340 1d4e547b balrog
    qemu_add_kbd_event_handler(n810_key_event, s);
341 1d4e547b balrog
342 1d4e547b balrog
    /* Attach the LM8322 keyboard to the I2C bus,
343 1d4e547b balrog
     * should happen in n8x0_i2c_setup and s->kbd be initialised here.  */
344 1d4e547b balrog
    s->kbd = lm8323_init(s->i2c, kbd_irq);
345 1d4e547b balrog
    i2c_set_slave_address(s->kbd, N810_LM8323_ADDR);
346 1d4e547b balrog
}
347 1d4e547b balrog
348 7e7c5e4c balrog
/* LCD MIPI DBI-C controller (URAL) */
349 7e7c5e4c balrog
struct mipid_s {
350 7e7c5e4c balrog
    int resp[4];
351 7e7c5e4c balrog
    int param[4];
352 7e7c5e4c balrog
    int p;
353 7e7c5e4c balrog
    int pm;
354 7e7c5e4c balrog
    int cmd;
355 7e7c5e4c balrog
356 7e7c5e4c balrog
    int sleep;
357 7e7c5e4c balrog
    int booster;
358 7e7c5e4c balrog
    int te;
359 7e7c5e4c balrog
    int selfcheck;
360 7e7c5e4c balrog
    int partial;
361 7e7c5e4c balrog
    int normal;
362 7e7c5e4c balrog
    int vscr;
363 7e7c5e4c balrog
    int invert;
364 7e7c5e4c balrog
    int onoff;
365 7e7c5e4c balrog
    int gamma;
366 7e7c5e4c balrog
    uint32_t id;
367 7e7c5e4c balrog
};
368 7e7c5e4c balrog
369 7e7c5e4c balrog
static void mipid_reset(struct mipid_s *s)
370 7e7c5e4c balrog
{
371 7e7c5e4c balrog
    if (!s->sleep)
372 7e7c5e4c balrog
        fprintf(stderr, "%s: Display off\n", __FUNCTION__);
373 7e7c5e4c balrog
374 7e7c5e4c balrog
    s->pm = 0;
375 7e7c5e4c balrog
    s->cmd = 0;
376 7e7c5e4c balrog
377 7e7c5e4c balrog
    s->sleep = 1;
378 7e7c5e4c balrog
    s->booster = 0;
379 7e7c5e4c balrog
    s->selfcheck =
380 7e7c5e4c balrog
            (1 << 7) |        /* Register loading OK.  */
381 7e7c5e4c balrog
            (1 << 5) |        /* The chip is attached.  */
382 7e7c5e4c balrog
            (1 << 4);        /* Display glass still in one piece.  */
383 7e7c5e4c balrog
    s->te = 0;
384 7e7c5e4c balrog
    s->partial = 0;
385 7e7c5e4c balrog
    s->normal = 1;
386 7e7c5e4c balrog
    s->vscr = 0;
387 7e7c5e4c balrog
    s->invert = 0;
388 7e7c5e4c balrog
    s->onoff = 1;
389 7e7c5e4c balrog
    s->gamma = 0;
390 7e7c5e4c balrog
}
391 7e7c5e4c balrog
392 e927bb00 balrog
static uint32_t mipid_txrx(void *opaque, uint32_t cmd, int len)
393 7e7c5e4c balrog
{
394 7e7c5e4c balrog
    struct mipid_s *s = (struct mipid_s *) opaque;
395 7e7c5e4c balrog
    uint8_t ret;
396 7e7c5e4c balrog
397 e927bb00 balrog
    if (len > 9)
398 e927bb00 balrog
        cpu_abort(cpu_single_env, "%s: FIXME: bad SPI word width %i\n",
399 e927bb00 balrog
                        __FUNCTION__, len);
400 e927bb00 balrog
401 7e7c5e4c balrog
    if (s->p >= sizeof(s->resp) / sizeof(*s->resp))
402 7e7c5e4c balrog
        ret = 0;
403 7e7c5e4c balrog
    else
404 7e7c5e4c balrog
        ret = s->resp[s->p ++];
405 7e7c5e4c balrog
    if (s->pm --> 0)
406 7e7c5e4c balrog
        s->param[s->pm] = cmd;
407 7e7c5e4c balrog
    else
408 7e7c5e4c balrog
        s->cmd = cmd;
409 7e7c5e4c balrog
410 7e7c5e4c balrog
    switch (s->cmd) {
411 7e7c5e4c balrog
    case 0x00:        /* NOP */
412 7e7c5e4c balrog
        break;
413 7e7c5e4c balrog
414 7e7c5e4c balrog
    case 0x01:        /* SWRESET */
415 7e7c5e4c balrog
        mipid_reset(s);
416 7e7c5e4c balrog
        break;
417 7e7c5e4c balrog
418 7e7c5e4c balrog
    case 0x02:        /* BSTROFF */
419 7e7c5e4c balrog
        s->booster = 0;
420 7e7c5e4c balrog
        break;
421 7e7c5e4c balrog
    case 0x03:        /* BSTRON */
422 7e7c5e4c balrog
        s->booster = 1;
423 7e7c5e4c balrog
        break;
424 7e7c5e4c balrog
425 7e7c5e4c balrog
    case 0x04:        /* RDDID */
426 7e7c5e4c balrog
        s->p = 0;
427 7e7c5e4c balrog
        s->resp[0] = (s->id >> 16) & 0xff;
428 7e7c5e4c balrog
        s->resp[1] = (s->id >>  8) & 0xff;
429 7e7c5e4c balrog
        s->resp[2] = (s->id >>  0) & 0xff;
430 7e7c5e4c balrog
        break;
431 7e7c5e4c balrog
432 7e7c5e4c balrog
    case 0x06:        /* RD_RED */
433 7e7c5e4c balrog
    case 0x07:        /* RD_GREEN */
434 7e7c5e4c balrog
        /* XXX the bootloader sometimes issues RD_BLUE meaning RDDID so
435 7e7c5e4c balrog
         * for the bootloader one needs to change this.  */
436 7e7c5e4c balrog
    case 0x08:        /* RD_BLUE */
437 7e7c5e4c balrog
        s->p = 0;
438 7e7c5e4c balrog
        /* TODO: return first pixel components */
439 7e7c5e4c balrog
        s->resp[0] = 0x01;
440 7e7c5e4c balrog
        break;
441 7e7c5e4c balrog
442 7e7c5e4c balrog
    case 0x09:        /* RDDST */
443 7e7c5e4c balrog
        s->p = 0;
444 7e7c5e4c balrog
        s->resp[0] = s->booster << 7;
445 7e7c5e4c balrog
        s->resp[1] = (5 << 4) | (s->partial << 2) |
446 7e7c5e4c balrog
                (s->sleep << 1) | s->normal;
447 7e7c5e4c balrog
        s->resp[2] = (s->vscr << 7) | (s->invert << 5) |
448 7e7c5e4c balrog
                (s->onoff << 2) | (s->te << 1) | (s->gamma >> 2);
449 7e7c5e4c balrog
        s->resp[3] = s->gamma << 6;
450 7e7c5e4c balrog
        break;
451 7e7c5e4c balrog
452 7e7c5e4c balrog
    case 0x0a:        /* RDDPM */
453 7e7c5e4c balrog
        s->p = 0;
454 7e7c5e4c balrog
        s->resp[0] = (s->onoff << 2) | (s->normal << 3) | (s->sleep << 4) |
455 7e7c5e4c balrog
                (s->partial << 5) | (s->sleep << 6) | (s->booster << 7);
456 7e7c5e4c balrog
        break;
457 7e7c5e4c balrog
    case 0x0b:        /* RDDMADCTR */
458 7e7c5e4c balrog
        s->p = 0;
459 7e7c5e4c balrog
        s->resp[0] = 0;
460 7e7c5e4c balrog
        break;
461 7e7c5e4c balrog
    case 0x0c:        /* RDDCOLMOD */
462 7e7c5e4c balrog
        s->p = 0;
463 7e7c5e4c balrog
        s->resp[0] = 5;        /* 65K colours */
464 7e7c5e4c balrog
        break;
465 7e7c5e4c balrog
    case 0x0d:        /* RDDIM */
466 7e7c5e4c balrog
        s->p = 0;
467 7e7c5e4c balrog
        s->resp[0] = (s->invert << 5) | (s->vscr << 7) | s->gamma;
468 7e7c5e4c balrog
        break;
469 7e7c5e4c balrog
    case 0x0e:        /* RDDSM */
470 7e7c5e4c balrog
        s->p = 0;
471 7e7c5e4c balrog
        s->resp[0] = s->te << 7;
472 7e7c5e4c balrog
        break;
473 7e7c5e4c balrog
    case 0x0f:        /* RDDSDR */
474 7e7c5e4c balrog
        s->p = 0;
475 7e7c5e4c balrog
        s->resp[0] = s->selfcheck;
476 7e7c5e4c balrog
        break;
477 7e7c5e4c balrog
478 7e7c5e4c balrog
    case 0x10:        /* SLPIN */
479 7e7c5e4c balrog
        s->sleep = 1;
480 7e7c5e4c balrog
        break;
481 7e7c5e4c balrog
    case 0x11:        /* SLPOUT */
482 7e7c5e4c balrog
        s->sleep = 0;
483 7e7c5e4c balrog
        s->selfcheck ^= 1 << 6;        /* POFF self-diagnosis Ok */
484 7e7c5e4c balrog
        break;
485 7e7c5e4c balrog
486 7e7c5e4c balrog
    case 0x12:        /* PTLON */
487 7e7c5e4c balrog
        s->partial = 1;
488 7e7c5e4c balrog
        s->normal = 0;
489 7e7c5e4c balrog
        s->vscr = 0;
490 7e7c5e4c balrog
        break;
491 7e7c5e4c balrog
    case 0x13:        /* NORON */
492 7e7c5e4c balrog
        s->partial = 0;
493 7e7c5e4c balrog
        s->normal = 1;
494 7e7c5e4c balrog
        s->vscr = 0;
495 7e7c5e4c balrog
        break;
496 7e7c5e4c balrog
497 7e7c5e4c balrog
    case 0x20:        /* INVOFF */
498 7e7c5e4c balrog
        s->invert = 0;
499 7e7c5e4c balrog
        break;
500 7e7c5e4c balrog
    case 0x21:        /* INVON */
501 7e7c5e4c balrog
        s->invert = 1;
502 7e7c5e4c balrog
        break;
503 7e7c5e4c balrog
504 7e7c5e4c balrog
    case 0x22:        /* APOFF */
505 7e7c5e4c balrog
    case 0x23:        /* APON */
506 7e7c5e4c balrog
        goto bad_cmd;
507 7e7c5e4c balrog
508 7e7c5e4c balrog
    case 0x25:        /* WRCNTR */
509 7e7c5e4c balrog
        if (s->pm < 0)
510 7e7c5e4c balrog
            s->pm = 1;
511 7e7c5e4c balrog
        goto bad_cmd;
512 7e7c5e4c balrog
513 7e7c5e4c balrog
    case 0x26:        /* GAMSET */
514 7e7c5e4c balrog
        if (!s->pm)
515 7e7c5e4c balrog
            s->gamma = ffs(s->param[0] & 0xf) - 1;
516 7e7c5e4c balrog
        else if (s->pm < 0)
517 7e7c5e4c balrog
            s->pm = 1;
518 7e7c5e4c balrog
        break;
519 7e7c5e4c balrog
520 7e7c5e4c balrog
    case 0x28:        /* DISPOFF */
521 7e7c5e4c balrog
        s->onoff = 0;
522 7e7c5e4c balrog
        fprintf(stderr, "%s: Display off\n", __FUNCTION__);
523 7e7c5e4c balrog
        break;
524 7e7c5e4c balrog
    case 0x29:        /* DISPON */
525 7e7c5e4c balrog
        s->onoff = 1;
526 7e7c5e4c balrog
        fprintf(stderr, "%s: Display on\n", __FUNCTION__);
527 7e7c5e4c balrog
        break;
528 7e7c5e4c balrog
529 7e7c5e4c balrog
    case 0x2a:        /* CASET */
530 7e7c5e4c balrog
    case 0x2b:        /* RASET */
531 7e7c5e4c balrog
    case 0x2c:        /* RAMWR */
532 7e7c5e4c balrog
    case 0x2d:        /* RGBSET */
533 7e7c5e4c balrog
    case 0x2e:        /* RAMRD */
534 7e7c5e4c balrog
    case 0x30:        /* PTLAR */
535 7e7c5e4c balrog
    case 0x33:        /* SCRLAR */
536 7e7c5e4c balrog
        goto bad_cmd;
537 7e7c5e4c balrog
538 7e7c5e4c balrog
    case 0x34:        /* TEOFF */
539 7e7c5e4c balrog
        s->te = 0;
540 7e7c5e4c balrog
        break;
541 7e7c5e4c balrog
    case 0x35:        /* TEON */
542 7e7c5e4c balrog
        if (!s->pm)
543 7e7c5e4c balrog
            s->te = 1;
544 7e7c5e4c balrog
        else if (s->pm < 0)
545 7e7c5e4c balrog
            s->pm = 1;
546 7e7c5e4c balrog
        break;
547 7e7c5e4c balrog
548 7e7c5e4c balrog
    case 0x36:        /* MADCTR */
549 7e7c5e4c balrog
        goto bad_cmd;
550 7e7c5e4c balrog
551 7e7c5e4c balrog
    case 0x37:        /* VSCSAD */
552 7e7c5e4c balrog
        s->partial = 0;
553 7e7c5e4c balrog
        s->normal = 0;
554 7e7c5e4c balrog
        s->vscr = 1;
555 7e7c5e4c balrog
        break;
556 7e7c5e4c balrog
557 7e7c5e4c balrog
    case 0x38:        /* IDMOFF */
558 7e7c5e4c balrog
    case 0x39:        /* IDMON */
559 7e7c5e4c balrog
    case 0x3a:        /* COLMOD */
560 7e7c5e4c balrog
        goto bad_cmd;
561 7e7c5e4c balrog
562 7e7c5e4c balrog
    case 0xb0:        /* CLKINT / DISCTL */
563 7e7c5e4c balrog
    case 0xb1:        /* CLKEXT */
564 7e7c5e4c balrog
        if (s->pm < 0)
565 7e7c5e4c balrog
            s->pm = 2;
566 7e7c5e4c balrog
        break;
567 7e7c5e4c balrog
568 7e7c5e4c balrog
    case 0xb4:        /* FRMSEL */
569 7e7c5e4c balrog
        break;
570 7e7c5e4c balrog
571 7e7c5e4c balrog
    case 0xb5:        /* FRM8SEL */
572 7e7c5e4c balrog
    case 0xb6:        /* TMPRNG / INIESC */
573 7e7c5e4c balrog
    case 0xb7:        /* TMPHIS / NOP2 */
574 7e7c5e4c balrog
    case 0xb8:        /* TMPREAD / MADCTL */
575 7e7c5e4c balrog
    case 0xba:        /* DISTCTR */
576 7e7c5e4c balrog
    case 0xbb:        /* EPVOL */
577 7e7c5e4c balrog
        goto bad_cmd;
578 7e7c5e4c balrog
579 7e7c5e4c balrog
    case 0xbd:        /* Unknown */
580 7e7c5e4c balrog
        s->p = 0;
581 7e7c5e4c balrog
        s->resp[0] = 0;
582 7e7c5e4c balrog
        s->resp[1] = 1;
583 7e7c5e4c balrog
        break;
584 7e7c5e4c balrog
585 7e7c5e4c balrog
    case 0xc2:        /* IFMOD */
586 7e7c5e4c balrog
        if (s->pm < 0)
587 7e7c5e4c balrog
            s->pm = 2;
588 7e7c5e4c balrog
        break;
589 7e7c5e4c balrog
590 7e7c5e4c balrog
    case 0xc6:        /* PWRCTL */
591 7e7c5e4c balrog
    case 0xc7:        /* PPWRCTL */
592 7e7c5e4c balrog
    case 0xd0:        /* EPWROUT */
593 7e7c5e4c balrog
    case 0xd1:        /* EPWRIN */
594 7e7c5e4c balrog
    case 0xd4:        /* RDEV */
595 7e7c5e4c balrog
    case 0xd5:        /* RDRR */
596 7e7c5e4c balrog
        goto bad_cmd;
597 7e7c5e4c balrog
598 7e7c5e4c balrog
    case 0xda:        /* RDID1 */
599 7e7c5e4c balrog
        s->p = 0;
600 7e7c5e4c balrog
        s->resp[0] = (s->id >> 16) & 0xff;
601 7e7c5e4c balrog
        break;
602 7e7c5e4c balrog
    case 0xdb:        /* RDID2 */
603 7e7c5e4c balrog
        s->p = 0;
604 7e7c5e4c balrog
        s->resp[0] = (s->id >>  8) & 0xff;
605 7e7c5e4c balrog
        break;
606 7e7c5e4c balrog
    case 0xdc:        /* RDID3 */
607 7e7c5e4c balrog
        s->p = 0;
608 7e7c5e4c balrog
        s->resp[0] = (s->id >>  0) & 0xff;
609 7e7c5e4c balrog
        break;
610 7e7c5e4c balrog
611 7e7c5e4c balrog
    default:
612 7e7c5e4c balrog
    bad_cmd:
613 7e7c5e4c balrog
        fprintf(stderr, "%s: unknown command %02x\n", __FUNCTION__, s->cmd);
614 7e7c5e4c balrog
        break;
615 7e7c5e4c balrog
    }
616 7e7c5e4c balrog
617 7e7c5e4c balrog
    return ret;
618 7e7c5e4c balrog
}
619 7e7c5e4c balrog
620 7e7c5e4c balrog
static void *mipid_init(void)
621 7e7c5e4c balrog
{
622 7e7c5e4c balrog
    struct mipid_s *s = (struct mipid_s *) qemu_mallocz(sizeof(*s));
623 7e7c5e4c balrog
624 7e7c5e4c balrog
    s->id = 0x838f03;
625 7e7c5e4c balrog
    mipid_reset(s);
626 7e7c5e4c balrog
627 7e7c5e4c balrog
    return s;
628 7e7c5e4c balrog
}
629 7e7c5e4c balrog
630 e927bb00 balrog
static void n8x0_spi_setup(struct n800_s *s)
631 7e7c5e4c balrog
{
632 e927bb00 balrog
    void *tsc = s->ts.opaque;
633 7e7c5e4c balrog
    void *mipid = mipid_init();
634 7e7c5e4c balrog
635 e927bb00 balrog
    omap_mcspi_attach(s->cpu->mcspi[0], s->ts.txrx, tsc, 0);
636 7e7c5e4c balrog
    omap_mcspi_attach(s->cpu->mcspi[0], mipid_txrx, mipid, 1);
637 7e7c5e4c balrog
}
638 7e7c5e4c balrog
639 7e7c5e4c balrog
/* This task is normally performed by the bootloader.  If we're loading
640 7e7c5e4c balrog
 * a kernel directly, we need to enable the Blizzard ourselves.  */
641 7e7c5e4c balrog
static void n800_dss_init(struct rfbi_chip_s *chip)
642 7e7c5e4c balrog
{
643 7e7c5e4c balrog
    uint8_t *fb_blank;
644 7e7c5e4c balrog
645 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x2a);                /* LCD Width register */
646 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x64);
647 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x2c);                /* LCD HNDP register */
648 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x1e);
649 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x2e);                /* LCD Height 0 register */
650 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0xe0);
651 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x30);                /* LCD Height 1 register */
652 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x01);
653 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x32);                /* LCD VNDP register */
654 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x06);
655 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x68);                /* Display Mode register */
656 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 1);                /* Enable bit */
657 7e7c5e4c balrog
658 7e7c5e4c balrog
    chip->write(chip->opaque, 0, 0x6c);        
659 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Input X Start Position */
660 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Input X Start Position */
661 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Input Y Start Position */
662 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Input Y Start Position */
663 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x1f);                /* Input X End Position */
664 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x03);                /* Input X End Position */
665 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0xdf);                /* Input Y End Position */
666 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x01);                /* Input Y End Position */
667 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Output X Start Position */
668 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Output X Start Position */
669 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Output Y Start Position */
670 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x00);                /* Output Y Start Position */
671 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x1f);                /* Output X End Position */
672 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x03);                /* Output X End Position */
673 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0xdf);                /* Output Y End Position */
674 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x01);                /* Output Y End Position */
675 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x01);                /* Input Data Format */
676 7e7c5e4c balrog
    chip->write(chip->opaque, 1, 0x01);                /* Data Source Select */
677 7e7c5e4c balrog
678 7e7c5e4c balrog
    fb_blank = memset(qemu_malloc(800 * 480 * 2), 0xff, 800 * 480 * 2);
679 7e7c5e4c balrog
    /* Display Memory Data Port */
680 7e7c5e4c balrog
    chip->block(chip->opaque, 1, fb_blank, 800 * 480 * 2, 800);
681 7e7c5e4c balrog
    free(fb_blank);
682 7e7c5e4c balrog
}
683 7e7c5e4c balrog
684 e927bb00 balrog
static void n8x0_dss_setup(struct n800_s *s, DisplayState *ds)
685 7e7c5e4c balrog
{
686 7e7c5e4c balrog
    s->blizzard.opaque = s1d13745_init(0, ds);
687 7e7c5e4c balrog
    s->blizzard.block = s1d13745_write_block;
688 7e7c5e4c balrog
    s->blizzard.write = s1d13745_write;
689 7e7c5e4c balrog
    s->blizzard.read = s1d13745_read;
690 7e7c5e4c balrog
691 7e7c5e4c balrog
    omap_rfbi_attach(s->cpu->dss, 0, &s->blizzard);
692 7e7c5e4c balrog
}
693 7e7c5e4c balrog
694 e927bb00 balrog
static void n8x0_cbus_setup(struct n800_s *s)
695 7e7c5e4c balrog
{
696 7e7c5e4c balrog
    qemu_irq dat_out = omap2_gpio_in_get(s->cpu->gpif, N8X0_CBUS_DAT_GPIO)[0];
697 7e7c5e4c balrog
    qemu_irq retu_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_RETU_GPIO)[0];
698 7e7c5e4c balrog
    qemu_irq tahvo_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_TAHVO_GPIO)[0];
699 7e7c5e4c balrog
700 7e7c5e4c balrog
    struct cbus_s *cbus = cbus_init(dat_out);
701 7e7c5e4c balrog
702 7e7c5e4c balrog
    omap2_gpio_out_set(s->cpu->gpif, N8X0_CBUS_CLK_GPIO, cbus->clk);
703 7e7c5e4c balrog
    omap2_gpio_out_set(s->cpu->gpif, N8X0_CBUS_DAT_GPIO, cbus->dat);
704 7e7c5e4c balrog
    omap2_gpio_out_set(s->cpu->gpif, N8X0_CBUS_SEL_GPIO, cbus->sel);
705 7e7c5e4c balrog
706 7e7c5e4c balrog
    cbus_attach(cbus, s->retu = retu_init(retu_irq, 1));
707 7e7c5e4c balrog
    cbus_attach(cbus, s->tahvo = tahvo_init(tahvo_irq, 1));
708 7e7c5e4c balrog
}
709 7e7c5e4c balrog
710 e927bb00 balrog
static void n8x0_usb_power_cb(void *opaque, int line, int level)
711 942ac052 balrog
{
712 942ac052 balrog
    struct n800_s *s = opaque;
713 942ac052 balrog
714 942ac052 balrog
    tusb6010_power(s->usb, level);
715 942ac052 balrog
}
716 942ac052 balrog
717 e927bb00 balrog
static void n8x0_usb_setup(struct n800_s *s)
718 942ac052 balrog
{
719 942ac052 balrog
    qemu_irq tusb_irq = omap2_gpio_in_get(s->cpu->gpif, N8X0_TUSB_INT_GPIO)[0];
720 e927bb00 balrog
    qemu_irq tusb_pwr = qemu_allocate_irqs(n8x0_usb_power_cb, s, 1)[0];
721 942ac052 balrog
    struct tusb_s *tusb = tusb6010_init(tusb_irq);
722 942ac052 balrog
723 942ac052 balrog
    /* Using the NOR interface */
724 942ac052 balrog
    omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_ASYNC_CS,
725 942ac052 balrog
                    tusb6010_async_io(tusb), 0, 0, tusb);
726 942ac052 balrog
    omap_gpmc_attach(s->cpu->gpmc, N8X0_USB_SYNC_CS,
727 942ac052 balrog
                    tusb6010_sync_io(tusb), 0, 0, tusb);
728 942ac052 balrog
729 942ac052 balrog
    s->usb = tusb;
730 e927bb00 balrog
    omap2_gpio_out_set(s->cpu->gpif, N8X0_TUSB_ENABLE_GPIO, tusb_pwr);
731 942ac052 balrog
}
732 942ac052 balrog
733 d238db7f balrog
/* Setup done before the main bootloader starts by some early setup code
734 d238db7f balrog
 * - used when we want to run the main bootloader in emulation.  This
735 d238db7f balrog
 * isn't documented.  */
736 d238db7f balrog
static uint32_t n800_pinout[104] = {
737 d238db7f balrog
    0x080f00d8, 0x00d40808, 0x03080808, 0x080800d0,
738 d238db7f balrog
    0x00dc0808, 0x0b0f0f00, 0x080800b4, 0x00c00808,
739 d238db7f balrog
    0x08080808, 0x180800c4, 0x00b80000, 0x08080808,
740 d238db7f balrog
    0x080800bc, 0x00cc0808, 0x08081818, 0x18180128,
741 d238db7f balrog
    0x01241800, 0x18181818, 0x000000f0, 0x01300000,
742 d238db7f balrog
    0x00001b0b, 0x1b0f0138, 0x00e0181b, 0x1b031b0b,
743 d238db7f balrog
    0x180f0078, 0x00740018, 0x0f0f0f1a, 0x00000080,
744 d238db7f balrog
    0x007c0000, 0x00000000, 0x00000088, 0x00840000,
745 d238db7f balrog
    0x00000000, 0x00000094, 0x00980300, 0x0f180003,
746 d238db7f balrog
    0x0000008c, 0x00900f0f, 0x0f0f1b00, 0x0f00009c,
747 d238db7f balrog
    0x01140000, 0x1b1b0f18, 0x0818013c, 0x01400008,
748 d238db7f balrog
    0x00001818, 0x000b0110, 0x010c1800, 0x0b030b0f,
749 d238db7f balrog
    0x181800f4, 0x00f81818, 0x00000018, 0x000000fc,
750 d238db7f balrog
    0x00401808, 0x00000000, 0x0f1b0030, 0x003c0008,
751 d238db7f balrog
    0x00000000, 0x00000038, 0x00340000, 0x00000000,
752 d238db7f balrog
    0x1a080070, 0x00641a1a, 0x08080808, 0x08080060,
753 d238db7f balrog
    0x005c0808, 0x08080808, 0x08080058, 0x00540808,
754 d238db7f balrog
    0x08080808, 0x0808006c, 0x00680808, 0x08080808,
755 d238db7f balrog
    0x000000a8, 0x00b00000, 0x08080808, 0x000000a0,
756 d238db7f balrog
    0x00a40000, 0x00000000, 0x08ff0050, 0x004c0808,
757 d238db7f balrog
    0xffffffff, 0xffff0048, 0x0044ffff, 0xffffffff,
758 d238db7f balrog
    0x000000ac, 0x01040800, 0x08080b0f, 0x18180100,
759 d238db7f balrog
    0x01081818, 0x0b0b1808, 0x1a0300e4, 0x012c0b1a,
760 d238db7f balrog
    0x02020018, 0x0b000134, 0x011c0800, 0x0b1b1b00,
761 d238db7f balrog
    0x0f0000c8, 0x00ec181b, 0x000f0f02, 0x00180118,
762 d238db7f balrog
    0x01200000, 0x0f0b1b1b, 0x0f0200e8, 0x0000020b,
763 d238db7f balrog
};
764 d238db7f balrog
765 d238db7f balrog
static void n800_setup_nolo_tags(void *sram_base)
766 d238db7f balrog
{
767 d238db7f balrog
    int i;
768 d238db7f balrog
    uint32_t *p = sram_base + 0x8000;
769 d238db7f balrog
    uint32_t *v = sram_base + 0xa000;
770 d238db7f balrog
771 d238db7f balrog
    memset(p, 0, 0x3000);
772 d238db7f balrog
773 d238db7f balrog
    strcpy((void *) (p + 0), "QEMU N800");
774 d238db7f balrog
775 d238db7f balrog
    strcpy((void *) (p + 8), "F5");
776 d238db7f balrog
777 d238db7f balrog
    stl_raw(p + 10, 0x04f70000);
778 d238db7f balrog
    strcpy((void *) (p + 9), "RX-34");
779 d238db7f balrog
780 d238db7f balrog
    /* RAM size in MB? */
781 d238db7f balrog
    stl_raw(p + 12, 0x80);
782 d238db7f balrog
783 d238db7f balrog
    /* Pointer to the list of tags */
784 d238db7f balrog
    stl_raw(p + 13, OMAP2_SRAM_BASE + 0x9000);
785 d238db7f balrog
786 d238db7f balrog
    /* The NOLO tags start here */
787 d238db7f balrog
    p = sram_base + 0x9000;
788 d238db7f balrog
#define ADD_TAG(tag, len)                                \
789 d238db7f balrog
    stw_raw((uint16_t *) p + 0, tag);                        \
790 d238db7f balrog
    stw_raw((uint16_t *) p + 1, len); p ++;                \
791 d238db7f balrog
    stl_raw(p ++, OMAP2_SRAM_BASE | (((void *) v - sram_base) & 0xffff));
792 d238db7f balrog
793 d238db7f balrog
    /* OMAP STI console? Pin out settings? */
794 d238db7f balrog
    ADD_TAG(0x6e01, 414);
795 d238db7f balrog
    for (i = 0; i < sizeof(n800_pinout) / 4; i ++)
796 d238db7f balrog
        stl_raw(v ++, n800_pinout[i]);
797 d238db7f balrog
798 d238db7f balrog
    /* Kernel memsize? */
799 d238db7f balrog
    ADD_TAG(0x6e05, 1);
800 d238db7f balrog
    stl_raw(v ++, 2);
801 d238db7f balrog
802 d238db7f balrog
    /* NOLO serial console */
803 d238db7f balrog
    ADD_TAG(0x6e02, 4);
804 d238db7f balrog
    stl_raw(v ++, XLDR_LL_UART);        /* UART number (1 - 3) */
805 d238db7f balrog
806 d238db7f balrog
#if 0
807 d238db7f balrog
    /* CBUS settings (Retu/AVilma) */
808 d238db7f balrog
    ADD_TAG(0x6e03, 6);
809 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 65);        /* CBUS GPIO0 */
810 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 66);        /* CBUS GPIO1 */
811 d238db7f balrog
    stw_raw((uint16_t *) v + 2, 64);        /* CBUS GPIO2 */
812 d238db7f balrog
    v += 2;
813 d238db7f balrog
#endif
814 d238db7f balrog
815 d238db7f balrog
    /* Nokia ASIC BB5 (Retu/Tahvo) */
816 d238db7f balrog
    ADD_TAG(0x6e0a, 4);
817 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 111);        /* "Retu" interrupt GPIO */
818 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 108);        /* "Tahvo" interrupt GPIO */
819 d238db7f balrog
    v ++;
820 d238db7f balrog
821 d238db7f balrog
    /* LCD console? */
822 d238db7f balrog
    ADD_TAG(0x6e04, 4);
823 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 30);        /* ??? */
824 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 24);        /* ??? */
825 d238db7f balrog
    v ++;
826 d238db7f balrog
827 d238db7f balrog
#if 0
828 d238db7f balrog
    /* LCD settings */
829 d238db7f balrog
    ADD_TAG(0x6e06, 2);
830 d238db7f balrog
    stw_raw((uint16_t *) (v ++), 15);        /* ??? */
831 d238db7f balrog
#endif
832 d238db7f balrog
833 d238db7f balrog
    /* I^2C (Menelaus) */
834 d238db7f balrog
    ADD_TAG(0x6e07, 4);
835 d238db7f balrog
    stl_raw(v ++, 0x00720000);                /* ??? */
836 d238db7f balrog
837 d238db7f balrog
    /* Unknown */
838 d238db7f balrog
    ADD_TAG(0x6e0b, 6);
839 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 94);        /* ??? */
840 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 23);        /* ??? */
841 d238db7f balrog
    stw_raw((uint16_t *) v + 2, 0);        /* ??? */
842 d238db7f balrog
    v += 2;
843 d238db7f balrog
844 d238db7f balrog
    /* OMAP gpio switch info */
845 d238db7f balrog
    ADD_TAG(0x6e0c, 80);
846 d238db7f balrog
    strcpy((void *) v, "bat_cover");        v += 3;
847 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 110);        /* GPIO num ??? */
848 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 1);        /* GPIO num ??? */
849 d238db7f balrog
    v += 2;
850 d238db7f balrog
    strcpy((void *) v, "cam_act");        v += 3;
851 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 95);        /* GPIO num ??? */
852 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 32);        /* GPIO num ??? */
853 d238db7f balrog
    v += 2;
854 d238db7f balrog
    strcpy((void *) v, "cam_turn");        v += 3;
855 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 12);        /* GPIO num ??? */
856 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 33);        /* GPIO num ??? */
857 d238db7f balrog
    v += 2;
858 d238db7f balrog
    strcpy((void *) v, "headphone");        v += 3;
859 d238db7f balrog
    stw_raw((uint16_t *) v + 0, 107);        /* GPIO num ??? */
860 d238db7f balrog
    stw_raw((uint16_t *) v + 1, 17);        /* GPIO num ??? */
861 d238db7f balrog
    v += 2;
862 d238db7f balrog
863 d238db7f balrog
    /* Bluetooth */
864 d238db7f balrog
    ADD_TAG(0x6e0e, 12);
865 d238db7f balrog
    stl_raw(v ++, 0x5c623d01);                /* ??? */
866 d238db7f balrog
    stl_raw(v ++, 0x00000201);                /* ??? */
867 d238db7f balrog
    stl_raw(v ++, 0x00000000);                /* ??? */
868 d238db7f balrog
869 d238db7f balrog
    /* CX3110x WLAN settings */
870 d238db7f balrog
    ADD_TAG(0x6e0f, 8);
871 d238db7f balrog
    stl_raw(v ++, 0x00610025);                /* ??? */
872 d238db7f balrog
    stl_raw(v ++, 0xffff0057);                /* ??? */
873 d238db7f balrog
874 d238db7f balrog
    /* MMC host settings */
875 d238db7f balrog
    ADD_TAG(0x6e10, 12);
876 d238db7f balrog
    stl_raw(v ++, 0xffff000f);                /* ??? */
877 d238db7f balrog
    stl_raw(v ++, 0xffffffff);                /* ??? */
878 d238db7f balrog
    stl_raw(v ++, 0x00000060);                /* ??? */
879 d238db7f balrog
880 d238db7f balrog
    /* OneNAND chip select */
881 d238db7f balrog
    ADD_TAG(0x6e11, 10);
882 d238db7f balrog
    stl_raw(v ++, 0x00000401);                /* ??? */
883 d238db7f balrog
    stl_raw(v ++, 0x0002003a);                /* ??? */
884 d238db7f balrog
    stl_raw(v ++, 0x00000002);                /* ??? */
885 d238db7f balrog
886 d238db7f balrog
    /* TEA5761 sensor settings */
887 d238db7f balrog
    ADD_TAG(0x6e12, 2);
888 d238db7f balrog
    stl_raw(v ++, 93);                        /* GPIO num ??? */
889 d238db7f balrog
890 d238db7f balrog
#if 0
891 d238db7f balrog
    /* Unknown tag */
892 d238db7f balrog
    ADD_TAG(6e09, 0);
893 d238db7f balrog

894 d238db7f balrog
    /* Kernel UART / console */
895 d238db7f balrog
    ADD_TAG(6e12, 0);
896 d238db7f balrog
#endif
897 d238db7f balrog
898 d238db7f balrog
    /* End of the list */
899 d238db7f balrog
    stl_raw(p ++, 0x00000000);
900 d238db7f balrog
    stl_raw(p ++, 0x00000000);
901 d238db7f balrog
}
902 d238db7f balrog
903 7e7c5e4c balrog
/* This task is normally performed by the bootloader.  If we're loading
904 7e7c5e4c balrog
 * a kernel directly, we need to set up GPMC mappings ourselves.  */
905 7e7c5e4c balrog
static void n800_gpmc_init(struct n800_s *s)
906 7e7c5e4c balrog
{
907 7e7c5e4c balrog
    uint32_t config7 =
908 7e7c5e4c balrog
            (0xf << 8) |        /* MASKADDRESS */
909 7e7c5e4c balrog
            (1 << 6) |                /* CSVALID */
910 7e7c5e4c balrog
            (4 << 0);                /* BASEADDRESS */
911 7e7c5e4c balrog
912 7e7c5e4c balrog
    cpu_physical_memory_write(0x6800a078,                /* GPMC_CONFIG7_0 */
913 7e7c5e4c balrog
                    (void *) &config7, sizeof(config7));
914 7e7c5e4c balrog
}
915 7e7c5e4c balrog
916 7e7c5e4c balrog
/* Setup sequence done by the bootloader */
917 e927bb00 balrog
static void n8x0_boot_init(void *opaque)
918 7e7c5e4c balrog
{
919 7e7c5e4c balrog
    struct n800_s *s = (struct n800_s *) opaque;
920 7e7c5e4c balrog
    uint32_t buf;
921 7e7c5e4c balrog
922 7e7c5e4c balrog
    /* PRCM setup */
923 7e7c5e4c balrog
#define omap_writel(addr, val)        \
924 7e7c5e4c balrog
    buf = (val);                        \
925 7e7c5e4c balrog
    cpu_physical_memory_write(addr, (void *) &buf, sizeof(buf))
926 7e7c5e4c balrog
927 7e7c5e4c balrog
    omap_writel(0x48008060, 0x41);                /* PRCM_CLKSRC_CTRL */
928 7e7c5e4c balrog
    omap_writel(0x48008070, 1);                        /* PRCM_CLKOUT_CTRL */
929 7e7c5e4c balrog
    omap_writel(0x48008078, 0);                        /* PRCM_CLKEMUL_CTRL */
930 7e7c5e4c balrog
    omap_writel(0x48008090, 0);                        /* PRCM_VOLTSETUP */
931 7e7c5e4c balrog
    omap_writel(0x48008094, 0);                        /* PRCM_CLKSSETUP */
932 7e7c5e4c balrog
    omap_writel(0x48008098, 0);                        /* PRCM_POLCTRL */
933 7e7c5e4c balrog
    omap_writel(0x48008140, 2);                        /* CM_CLKSEL_MPU */
934 7e7c5e4c balrog
    omap_writel(0x48008148, 0);                        /* CM_CLKSTCTRL_MPU */
935 7e7c5e4c balrog
    omap_writel(0x48008158, 1);                        /* RM_RSTST_MPU */
936 7e7c5e4c balrog
    omap_writel(0x480081c8, 0x15);                /* PM_WKDEP_MPU */
937 7e7c5e4c balrog
    omap_writel(0x480081d4, 0x1d4);                /* PM_EVGENCTRL_MPU */
938 7e7c5e4c balrog
    omap_writel(0x480081d8, 0);                        /* PM_EVEGENONTIM_MPU */
939 7e7c5e4c balrog
    omap_writel(0x480081dc, 0);                        /* PM_EVEGENOFFTIM_MPU */
940 7e7c5e4c balrog
    omap_writel(0x480081e0, 0xc);                /* PM_PWSTCTRL_MPU */
941 7e7c5e4c balrog
    omap_writel(0x48008200, 0x047e7ff7);        /* CM_FCLKEN1_CORE */
942 7e7c5e4c balrog
    omap_writel(0x48008204, 0x00000004);        /* CM_FCLKEN2_CORE */
943 7e7c5e4c balrog
    omap_writel(0x48008210, 0x047e7ff1);        /* CM_ICLKEN1_CORE */
944 7e7c5e4c balrog
    omap_writel(0x48008214, 0x00000004);        /* CM_ICLKEN2_CORE */
945 7e7c5e4c balrog
    omap_writel(0x4800821c, 0x00000000);        /* CM_ICLKEN4_CORE */
946 7e7c5e4c balrog
    omap_writel(0x48008230, 0);                        /* CM_AUTOIDLE1_CORE */
947 7e7c5e4c balrog
    omap_writel(0x48008234, 0);                        /* CM_AUTOIDLE2_CORE */
948 7e7c5e4c balrog
    omap_writel(0x48008238, 7);                        /* CM_AUTOIDLE3_CORE */
949 7e7c5e4c balrog
    omap_writel(0x4800823c, 0);                        /* CM_AUTOIDLE4_CORE */
950 7e7c5e4c balrog
    omap_writel(0x48008240, 0x04360626);        /* CM_CLKSEL1_CORE */
951 7e7c5e4c balrog
    omap_writel(0x48008244, 0x00000014);        /* CM_CLKSEL2_CORE */
952 7e7c5e4c balrog
    omap_writel(0x48008248, 0);                        /* CM_CLKSTCTRL_CORE */
953 7e7c5e4c balrog
    omap_writel(0x48008300, 0x00000000);        /* CM_FCLKEN_GFX */
954 7e7c5e4c balrog
    omap_writel(0x48008310, 0x00000000);        /* CM_ICLKEN_GFX */
955 7e7c5e4c balrog
    omap_writel(0x48008340, 0x00000001);        /* CM_CLKSEL_GFX */
956 7e7c5e4c balrog
    omap_writel(0x48008400, 0x00000004);        /* CM_FCLKEN_WKUP */
957 7e7c5e4c balrog
    omap_writel(0x48008410, 0x00000004);        /* CM_ICLKEN_WKUP */
958 7e7c5e4c balrog
    omap_writel(0x48008440, 0x00000000);        /* CM_CLKSEL_WKUP */
959 7e7c5e4c balrog
    omap_writel(0x48008500, 0x000000cf);        /* CM_CLKEN_PLL */
960 7e7c5e4c balrog
    omap_writel(0x48008530, 0x0000000c);        /* CM_AUTOIDLE_PLL */
961 7e7c5e4c balrog
    omap_writel(0x48008540,                        /* CM_CLKSEL1_PLL */
962 7e7c5e4c balrog
                    (0x78 << 12) | (6 << 8));
963 7e7c5e4c balrog
    omap_writel(0x48008544, 2);                        /* CM_CLKSEL2_PLL */
964 7e7c5e4c balrog
965 7e7c5e4c balrog
    /* GPMC setup */
966 7e7c5e4c balrog
    n800_gpmc_init(s);
967 7e7c5e4c balrog
968 7e7c5e4c balrog
    /* Video setup */
969 7e7c5e4c balrog
    n800_dss_init(&s->blizzard);
970 7e7c5e4c balrog
971 7e7c5e4c balrog
    /* CPU setup */
972 7e7c5e4c balrog
    s->cpu->env->regs[15] = s->cpu->env->boot_info->loader_start;
973 7e7c5e4c balrog
    s->cpu->env->GE = 0x5;
974 0941041e balrog
975 0941041e balrog
    /* If the machine has a slided keyboard, open it */
976 0941041e balrog
    if (s->kbd)
977 0941041e balrog
        qemu_irq_raise(omap2_gpio_in_get(s->cpu->gpif, N810_SLIDE_GPIO)[0]);
978 7e7c5e4c balrog
}
979 7e7c5e4c balrog
980 7e7c5e4c balrog
#define OMAP_TAG_NOKIA_BT        0x4e01
981 7e7c5e4c balrog
#define OMAP_TAG_WLAN_CX3110X        0x4e02
982 7e7c5e4c balrog
#define OMAP_TAG_CBUS                0x4e03
983 7e7c5e4c balrog
#define OMAP_TAG_EM_ASIC_BB5        0x4e04
984 7e7c5e4c balrog
985 e927bb00 balrog
static struct omap_gpiosw_info_s {
986 e927bb00 balrog
    const char *name;
987 e927bb00 balrog
    int line;
988 e927bb00 balrog
    int type;
989 e927bb00 balrog
} n800_gpiosw_info[] = {
990 e927bb00 balrog
    {
991 e927bb00 balrog
        "bat_cover", N800_BAT_COVER_GPIO,
992 e927bb00 balrog
        OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
993 e927bb00 balrog
    }, {
994 e927bb00 balrog
        "cam_act", N800_CAM_ACT_GPIO,
995 e927bb00 balrog
        OMAP_GPIOSW_TYPE_ACTIVITY,
996 e927bb00 balrog
    }, {
997 e927bb00 balrog
        "cam_turn", N800_CAM_TURN_GPIO,
998 e927bb00 balrog
        OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_INVERTED,
999 e927bb00 balrog
    }, {
1000 e927bb00 balrog
        "headphone", N8X0_HEADPHONE_GPIO,
1001 e927bb00 balrog
        OMAP_GPIOSW_TYPE_CONNECTION | OMAP_GPIOSW_INVERTED,
1002 e927bb00 balrog
    },
1003 e927bb00 balrog
    { 0 }
1004 e927bb00 balrog
}, n810_gpiosw_info[] = {
1005 e927bb00 balrog
    {
1006 e927bb00 balrog
        "gps_reset", N810_GPS_RESET_GPIO,
1007 e927bb00 balrog
        OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_OUTPUT,
1008 e927bb00 balrog
    }, {
1009 e927bb00 balrog
        "gps_wakeup", N810_GPS_WAKEUP_GPIO,
1010 e927bb00 balrog
        OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_OUTPUT,
1011 e927bb00 balrog
    }, {
1012 e927bb00 balrog
        "headphone", N8X0_HEADPHONE_GPIO,
1013 e927bb00 balrog
        OMAP_GPIOSW_TYPE_CONNECTION | OMAP_GPIOSW_INVERTED,
1014 e927bb00 balrog
    }, {
1015 e927bb00 balrog
        "kb_lock", N810_KB_LOCK_GPIO,
1016 e927bb00 balrog
        OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
1017 e927bb00 balrog
    }, {
1018 e927bb00 balrog
        "sleepx_led", N810_SLEEPX_LED_GPIO,
1019 e927bb00 balrog
        OMAP_GPIOSW_TYPE_ACTIVITY | OMAP_GPIOSW_INVERTED | OMAP_GPIOSW_OUTPUT,
1020 e927bb00 balrog
    }, {
1021 e927bb00 balrog
        "slide", N810_SLIDE_GPIO,
1022 e927bb00 balrog
        OMAP_GPIOSW_TYPE_COVER | OMAP_GPIOSW_INVERTED,
1023 e927bb00 balrog
    },
1024 e927bb00 balrog
    { 0 }
1025 e927bb00 balrog
};
1026 e927bb00 balrog
1027 e927bb00 balrog
static struct omap_partition_info_s {
1028 e927bb00 balrog
    uint32_t offset;
1029 e927bb00 balrog
    uint32_t size;
1030 e927bb00 balrog
    int mask;
1031 e927bb00 balrog
    const char *name;
1032 e927bb00 balrog
} n800_part_info[] = {
1033 e927bb00 balrog
    { 0x00000000, 0x00020000, 0x3, "bootloader" },
1034 e927bb00 balrog
    { 0x00020000, 0x00060000, 0x0, "config" },
1035 e927bb00 balrog
    { 0x00080000, 0x00200000, 0x0, "kernel" },
1036 e927bb00 balrog
    { 0x00280000, 0x00200000, 0x3, "initfs" },
1037 e927bb00 balrog
    { 0x00480000, 0x0fb80000, 0x3, "rootfs" },
1038 e927bb00 balrog
1039 e927bb00 balrog
    { 0, 0, 0, 0 }
1040 e927bb00 balrog
}, n810_part_info[] = {
1041 e927bb00 balrog
    { 0x00000000, 0x00020000, 0x3, "bootloader" },
1042 e927bb00 balrog
    { 0x00020000, 0x00060000, 0x0, "config" },
1043 e927bb00 balrog
    { 0x00080000, 0x00220000, 0x0, "kernel" },
1044 e927bb00 balrog
    { 0x002a0000, 0x00400000, 0x0, "initfs" },
1045 e927bb00 balrog
    { 0x006a0000, 0x0f960000, 0x0, "rootfs" },
1046 e927bb00 balrog
1047 e927bb00 balrog
    { 0, 0, 0, 0 }
1048 e927bb00 balrog
};
1049 e927bb00 balrog
1050 e927bb00 balrog
static int n8x0_atag_setup(void *p, int model)
1051 7e7c5e4c balrog
{
1052 7e7c5e4c balrog
    uint8_t *b;
1053 7e7c5e4c balrog
    uint16_t *w;
1054 7e7c5e4c balrog
    uint32_t *l;
1055 e927bb00 balrog
    struct omap_gpiosw_info_s *gpiosw;
1056 e927bb00 balrog
    struct omap_partition_info_s *partition;
1057 e927bb00 balrog
    const char *tag;
1058 7e7c5e4c balrog
1059 7e7c5e4c balrog
    w = p;
1060 7e7c5e4c balrog
1061 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_UART);                /* u16 tag */
1062 7e7c5e4c balrog
    stw_raw(w ++, 4);                                /* u16 len */
1063 7e7c5e4c balrog
    stw_raw(w ++, (1 << 2) | (1 << 1) | (1 << 0)); /* uint enabled_uarts */
1064 7e7c5e4c balrog
    w ++;
1065 7e7c5e4c balrog
1066 e927bb00 balrog
#if 0
1067 e927bb00 balrog
    stw_raw(w ++, OMAP_TAG_SERIAL_CONSOLE);        /* u16 tag */
1068 7e7c5e4c balrog
    stw_raw(w ++, 4);                                /* u16 len */
1069 e927bb00 balrog
    stw_raw(w ++, XLDR_LL_UART);                /* u8 console_uart */
1070 e927bb00 balrog
    stw_raw(w ++, 115200);                        /* u32 console_speed */
1071 e927bb00 balrog
#endif
1072 e927bb00 balrog
1073 e927bb00 balrog
    stw_raw(w ++, OMAP_TAG_LCD);                /* u16 tag */
1074 e927bb00 balrog
    stw_raw(w ++, 36);                                /* u16 len */
1075 e927bb00 balrog
    strcpy((void *) w, "QEMU LCD panel");        /* char panel_name[16] */
1076 e927bb00 balrog
    w += 8;
1077 e927bb00 balrog
    strcpy((void *) w, "blizzard");                /* char ctrl_name[16] */
1078 e927bb00 balrog
    w += 8;
1079 e927bb00 balrog
    stw_raw(w ++, N810_BLIZZARD_RESET_GPIO);        /* TODO: n800 s16 nreset_gpio */
1080 e927bb00 balrog
    stw_raw(w ++, 24);                                /* u8 data_lines */
1081 7e7c5e4c balrog
1082 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_CBUS);                /* u16 tag */
1083 7e7c5e4c balrog
    stw_raw(w ++, 8);                                /* u16 len */
1084 7e7c5e4c balrog
    stw_raw(w ++, N8X0_CBUS_CLK_GPIO);                /* s16 clk_gpio */
1085 7e7c5e4c balrog
    stw_raw(w ++, N8X0_CBUS_DAT_GPIO);                /* s16 dat_gpio */
1086 7e7c5e4c balrog
    stw_raw(w ++, N8X0_CBUS_SEL_GPIO);                /* s16 sel_gpio */
1087 7e7c5e4c balrog
    w ++;
1088 7e7c5e4c balrog
1089 e927bb00 balrog
    stw_raw(w ++, OMAP_TAG_EM_ASIC_BB5);        /* u16 tag */
1090 e927bb00 balrog
    stw_raw(w ++, 4);                                /* u16 len */
1091 e927bb00 balrog
    stw_raw(w ++, N8X0_RETU_GPIO);                /* s16 retu_irq_gpio */
1092 e927bb00 balrog
    stw_raw(w ++, N8X0_TAHVO_GPIO);                /* s16 tahvo_irq_gpio */
1093 e927bb00 balrog
1094 e927bb00 balrog
    gpiosw = (model == 810) ? n810_gpiosw_info : n800_gpiosw_info;
1095 e927bb00 balrog
    for (; gpiosw->name; gpiosw ++) {
1096 e927bb00 balrog
        stw_raw(w ++, OMAP_TAG_GPIO_SWITCH);        /* u16 tag */
1097 e927bb00 balrog
        stw_raw(w ++, 20);                        /* u16 len */
1098 e927bb00 balrog
        strcpy((void *) w, gpiosw->name);        /* char name[12] */
1099 e927bb00 balrog
        w += 6;
1100 e927bb00 balrog
        stw_raw(w ++, gpiosw->line);                /* u16 gpio */
1101 e927bb00 balrog
        stw_raw(w ++, gpiosw->type);
1102 e927bb00 balrog
        stw_raw(w ++, 0);
1103 e927bb00 balrog
        stw_raw(w ++, 0);
1104 e927bb00 balrog
    }
1105 7e7c5e4c balrog
1106 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_NOKIA_BT);                /* u16 tag */
1107 7e7c5e4c balrog
    stw_raw(w ++, 12);                                /* u16 len */
1108 7e7c5e4c balrog
    b = (void *) w;
1109 7e7c5e4c balrog
    stb_raw(b ++, 0x01);                        /* u8 chip_type        (CSR) */
1110 e927bb00 balrog
    stb_raw(b ++, N8X0_BT_WKUP_GPIO);                /* u8 bt_wakeup_gpio */
1111 7e7c5e4c balrog
    stb_raw(b ++, N8X0_BT_HOST_WKUP_GPIO);        /* u8 host_wakeup_gpio */
1112 e927bb00 balrog
    stb_raw(b ++, N8X0_BT_RESET_GPIO);                /* u8 reset_gpio */
1113 7e7c5e4c balrog
    stb_raw(b ++, 1);                                /* u8 bt_uart */
1114 7e7c5e4c balrog
    memset(b, 0, 6);                                /* u8 bd_addr[6] */
1115 7e7c5e4c balrog
    b += 6;
1116 7e7c5e4c balrog
    stb_raw(b ++, 0x02);                        /* u8 bt_sysclk (38.4) */
1117 7e7c5e4c balrog
    w = (void *) b;
1118 7e7c5e4c balrog
1119 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_WLAN_CX3110X);        /* u16 tag */
1120 7e7c5e4c balrog
    stw_raw(w ++, 8);                                /* u16 len */
1121 7e7c5e4c balrog
    stw_raw(w ++, 0x25);                        /* u8 chip_type */
1122 e927bb00 balrog
    stw_raw(w ++, N8X0_WLAN_PWR_GPIO);                /* s16 power_gpio */
1123 e927bb00 balrog
    stw_raw(w ++, N8X0_WLAN_IRQ_GPIO);                /* s16 irq_gpio */
1124 7e7c5e4c balrog
    stw_raw(w ++, -1);                                /* s16 spi_cs_gpio */
1125 7e7c5e4c balrog
1126 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_MMC);                /* u16 tag */
1127 7e7c5e4c balrog
    stw_raw(w ++, 16);                                /* u16 len */
1128 e927bb00 balrog
    if (model == 810) {
1129 e927bb00 balrog
        stw_raw(w ++, 0x23f);                        /* unsigned flags */
1130 e927bb00 balrog
        stw_raw(w ++, -1);                        /* s16 power_pin */
1131 e927bb00 balrog
        stw_raw(w ++, -1);                        /* s16 switch_pin */
1132 e927bb00 balrog
        stw_raw(w ++, -1);                        /* s16 wp_pin */
1133 e927bb00 balrog
        stw_raw(w ++, 0x240);                        /* unsigned flags */
1134 e927bb00 balrog
        stw_raw(w ++, 0xc000);                        /* s16 power_pin */
1135 e927bb00 balrog
        stw_raw(w ++, 0x0248);                        /* s16 switch_pin */
1136 e927bb00 balrog
        stw_raw(w ++, 0xc000);                        /* s16 wp_pin */
1137 e927bb00 balrog
    } else {
1138 e927bb00 balrog
        stw_raw(w ++, 0xf);                        /* unsigned flags */
1139 e927bb00 balrog
        stw_raw(w ++, -1);                        /* s16 power_pin */
1140 e927bb00 balrog
        stw_raw(w ++, -1);                        /* s16 switch_pin */
1141 e927bb00 balrog
        stw_raw(w ++, -1);                        /* s16 wp_pin */
1142 e927bb00 balrog
        stw_raw(w ++, 0);                        /* unsigned flags */
1143 e927bb00 balrog
        stw_raw(w ++, 0);                        /* s16 power_pin */
1144 e927bb00 balrog
        stw_raw(w ++, 0);                        /* s16 switch_pin */
1145 e927bb00 balrog
        stw_raw(w ++, 0);                        /* s16 wp_pin */
1146 e927bb00 balrog
    }
1147 7e7c5e4c balrog
1148 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_TEA5761);                /* u16 tag */
1149 7e7c5e4c balrog
    stw_raw(w ++, 4);                                /* u16 len */
1150 e927bb00 balrog
    stw_raw(w ++, N8X0_TEA5761_CS_GPIO);        /* u16 enable_gpio */
1151 7e7c5e4c balrog
    w ++;
1152 7e7c5e4c balrog
1153 e927bb00 balrog
    partition = (model == 810) ? n810_part_info : n800_part_info;
1154 e927bb00 balrog
    for (; partition->name; partition ++) {
1155 e927bb00 balrog
        stw_raw(w ++, OMAP_TAG_PARTITION);        /* u16 tag */
1156 e927bb00 balrog
        stw_raw(w ++, 28);                        /* u16 len */
1157 e927bb00 balrog
        strcpy((void *) w, partition->name);        /* char name[16] */
1158 e927bb00 balrog
        l = (void *) (w + 8);
1159 e927bb00 balrog
        stl_raw(l ++, partition->size);                /* unsigned int size */
1160 e927bb00 balrog
        stl_raw(l ++, partition->offset);        /* unsigned int offset */
1161 e927bb00 balrog
        stl_raw(l ++, partition->mask);                /* unsigned int mask_flags */
1162 e927bb00 balrog
        w = (void *) l;
1163 e927bb00 balrog
    }
1164 7e7c5e4c balrog
1165 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_BOOT_REASON);        /* u16 tag */
1166 7e7c5e4c balrog
    stw_raw(w ++, 12);                                /* u16 len */
1167 7e7c5e4c balrog
#if 0
1168 7e7c5e4c balrog
    strcpy((void *) w, "por");                        /* char reason_str[12] */
1169 7e7c5e4c balrog
    strcpy((void *) w, "charger");                /* char reason_str[12] */
1170 7e7c5e4c balrog
    strcpy((void *) w, "32wd_to");                /* char reason_str[12] */
1171 7e7c5e4c balrog
    strcpy((void *) w, "sw_rst");                /* char reason_str[12] */
1172 7e7c5e4c balrog
    strcpy((void *) w, "mbus");                        /* char reason_str[12] */
1173 7e7c5e4c balrog
    strcpy((void *) w, "unknown");                /* char reason_str[12] */
1174 7e7c5e4c balrog
    strcpy((void *) w, "swdg_to");                /* char reason_str[12] */
1175 7e7c5e4c balrog
    strcpy((void *) w, "sec_vio");                /* char reason_str[12] */
1176 7e7c5e4c balrog
    strcpy((void *) w, "pwr_key");                /* char reason_str[12] */
1177 7e7c5e4c balrog
    strcpy((void *) w, "rtc_alarm");                /* char reason_str[12] */
1178 7e7c5e4c balrog
#else
1179 7e7c5e4c balrog
    strcpy((void *) w, "pwr_key");                /* char reason_str[12] */
1180 7e7c5e4c balrog
#endif
1181 7e7c5e4c balrog
    w += 6;
1182 7e7c5e4c balrog
1183 e927bb00 balrog
    tag = (model == 810) ? "RX-44" : "RX-34";
1184 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_VERSION_STR);        /* u16 tag */
1185 7e7c5e4c balrog
    stw_raw(w ++, 24);                                /* u16 len */
1186 7e7c5e4c balrog
    strcpy((void *) w, "product");                /* char component[12] */
1187 7e7c5e4c balrog
    w += 6;
1188 e927bb00 balrog
    strcpy((void *) w, tag);                        /* char version[12] */
1189 7e7c5e4c balrog
    w += 6;
1190 7e7c5e4c balrog
1191 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_VERSION_STR);        /* u16 tag */
1192 7e7c5e4c balrog
    stw_raw(w ++, 24);                                /* u16 len */
1193 7e7c5e4c balrog
    strcpy((void *) w, "hw-build");                /* char component[12] */
1194 7e7c5e4c balrog
    w += 6;
1195 e927bb00 balrog
    strcpy((void *) w, "QEMU " QEMU_VERSION);        /* char version[12] */
1196 7e7c5e4c balrog
    w += 6;
1197 7e7c5e4c balrog
1198 e927bb00 balrog
    tag = (model == 810) ? "1.1.10-qemu" : "1.1.6-qemu";
1199 7e7c5e4c balrog
    stw_raw(w ++, OMAP_TAG_VERSION_STR);        /* u16 tag */
1200 7e7c5e4c balrog
    stw_raw(w ++, 24);                                /* u16 len */
1201 7e7c5e4c balrog
    strcpy((void *) w, "nolo");                        /* char component[12] */
1202 7e7c5e4c balrog
    w += 6;
1203 e927bb00 balrog
    strcpy((void *) w, tag);                        /* char version[12] */
1204 7e7c5e4c balrog
    w += 6;
1205 7e7c5e4c balrog
1206 7e7c5e4c balrog
    return (void *) w - p;
1207 7e7c5e4c balrog
}
1208 7e7c5e4c balrog
1209 e927bb00 balrog
static int n800_atag_setup(struct arm_boot_info *info, void *p)
1210 e927bb00 balrog
{
1211 e927bb00 balrog
    return n8x0_atag_setup(p, 800);
1212 e927bb00 balrog
}
1213 7e7c5e4c balrog
1214 e927bb00 balrog
static int n810_atag_setup(struct arm_boot_info *info, void *p)
1215 e927bb00 balrog
{
1216 e927bb00 balrog
    return n8x0_atag_setup(p, 810);
1217 e927bb00 balrog
}
1218 e927bb00 balrog
1219 e927bb00 balrog
static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
1220 e927bb00 balrog
                DisplayState *ds, const char *kernel_filename,
1221 e927bb00 balrog
                const char *kernel_cmdline, const char *initrd_filename,
1222 e927bb00 balrog
                const char *cpu_model, struct arm_boot_info *binfo, int model)
1223 7e7c5e4c balrog
{
1224 7e7c5e4c balrog
    struct n800_s *s = (struct n800_s *) qemu_mallocz(sizeof(*s));
1225 e927bb00 balrog
    int sdram_size = binfo->ram_size;
1226 7e7c5e4c balrog
    int onenandram_size = 0x00010000;
1227 7e7c5e4c balrog
1228 7e7c5e4c balrog
    if (ram_size < sdram_size + onenandram_size + OMAP242X_SRAM_SIZE) {
1229 7e7c5e4c balrog
        fprintf(stderr, "This architecture uses %i bytes of memory\n",
1230 7e7c5e4c balrog
                        sdram_size + onenandram_size + OMAP242X_SRAM_SIZE);
1231 7e7c5e4c balrog
        exit(1);
1232 7e7c5e4c balrog
    }
1233 7e7c5e4c balrog
1234 7e7c5e4c balrog
    s->cpu = omap2420_mpu_init(sdram_size, NULL, cpu_model);
1235 7e7c5e4c balrog
1236 0941041e balrog
    /* Setup peripherals
1237 0941041e balrog
     *
1238 0941041e balrog
     * Believed external peripherals layout in the N810:
1239 0941041e balrog
     * (spi bus 1)
1240 0941041e balrog
     *   tsc2005
1241 0941041e balrog
     *   lcd_mipid
1242 0941041e balrog
     * (spi bus 2)
1243 0941041e balrog
     *   Conexant cx3110x (WLAN)
1244 0941041e balrog
     *   optional: pc2400m (WiMAX)
1245 0941041e balrog
     * (i2c bus 0)
1246 0941041e balrog
     *   TLV320AIC33 (audio codec)
1247 0941041e balrog
     *   TCM825x (camera by Toshiba)
1248 0941041e balrog
     *   lp5521 (clever LEDs)
1249 0941041e balrog
     *   tsl2563 (light sensor, hwmon, model 7, rev. 0)
1250 0941041e balrog
     *   lm8323 (keypad, manf 00, rev 04)
1251 0941041e balrog
     * (i2c bus 1)
1252 0941041e balrog
     *   tmp105 (temperature sensor, hwmon)
1253 0941041e balrog
     *   menelaus (pm)
1254 d238db7f balrog
     * (somewhere on i2c - maybe N800-only)
1255 d238db7f balrog
     *   tea5761 (FM tuner)
1256 d238db7f balrog
     * (serial 0)
1257 d238db7f balrog
     *   GPS
1258 d238db7f balrog
     * (some serial port)
1259 d238db7f balrog
     *   csr41814 (Bluetooth)
1260 0941041e balrog
     */
1261 e927bb00 balrog
    n8x0_gpio_setup(s);
1262 7e7c5e4c balrog
    n8x0_nand_setup(s);
1263 e927bb00 balrog
    n8x0_i2c_setup(s);
1264 e927bb00 balrog
    if (model == 800)
1265 e927bb00 balrog
        n800_tsc_kbd_setup(s);
1266 1d4e547b balrog
    else if (model == 810) {
1267 e927bb00 balrog
        n810_tsc_setup(s);
1268 1d4e547b balrog
        n810_kbd_setup(s);
1269 1d4e547b balrog
    }
1270 e927bb00 balrog
    n8x0_spi_setup(s);
1271 e927bb00 balrog
    n8x0_dss_setup(s, ds);
1272 e927bb00 balrog
    n8x0_cbus_setup(s);
1273 942ac052 balrog
    if (usb_enabled)
1274 e927bb00 balrog
        n8x0_usb_setup(s);
1275 7e7c5e4c balrog
1276 7e7c5e4c balrog
    /* Setup initial (reset) machine state */
1277 7e7c5e4c balrog
1278 7e7c5e4c balrog
    /* Start at the OneNAND bootloader.  */
1279 7e7c5e4c balrog
    s->cpu->env->regs[15] = 0;
1280 7e7c5e4c balrog
1281 7e7c5e4c balrog
    if (kernel_filename) {
1282 7e7c5e4c balrog
        /* Or at the linux loader.  */
1283 e927bb00 balrog
        binfo->kernel_filename = kernel_filename;
1284 e927bb00 balrog
        binfo->kernel_cmdline = kernel_cmdline;
1285 e927bb00 balrog
        binfo->initrd_filename = initrd_filename;
1286 e927bb00 balrog
        arm_load_kernel(s->cpu->env, binfo);
1287 7e7c5e4c balrog
1288 e927bb00 balrog
        qemu_register_reset(n8x0_boot_init, s);
1289 e927bb00 balrog
        n8x0_boot_init(s);
1290 7e7c5e4c balrog
    }
1291 7e7c5e4c balrog
1292 d238db7f balrog
    if (option_rom[0] && (boot_device[0] == 'n' || !kernel_filename)) {
1293 d238db7f balrog
        /* No, wait, better start at the ROM.  */
1294 d238db7f balrog
        s->cpu->env->regs[15] = OMAP2_Q2_BASE + 0x400000;
1295 d238db7f balrog
1296 d238db7f balrog
        /* This is intended for loading the `secondary.bin' program from
1297 d238db7f balrog
         * Nokia images (the NOLO bootloader).  The entry point seems
1298 d238db7f balrog
         * to be at OMAP2_Q2_BASE + 0x400000.
1299 d238db7f balrog
         *
1300 d238db7f balrog
         * The `2nd.bin' files contain some kind of earlier boot code and
1301 d238db7f balrog
         * for them the entry point needs to be set to OMAP2_SRAM_BASE.
1302 d238db7f balrog
         *
1303 d238db7f balrog
         * The code above is for loading the `zImage' file from Nokia
1304 d238db7f balrog
         * images.  */
1305 d238db7f balrog
        printf("%i bytes of image loaded\n", load_image(option_rom[0],
1306 d238db7f balrog
                                phys_ram_base + 0x400000));
1307 d238db7f balrog
1308 d238db7f balrog
        n800_setup_nolo_tags(phys_ram_base + sdram_size);
1309 d238db7f balrog
    }
1310 c60e08d9 pbrook
    /* FIXME: We shouldn't really be doing this here.  The LCD controller
1311 c60e08d9 pbrook
       will set the size once configured, so this just sets an initial
1312 c60e08d9 pbrook
       size until the guest activates the display.  */
1313 7e7c5e4c balrog
    dpy_resize(ds, 800, 480);
1314 7e7c5e4c balrog
}
1315 7e7c5e4c balrog
1316 e927bb00 balrog
static struct arm_boot_info n800_binfo = {
1317 e927bb00 balrog
    .loader_start = OMAP2_Q2_BASE,
1318 e927bb00 balrog
    /* Actually two chips of 0x4000000 bytes each */
1319 e927bb00 balrog
    .ram_size = 0x08000000,
1320 e927bb00 balrog
    .board_id = 0x4f7,
1321 e927bb00 balrog
    .atag_board = n800_atag_setup,
1322 e927bb00 balrog
};
1323 e927bb00 balrog
1324 e927bb00 balrog
static struct arm_boot_info n810_binfo = {
1325 e927bb00 balrog
    .loader_start = OMAP2_Q2_BASE,
1326 e927bb00 balrog
    /* Actually two chips of 0x4000000 bytes each */
1327 e927bb00 balrog
    .ram_size = 0x08000000,
1328 e927bb00 balrog
    /* 0x60c and 0x6bf (WiMAX Edition) have been assigned but are not
1329 e927bb00 balrog
     * used by some older versions of the bootloader and 5555 is used
1330 e927bb00 balrog
     * instead (including versions that shipped with many devices).  */
1331 e927bb00 balrog
    .board_id = 0x60c,
1332 e927bb00 balrog
    .atag_board = n810_atag_setup,
1333 e927bb00 balrog
};
1334 e927bb00 balrog
1335 e927bb00 balrog
static void n800_init(ram_addr_t ram_size, int vga_ram_size,
1336 e927bb00 balrog
                const char *boot_device, DisplayState *ds,
1337 e927bb00 balrog
                const char *kernel_filename, const char *kernel_cmdline,
1338 e927bb00 balrog
                const char *initrd_filename, const char *cpu_model)
1339 e927bb00 balrog
{
1340 e927bb00 balrog
    return n8x0_init(ram_size, boot_device, ds,
1341 e927bb00 balrog
                    kernel_filename, kernel_cmdline, initrd_filename,
1342 e927bb00 balrog
                    cpu_model, &n800_binfo, 800);
1343 e927bb00 balrog
}
1344 e927bb00 balrog
1345 e927bb00 balrog
static void n810_init(ram_addr_t ram_size, int vga_ram_size,
1346 e927bb00 balrog
                const char *boot_device, DisplayState *ds,
1347 e927bb00 balrog
                const char *kernel_filename, const char *kernel_cmdline,
1348 e927bb00 balrog
                const char *initrd_filename, const char *cpu_model)
1349 e927bb00 balrog
{
1350 e927bb00 balrog
    return n8x0_init(ram_size, boot_device, ds,
1351 e927bb00 balrog
                    kernel_filename, kernel_cmdline, initrd_filename,
1352 e927bb00 balrog
                    cpu_model, &n810_binfo, 810);
1353 e927bb00 balrog
}
1354 e927bb00 balrog
1355 7e7c5e4c balrog
QEMUMachine n800_machine = {
1356 7e7c5e4c balrog
    "n800",
1357 e927bb00 balrog
    "Nokia N800 tablet aka. RX-34 (OMAP2420)",
1358 7e7c5e4c balrog
    n800_init,
1359 7fb4fdcf balrog
    (0x08000000 + 0x00010000 + OMAP242X_SRAM_SIZE) | RAMSIZE_FIXED,
1360 7e7c5e4c balrog
};
1361 e927bb00 balrog
1362 e927bb00 balrog
QEMUMachine n810_machine = {
1363 e927bb00 balrog
    "n810",
1364 e927bb00 balrog
    "Nokia N810 tablet aka. RX-44 (OMAP2420)",
1365 e927bb00 balrog
    n810_init,
1366 069de562 balrog
    (0x08000000 + 0x00010000 + OMAP242X_SRAM_SIZE) | RAMSIZE_FIXED,
1367 e927bb00 balrog
};