Statistics
| Branch: | Revision:

root / hw / nseries.c @ e9396bde

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

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