]> git.proxmox.com Git - qemu.git/blob - hw/stellaris.c
Check NIC model in some NIC init functions (Mark McLoughlin)
[qemu.git] / hw / stellaris.c
1 /*
2 * Luminary Micro Stellaris peripherals
3 *
4 * Copyright (c) 2006 CodeSourcery.
5 * Written by Paul Brook
6 *
7 * This code is licenced under the GPL.
8 */
9
10 #include "hw.h"
11 #include "arm-misc.h"
12 #include "primecell.h"
13 #include "devices.h"
14 #include "qemu-timer.h"
15 #include "i2c.h"
16 #include "net.h"
17 #include "sd.h"
18 #include "sysemu.h"
19 #include "boards.h"
20
21 #define GPIO_A 0
22 #define GPIO_B 1
23 #define GPIO_C 2
24 #define GPIO_D 3
25 #define GPIO_E 4
26 #define GPIO_F 5
27 #define GPIO_G 6
28
29 #define BP_OLED_I2C 0x01
30 #define BP_OLED_SSI 0x02
31 #define BP_GAMEPAD 0x04
32
33 typedef const struct {
34 const char *name;
35 uint32_t did0;
36 uint32_t did1;
37 uint32_t dc0;
38 uint32_t dc1;
39 uint32_t dc2;
40 uint32_t dc3;
41 uint32_t dc4;
42 uint32_t peripherals;
43 } stellaris_board_info;
44
45 /* General purpose timer module. */
46
47 typedef struct gptm_state {
48 uint32_t config;
49 uint32_t mode[2];
50 uint32_t control;
51 uint32_t state;
52 uint32_t mask;
53 uint32_t load[2];
54 uint32_t match[2];
55 uint32_t prescale[2];
56 uint32_t match_prescale[2];
57 uint32_t rtc;
58 int64_t tick[2];
59 struct gptm_state *opaque[2];
60 QEMUTimer *timer[2];
61 /* The timers have an alternate output used to trigger the ADC. */
62 qemu_irq trigger;
63 qemu_irq irq;
64 } gptm_state;
65
66 static void gptm_update_irq(gptm_state *s)
67 {
68 int level;
69 level = (s->state & s->mask) != 0;
70 qemu_set_irq(s->irq, level);
71 }
72
73 static void gptm_stop(gptm_state *s, int n)
74 {
75 qemu_del_timer(s->timer[n]);
76 }
77
78 static void gptm_reload(gptm_state *s, int n, int reset)
79 {
80 int64_t tick;
81 if (reset)
82 tick = qemu_get_clock(vm_clock);
83 else
84 tick = s->tick[n];
85
86 if (s->config == 0) {
87 /* 32-bit CountDown. */
88 uint32_t count;
89 count = s->load[0] | (s->load[1] << 16);
90 tick += (int64_t)count * system_clock_scale;
91 } else if (s->config == 1) {
92 /* 32-bit RTC. 1Hz tick. */
93 tick += ticks_per_sec;
94 } else if (s->mode[n] == 0xa) {
95 /* PWM mode. Not implemented. */
96 } else {
97 cpu_abort(cpu_single_env, "TODO: 16-bit timer mode 0x%x\n",
98 s->mode[n]);
99 }
100 s->tick[n] = tick;
101 qemu_mod_timer(s->timer[n], tick);
102 }
103
104 static void gptm_tick(void *opaque)
105 {
106 gptm_state **p = (gptm_state **)opaque;
107 gptm_state *s;
108 int n;
109
110 s = *p;
111 n = p - s->opaque;
112 if (s->config == 0) {
113 s->state |= 1;
114 if ((s->control & 0x20)) {
115 /* Output trigger. */
116 qemu_irq_raise(s->trigger);
117 qemu_irq_lower(s->trigger);
118 }
119 if (s->mode[0] & 1) {
120 /* One-shot. */
121 s->control &= ~1;
122 } else {
123 /* Periodic. */
124 gptm_reload(s, 0, 0);
125 }
126 } else if (s->config == 1) {
127 /* RTC. */
128 uint32_t match;
129 s->rtc++;
130 match = s->match[0] | (s->match[1] << 16);
131 if (s->rtc > match)
132 s->rtc = 0;
133 if (s->rtc == 0) {
134 s->state |= 8;
135 }
136 gptm_reload(s, 0, 0);
137 } else if (s->mode[n] == 0xa) {
138 /* PWM mode. Not implemented. */
139 } else {
140 cpu_abort(cpu_single_env, "TODO: 16-bit timer mode 0x%x\n",
141 s->mode[n]);
142 }
143 gptm_update_irq(s);
144 }
145
146 static uint32_t gptm_read(void *opaque, target_phys_addr_t offset)
147 {
148 gptm_state *s = (gptm_state *)opaque;
149
150 switch (offset) {
151 case 0x00: /* CFG */
152 return s->config;
153 case 0x04: /* TAMR */
154 return s->mode[0];
155 case 0x08: /* TBMR */
156 return s->mode[1];
157 case 0x0c: /* CTL */
158 return s->control;
159 case 0x18: /* IMR */
160 return s->mask;
161 case 0x1c: /* RIS */
162 return s->state;
163 case 0x20: /* MIS */
164 return s->state & s->mask;
165 case 0x24: /* CR */
166 return 0;
167 case 0x28: /* TAILR */
168 return s->load[0] | ((s->config < 4) ? (s->load[1] << 16) : 0);
169 case 0x2c: /* TBILR */
170 return s->load[1];
171 case 0x30: /* TAMARCHR */
172 return s->match[0] | ((s->config < 4) ? (s->match[1] << 16) : 0);
173 case 0x34: /* TBMATCHR */
174 return s->match[1];
175 case 0x38: /* TAPR */
176 return s->prescale[0];
177 case 0x3c: /* TBPR */
178 return s->prescale[1];
179 case 0x40: /* TAPMR */
180 return s->match_prescale[0];
181 case 0x44: /* TBPMR */
182 return s->match_prescale[1];
183 case 0x48: /* TAR */
184 if (s->control == 1)
185 return s->rtc;
186 case 0x4c: /* TBR */
187 cpu_abort(cpu_single_env, "TODO: Timer value read\n");
188 default:
189 cpu_abort(cpu_single_env, "gptm_read: Bad offset 0x%x\n", (int)offset);
190 return 0;
191 }
192 }
193
194 static void gptm_write(void *opaque, target_phys_addr_t offset, uint32_t value)
195 {
196 gptm_state *s = (gptm_state *)opaque;
197 uint32_t oldval;
198
199 /* The timers should be disabled before changing the configuration.
200 We take advantage of this and defer everything until the timer
201 is enabled. */
202 switch (offset) {
203 case 0x00: /* CFG */
204 s->config = value;
205 break;
206 case 0x04: /* TAMR */
207 s->mode[0] = value;
208 break;
209 case 0x08: /* TBMR */
210 s->mode[1] = value;
211 break;
212 case 0x0c: /* CTL */
213 oldval = s->control;
214 s->control = value;
215 /* TODO: Implement pause. */
216 if ((oldval ^ value) & 1) {
217 if (value & 1) {
218 gptm_reload(s, 0, 1);
219 } else {
220 gptm_stop(s, 0);
221 }
222 }
223 if (((oldval ^ value) & 0x100) && s->config >= 4) {
224 if (value & 0x100) {
225 gptm_reload(s, 1, 1);
226 } else {
227 gptm_stop(s, 1);
228 }
229 }
230 break;
231 case 0x18: /* IMR */
232 s->mask = value & 0x77;
233 gptm_update_irq(s);
234 break;
235 case 0x24: /* CR */
236 s->state &= ~value;
237 break;
238 case 0x28: /* TAILR */
239 s->load[0] = value & 0xffff;
240 if (s->config < 4) {
241 s->load[1] = value >> 16;
242 }
243 break;
244 case 0x2c: /* TBILR */
245 s->load[1] = value & 0xffff;
246 break;
247 case 0x30: /* TAMARCHR */
248 s->match[0] = value & 0xffff;
249 if (s->config < 4) {
250 s->match[1] = value >> 16;
251 }
252 break;
253 case 0x34: /* TBMATCHR */
254 s->match[1] = value >> 16;
255 break;
256 case 0x38: /* TAPR */
257 s->prescale[0] = value;
258 break;
259 case 0x3c: /* TBPR */
260 s->prescale[1] = value;
261 break;
262 case 0x40: /* TAPMR */
263 s->match_prescale[0] = value;
264 break;
265 case 0x44: /* TBPMR */
266 s->match_prescale[0] = value;
267 break;
268 default:
269 cpu_abort(cpu_single_env, "gptm_write: Bad offset 0x%x\n", (int)offset);
270 }
271 gptm_update_irq(s);
272 }
273
274 static CPUReadMemoryFunc *gptm_readfn[] = {
275 gptm_read,
276 gptm_read,
277 gptm_read
278 };
279
280 static CPUWriteMemoryFunc *gptm_writefn[] = {
281 gptm_write,
282 gptm_write,
283 gptm_write
284 };
285
286 static void gptm_save(QEMUFile *f, void *opaque)
287 {
288 gptm_state *s = (gptm_state *)opaque;
289
290 qemu_put_be32(f, s->config);
291 qemu_put_be32(f, s->mode[0]);
292 qemu_put_be32(f, s->mode[1]);
293 qemu_put_be32(f, s->control);
294 qemu_put_be32(f, s->state);
295 qemu_put_be32(f, s->mask);
296 qemu_put_be32(f, s->mode[0]);
297 qemu_put_be32(f, s->mode[0]);
298 qemu_put_be32(f, s->load[0]);
299 qemu_put_be32(f, s->load[1]);
300 qemu_put_be32(f, s->match[0]);
301 qemu_put_be32(f, s->match[1]);
302 qemu_put_be32(f, s->prescale[0]);
303 qemu_put_be32(f, s->prescale[1]);
304 qemu_put_be32(f, s->match_prescale[0]);
305 qemu_put_be32(f, s->match_prescale[1]);
306 qemu_put_be32(f, s->rtc);
307 qemu_put_be64(f, s->tick[0]);
308 qemu_put_be64(f, s->tick[1]);
309 qemu_put_timer(f, s->timer[0]);
310 qemu_put_timer(f, s->timer[1]);
311 }
312
313 static int gptm_load(QEMUFile *f, void *opaque, int version_id)
314 {
315 gptm_state *s = (gptm_state *)opaque;
316
317 if (version_id != 1)
318 return -EINVAL;
319
320 s->config = qemu_get_be32(f);
321 s->mode[0] = qemu_get_be32(f);
322 s->mode[1] = qemu_get_be32(f);
323 s->control = qemu_get_be32(f);
324 s->state = qemu_get_be32(f);
325 s->mask = qemu_get_be32(f);
326 s->mode[0] = qemu_get_be32(f);
327 s->mode[0] = qemu_get_be32(f);
328 s->load[0] = qemu_get_be32(f);
329 s->load[1] = qemu_get_be32(f);
330 s->match[0] = qemu_get_be32(f);
331 s->match[1] = qemu_get_be32(f);
332 s->prescale[0] = qemu_get_be32(f);
333 s->prescale[1] = qemu_get_be32(f);
334 s->match_prescale[0] = qemu_get_be32(f);
335 s->match_prescale[1] = qemu_get_be32(f);
336 s->rtc = qemu_get_be32(f);
337 s->tick[0] = qemu_get_be64(f);
338 s->tick[1] = qemu_get_be64(f);
339 qemu_get_timer(f, s->timer[0]);
340 qemu_get_timer(f, s->timer[1]);
341
342 return 0;
343 }
344
345 static void stellaris_gptm_init(uint32_t base, qemu_irq irq, qemu_irq trigger)
346 {
347 int iomemtype;
348 gptm_state *s;
349
350 s = (gptm_state *)qemu_mallocz(sizeof(gptm_state));
351 s->irq = irq;
352 s->trigger = trigger;
353 s->opaque[0] = s->opaque[1] = s;
354
355 iomemtype = cpu_register_io_memory(0, gptm_readfn,
356 gptm_writefn, s);
357 cpu_register_physical_memory(base, 0x00001000, iomemtype);
358 s->timer[0] = qemu_new_timer(vm_clock, gptm_tick, &s->opaque[0]);
359 s->timer[1] = qemu_new_timer(vm_clock, gptm_tick, &s->opaque[1]);
360 register_savevm("stellaris_gptm", -1, 1, gptm_save, gptm_load, s);
361 }
362
363
364 /* System controller. */
365
366 typedef struct {
367 uint32_t pborctl;
368 uint32_t ldopctl;
369 uint32_t int_status;
370 uint32_t int_mask;
371 uint32_t resc;
372 uint32_t rcc;
373 uint32_t rcgc[3];
374 uint32_t scgc[3];
375 uint32_t dcgc[3];
376 uint32_t clkvclr;
377 uint32_t ldoarst;
378 uint32_t user0;
379 uint32_t user1;
380 qemu_irq irq;
381 stellaris_board_info *board;
382 } ssys_state;
383
384 static void ssys_update(ssys_state *s)
385 {
386 qemu_set_irq(s->irq, (s->int_status & s->int_mask) != 0);
387 }
388
389 static uint32_t pllcfg_sandstorm[16] = {
390 0x31c0, /* 1 Mhz */
391 0x1ae0, /* 1.8432 Mhz */
392 0x18c0, /* 2 Mhz */
393 0xd573, /* 2.4576 Mhz */
394 0x37a6, /* 3.57954 Mhz */
395 0x1ae2, /* 3.6864 Mhz */
396 0x0c40, /* 4 Mhz */
397 0x98bc, /* 4.906 Mhz */
398 0x935b, /* 4.9152 Mhz */
399 0x09c0, /* 5 Mhz */
400 0x4dee, /* 5.12 Mhz */
401 0x0c41, /* 6 Mhz */
402 0x75db, /* 6.144 Mhz */
403 0x1ae6, /* 7.3728 Mhz */
404 0x0600, /* 8 Mhz */
405 0x585b /* 8.192 Mhz */
406 };
407
408 static uint32_t pllcfg_fury[16] = {
409 0x3200, /* 1 Mhz */
410 0x1b20, /* 1.8432 Mhz */
411 0x1900, /* 2 Mhz */
412 0xf42b, /* 2.4576 Mhz */
413 0x37e3, /* 3.57954 Mhz */
414 0x1b21, /* 3.6864 Mhz */
415 0x0c80, /* 4 Mhz */
416 0x98ee, /* 4.906 Mhz */
417 0xd5b4, /* 4.9152 Mhz */
418 0x0a00, /* 5 Mhz */
419 0x4e27, /* 5.12 Mhz */
420 0x1902, /* 6 Mhz */
421 0xec1c, /* 6.144 Mhz */
422 0x1b23, /* 7.3728 Mhz */
423 0x0640, /* 8 Mhz */
424 0xb11c /* 8.192 Mhz */
425 };
426
427 static uint32_t ssys_read(void *opaque, target_phys_addr_t offset)
428 {
429 ssys_state *s = (ssys_state *)opaque;
430
431 switch (offset) {
432 case 0x000: /* DID0 */
433 return s->board->did0;
434 case 0x004: /* DID1 */
435 return s->board->did1;
436 case 0x008: /* DC0 */
437 return s->board->dc0;
438 case 0x010: /* DC1 */
439 return s->board->dc1;
440 case 0x014: /* DC2 */
441 return s->board->dc2;
442 case 0x018: /* DC3 */
443 return s->board->dc3;
444 case 0x01c: /* DC4 */
445 return s->board->dc4;
446 case 0x030: /* PBORCTL */
447 return s->pborctl;
448 case 0x034: /* LDOPCTL */
449 return s->ldopctl;
450 case 0x040: /* SRCR0 */
451 return 0;
452 case 0x044: /* SRCR1 */
453 return 0;
454 case 0x048: /* SRCR2 */
455 return 0;
456 case 0x050: /* RIS */
457 return s->int_status;
458 case 0x054: /* IMC */
459 return s->int_mask;
460 case 0x058: /* MISC */
461 return s->int_status & s->int_mask;
462 case 0x05c: /* RESC */
463 return s->resc;
464 case 0x060: /* RCC */
465 return s->rcc;
466 case 0x064: /* PLLCFG */
467 {
468 int xtal;
469 xtal = (s->rcc >> 6) & 0xf;
470 if (s->board->did0 & (1 << 16)) {
471 return pllcfg_fury[xtal];
472 } else {
473 return pllcfg_sandstorm[xtal];
474 }
475 }
476 case 0x100: /* RCGC0 */
477 return s->rcgc[0];
478 case 0x104: /* RCGC1 */
479 return s->rcgc[1];
480 case 0x108: /* RCGC2 */
481 return s->rcgc[2];
482 case 0x110: /* SCGC0 */
483 return s->scgc[0];
484 case 0x114: /* SCGC1 */
485 return s->scgc[1];
486 case 0x118: /* SCGC2 */
487 return s->scgc[2];
488 case 0x120: /* DCGC0 */
489 return s->dcgc[0];
490 case 0x124: /* DCGC1 */
491 return s->dcgc[1];
492 case 0x128: /* DCGC2 */
493 return s->dcgc[2];
494 case 0x150: /* CLKVCLR */
495 return s->clkvclr;
496 case 0x160: /* LDOARST */
497 return s->ldoarst;
498 case 0x1e0: /* USER0 */
499 return s->user0;
500 case 0x1e4: /* USER1 */
501 return s->user1;
502 default:
503 cpu_abort(cpu_single_env, "ssys_read: Bad offset 0x%x\n", (int)offset);
504 return 0;
505 }
506 }
507
508 static void ssys_calculate_system_clock(ssys_state *s)
509 {
510 system_clock_scale = 5 * (((s->rcc >> 23) & 0xf) + 1);
511 }
512
513 static void ssys_write(void *opaque, target_phys_addr_t offset, uint32_t value)
514 {
515 ssys_state *s = (ssys_state *)opaque;
516
517 switch (offset) {
518 case 0x030: /* PBORCTL */
519 s->pborctl = value & 0xffff;
520 break;
521 case 0x034: /* LDOPCTL */
522 s->ldopctl = value & 0x1f;
523 break;
524 case 0x040: /* SRCR0 */
525 case 0x044: /* SRCR1 */
526 case 0x048: /* SRCR2 */
527 fprintf(stderr, "Peripheral reset not implemented\n");
528 break;
529 case 0x054: /* IMC */
530 s->int_mask = value & 0x7f;
531 break;
532 case 0x058: /* MISC */
533 s->int_status &= ~value;
534 break;
535 case 0x05c: /* RESC */
536 s->resc = value & 0x3f;
537 break;
538 case 0x060: /* RCC */
539 if ((s->rcc & (1 << 13)) != 0 && (value & (1 << 13)) == 0) {
540 /* PLL enable. */
541 s->int_status |= (1 << 6);
542 }
543 s->rcc = value;
544 ssys_calculate_system_clock(s);
545 break;
546 case 0x100: /* RCGC0 */
547 s->rcgc[0] = value;
548 break;
549 case 0x104: /* RCGC1 */
550 s->rcgc[1] = value;
551 break;
552 case 0x108: /* RCGC2 */
553 s->rcgc[2] = value;
554 break;
555 case 0x110: /* SCGC0 */
556 s->scgc[0] = value;
557 break;
558 case 0x114: /* SCGC1 */
559 s->scgc[1] = value;
560 break;
561 case 0x118: /* SCGC2 */
562 s->scgc[2] = value;
563 break;
564 case 0x120: /* DCGC0 */
565 s->dcgc[0] = value;
566 break;
567 case 0x124: /* DCGC1 */
568 s->dcgc[1] = value;
569 break;
570 case 0x128: /* DCGC2 */
571 s->dcgc[2] = value;
572 break;
573 case 0x150: /* CLKVCLR */
574 s->clkvclr = value;
575 break;
576 case 0x160: /* LDOARST */
577 s->ldoarst = value;
578 break;
579 default:
580 cpu_abort(cpu_single_env, "ssys_write: Bad offset 0x%x\n", (int)offset);
581 }
582 ssys_update(s);
583 }
584
585 static CPUReadMemoryFunc *ssys_readfn[] = {
586 ssys_read,
587 ssys_read,
588 ssys_read
589 };
590
591 static CPUWriteMemoryFunc *ssys_writefn[] = {
592 ssys_write,
593 ssys_write,
594 ssys_write
595 };
596
597 static void ssys_reset(void *opaque)
598 {
599 ssys_state *s = (ssys_state *)opaque;
600
601 s->pborctl = 0x7ffd;
602 s->rcc = 0x078e3ac0;
603 s->rcgc[0] = 1;
604 s->scgc[0] = 1;
605 s->dcgc[0] = 1;
606 }
607
608 static void ssys_save(QEMUFile *f, void *opaque)
609 {
610 ssys_state *s = (ssys_state *)opaque;
611
612 qemu_put_be32(f, s->pborctl);
613 qemu_put_be32(f, s->ldopctl);
614 qemu_put_be32(f, s->int_mask);
615 qemu_put_be32(f, s->int_status);
616 qemu_put_be32(f, s->resc);
617 qemu_put_be32(f, s->rcc);
618 qemu_put_be32(f, s->rcgc[0]);
619 qemu_put_be32(f, s->rcgc[1]);
620 qemu_put_be32(f, s->rcgc[2]);
621 qemu_put_be32(f, s->scgc[0]);
622 qemu_put_be32(f, s->scgc[1]);
623 qemu_put_be32(f, s->scgc[2]);
624 qemu_put_be32(f, s->dcgc[0]);
625 qemu_put_be32(f, s->dcgc[1]);
626 qemu_put_be32(f, s->dcgc[2]);
627 qemu_put_be32(f, s->clkvclr);
628 qemu_put_be32(f, s->ldoarst);
629 }
630
631 static int ssys_load(QEMUFile *f, void *opaque, int version_id)
632 {
633 ssys_state *s = (ssys_state *)opaque;
634
635 if (version_id != 1)
636 return -EINVAL;
637
638 s->pborctl = qemu_get_be32(f);
639 s->ldopctl = qemu_get_be32(f);
640 s->int_mask = qemu_get_be32(f);
641 s->int_status = qemu_get_be32(f);
642 s->resc = qemu_get_be32(f);
643 s->rcc = qemu_get_be32(f);
644 s->rcgc[0] = qemu_get_be32(f);
645 s->rcgc[1] = qemu_get_be32(f);
646 s->rcgc[2] = qemu_get_be32(f);
647 s->scgc[0] = qemu_get_be32(f);
648 s->scgc[1] = qemu_get_be32(f);
649 s->scgc[2] = qemu_get_be32(f);
650 s->dcgc[0] = qemu_get_be32(f);
651 s->dcgc[1] = qemu_get_be32(f);
652 s->dcgc[2] = qemu_get_be32(f);
653 s->clkvclr = qemu_get_be32(f);
654 s->ldoarst = qemu_get_be32(f);
655 ssys_calculate_system_clock(s);
656
657 return 0;
658 }
659
660 static void stellaris_sys_init(uint32_t base, qemu_irq irq,
661 stellaris_board_info * board,
662 uint8_t *macaddr)
663 {
664 int iomemtype;
665 ssys_state *s;
666
667 s = (ssys_state *)qemu_mallocz(sizeof(ssys_state));
668 s->irq = irq;
669 s->board = board;
670 /* Most devices come preprogrammed with a MAC address in the user data. */
671 s->user0 = macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16);
672 s->user1 = macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16);
673
674 iomemtype = cpu_register_io_memory(0, ssys_readfn,
675 ssys_writefn, s);
676 cpu_register_physical_memory(base, 0x00001000, iomemtype);
677 ssys_reset(s);
678 register_savevm("stellaris_sys", -1, 1, ssys_save, ssys_load, s);
679 }
680
681
682 /* I2C controller. */
683
684 typedef struct {
685 i2c_bus *bus;
686 qemu_irq irq;
687 uint32_t msa;
688 uint32_t mcs;
689 uint32_t mdr;
690 uint32_t mtpr;
691 uint32_t mimr;
692 uint32_t mris;
693 uint32_t mcr;
694 } stellaris_i2c_state;
695
696 #define STELLARIS_I2C_MCS_BUSY 0x01
697 #define STELLARIS_I2C_MCS_ERROR 0x02
698 #define STELLARIS_I2C_MCS_ADRACK 0x04
699 #define STELLARIS_I2C_MCS_DATACK 0x08
700 #define STELLARIS_I2C_MCS_ARBLST 0x10
701 #define STELLARIS_I2C_MCS_IDLE 0x20
702 #define STELLARIS_I2C_MCS_BUSBSY 0x40
703
704 static uint32_t stellaris_i2c_read(void *opaque, target_phys_addr_t offset)
705 {
706 stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
707
708 switch (offset) {
709 case 0x00: /* MSA */
710 return s->msa;
711 case 0x04: /* MCS */
712 /* We don't emulate timing, so the controller is never busy. */
713 return s->mcs | STELLARIS_I2C_MCS_IDLE;
714 case 0x08: /* MDR */
715 return s->mdr;
716 case 0x0c: /* MTPR */
717 return s->mtpr;
718 case 0x10: /* MIMR */
719 return s->mimr;
720 case 0x14: /* MRIS */
721 return s->mris;
722 case 0x18: /* MMIS */
723 return s->mris & s->mimr;
724 case 0x20: /* MCR */
725 return s->mcr;
726 default:
727 cpu_abort(cpu_single_env, "strllaris_i2c_read: Bad offset 0x%x\n",
728 (int)offset);
729 return 0;
730 }
731 }
732
733 static void stellaris_i2c_update(stellaris_i2c_state *s)
734 {
735 int level;
736
737 level = (s->mris & s->mimr) != 0;
738 qemu_set_irq(s->irq, level);
739 }
740
741 static void stellaris_i2c_write(void *opaque, target_phys_addr_t offset,
742 uint32_t value)
743 {
744 stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
745
746 switch (offset) {
747 case 0x00: /* MSA */
748 s->msa = value & 0xff;
749 break;
750 case 0x04: /* MCS */
751 if ((s->mcr & 0x10) == 0) {
752 /* Disabled. Do nothing. */
753 break;
754 }
755 /* Grab the bus if this is starting a transfer. */
756 if ((value & 2) && (s->mcs & STELLARIS_I2C_MCS_BUSBSY) == 0) {
757 if (i2c_start_transfer(s->bus, s->msa >> 1, s->msa & 1)) {
758 s->mcs |= STELLARIS_I2C_MCS_ARBLST;
759 } else {
760 s->mcs &= ~STELLARIS_I2C_MCS_ARBLST;
761 s->mcs |= STELLARIS_I2C_MCS_BUSBSY;
762 }
763 }
764 /* If we don't have the bus then indicate an error. */
765 if (!i2c_bus_busy(s->bus)
766 || (s->mcs & STELLARIS_I2C_MCS_BUSBSY) == 0) {
767 s->mcs |= STELLARIS_I2C_MCS_ERROR;
768 break;
769 }
770 s->mcs &= ~STELLARIS_I2C_MCS_ERROR;
771 if (value & 1) {
772 /* Transfer a byte. */
773 /* TODO: Handle errors. */
774 if (s->msa & 1) {
775 /* Recv */
776 s->mdr = i2c_recv(s->bus) & 0xff;
777 } else {
778 /* Send */
779 i2c_send(s->bus, s->mdr);
780 }
781 /* Raise an interrupt. */
782 s->mris |= 1;
783 }
784 if (value & 4) {
785 /* Finish transfer. */
786 i2c_end_transfer(s->bus);
787 s->mcs &= ~STELLARIS_I2C_MCS_BUSBSY;
788 }
789 break;
790 case 0x08: /* MDR */
791 s->mdr = value & 0xff;
792 break;
793 case 0x0c: /* MTPR */
794 s->mtpr = value & 0xff;
795 break;
796 case 0x10: /* MIMR */
797 s->mimr = 1;
798 break;
799 case 0x1c: /* MICR */
800 s->mris &= ~value;
801 break;
802 case 0x20: /* MCR */
803 if (value & 1)
804 cpu_abort(cpu_single_env,
805 "stellaris_i2c_write: Loopback not implemented\n");
806 if (value & 0x20)
807 cpu_abort(cpu_single_env,
808 "stellaris_i2c_write: Slave mode not implemented\n");
809 s->mcr = value & 0x31;
810 break;
811 default:
812 cpu_abort(cpu_single_env, "stellaris_i2c_write: Bad offset 0x%x\n",
813 (int)offset);
814 }
815 stellaris_i2c_update(s);
816 }
817
818 static void stellaris_i2c_reset(stellaris_i2c_state *s)
819 {
820 if (s->mcs & STELLARIS_I2C_MCS_BUSBSY)
821 i2c_end_transfer(s->bus);
822
823 s->msa = 0;
824 s->mcs = 0;
825 s->mdr = 0;
826 s->mtpr = 1;
827 s->mimr = 0;
828 s->mris = 0;
829 s->mcr = 0;
830 stellaris_i2c_update(s);
831 }
832
833 static CPUReadMemoryFunc *stellaris_i2c_readfn[] = {
834 stellaris_i2c_read,
835 stellaris_i2c_read,
836 stellaris_i2c_read
837 };
838
839 static CPUWriteMemoryFunc *stellaris_i2c_writefn[] = {
840 stellaris_i2c_write,
841 stellaris_i2c_write,
842 stellaris_i2c_write
843 };
844
845 static void stellaris_i2c_save(QEMUFile *f, void *opaque)
846 {
847 stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
848
849 qemu_put_be32(f, s->msa);
850 qemu_put_be32(f, s->mcs);
851 qemu_put_be32(f, s->mdr);
852 qemu_put_be32(f, s->mtpr);
853 qemu_put_be32(f, s->mimr);
854 qemu_put_be32(f, s->mris);
855 qemu_put_be32(f, s->mcr);
856 }
857
858 static int stellaris_i2c_load(QEMUFile *f, void *opaque, int version_id)
859 {
860 stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
861
862 if (version_id != 1)
863 return -EINVAL;
864
865 s->msa = qemu_get_be32(f);
866 s->mcs = qemu_get_be32(f);
867 s->mdr = qemu_get_be32(f);
868 s->mtpr = qemu_get_be32(f);
869 s->mimr = qemu_get_be32(f);
870 s->mris = qemu_get_be32(f);
871 s->mcr = qemu_get_be32(f);
872
873 return 0;
874 }
875
876 static void stellaris_i2c_init(uint32_t base, qemu_irq irq, i2c_bus *bus)
877 {
878 stellaris_i2c_state *s;
879 int iomemtype;
880
881 s = (stellaris_i2c_state *)qemu_mallocz(sizeof(stellaris_i2c_state));
882 s->irq = irq;
883 s->bus = bus;
884
885 iomemtype = cpu_register_io_memory(0, stellaris_i2c_readfn,
886 stellaris_i2c_writefn, s);
887 cpu_register_physical_memory(base, 0x00001000, iomemtype);
888 /* ??? For now we only implement the master interface. */
889 stellaris_i2c_reset(s);
890 register_savevm("stellaris_i2c", -1, 1,
891 stellaris_i2c_save, stellaris_i2c_load, s);
892 }
893
894 /* Analogue to Digital Converter. This is only partially implemented,
895 enough for applications that use a combined ADC and timer tick. */
896
897 #define STELLARIS_ADC_EM_CONTROLLER 0
898 #define STELLARIS_ADC_EM_COMP 1
899 #define STELLARIS_ADC_EM_EXTERNAL 4
900 #define STELLARIS_ADC_EM_TIMER 5
901 #define STELLARIS_ADC_EM_PWM0 6
902 #define STELLARIS_ADC_EM_PWM1 7
903 #define STELLARIS_ADC_EM_PWM2 8
904
905 #define STELLARIS_ADC_FIFO_EMPTY 0x0100
906 #define STELLARIS_ADC_FIFO_FULL 0x1000
907
908 typedef struct
909 {
910 uint32_t actss;
911 uint32_t ris;
912 uint32_t im;
913 uint32_t emux;
914 uint32_t ostat;
915 uint32_t ustat;
916 uint32_t sspri;
917 uint32_t sac;
918 struct {
919 uint32_t state;
920 uint32_t data[16];
921 } fifo[4];
922 uint32_t ssmux[4];
923 uint32_t ssctl[4];
924 uint32_t noise;
925 qemu_irq irq;
926 } stellaris_adc_state;
927
928 static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
929 {
930 int tail;
931
932 tail = s->fifo[n].state & 0xf;
933 if (s->fifo[n].state & STELLARIS_ADC_FIFO_EMPTY) {
934 s->ustat |= 1 << n;
935 } else {
936 s->fifo[n].state = (s->fifo[n].state & ~0xf) | ((tail + 1) & 0xf);
937 s->fifo[n].state &= ~STELLARIS_ADC_FIFO_FULL;
938 if (tail + 1 == ((s->fifo[n].state >> 4) & 0xf))
939 s->fifo[n].state |= STELLARIS_ADC_FIFO_EMPTY;
940 }
941 return s->fifo[n].data[tail];
942 }
943
944 static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
945 uint32_t value)
946 {
947 int head;
948
949 head = (s->fifo[n].state >> 4) & 0xf;
950 if (s->fifo[n].state & STELLARIS_ADC_FIFO_FULL) {
951 s->ostat |= 1 << n;
952 return;
953 }
954 s->fifo[n].data[head] = value;
955 head = (head + 1) & 0xf;
956 s->fifo[n].state &= ~STELLARIS_ADC_FIFO_EMPTY;
957 s->fifo[n].state = (s->fifo[n].state & ~0xf0) | (head << 4);
958 if ((s->fifo[n].state & 0xf) == head)
959 s->fifo[n].state |= STELLARIS_ADC_FIFO_FULL;
960 }
961
962 static void stellaris_adc_update(stellaris_adc_state *s)
963 {
964 int level;
965
966 level = (s->ris & s->im) != 0;
967 qemu_set_irq(s->irq, level);
968 }
969
970 static void stellaris_adc_trigger(void *opaque, int irq, int level)
971 {
972 stellaris_adc_state *s = (stellaris_adc_state *)opaque;
973
974 if ((s->actss & 1) == 0) {
975 return;
976 }
977
978 /* Some applications use the ADC as a random number source, so introduce
979 some variation into the signal. */
980 s->noise = s->noise * 314159 + 1;
981 /* ??? actual inputs not implemented. Return an arbitrary value. */
982 stellaris_adc_fifo_write(s, 0, 0x200 + ((s->noise >> 16) & 7));
983 s->ris |= 1;
984 stellaris_adc_update(s);
985 }
986
987 static void stellaris_adc_reset(stellaris_adc_state *s)
988 {
989 int n;
990
991 for (n = 0; n < 4; n++) {
992 s->ssmux[n] = 0;
993 s->ssctl[n] = 0;
994 s->fifo[n].state = STELLARIS_ADC_FIFO_EMPTY;
995 }
996 }
997
998 static uint32_t stellaris_adc_read(void *opaque, target_phys_addr_t offset)
999 {
1000 stellaris_adc_state *s = (stellaris_adc_state *)opaque;
1001
1002 /* TODO: Implement this. */
1003 if (offset >= 0x40 && offset < 0xc0) {
1004 int n;
1005 n = (offset - 0x40) >> 5;
1006 switch (offset & 0x1f) {
1007 case 0x00: /* SSMUX */
1008 return s->ssmux[n];
1009 case 0x04: /* SSCTL */
1010 return s->ssctl[n];
1011 case 0x08: /* SSFIFO */
1012 return stellaris_adc_fifo_read(s, n);
1013 case 0x0c: /* SSFSTAT */
1014 return s->fifo[n].state;
1015 default:
1016 break;
1017 }
1018 }
1019 switch (offset) {
1020 case 0x00: /* ACTSS */
1021 return s->actss;
1022 case 0x04: /* RIS */
1023 return s->ris;
1024 case 0x08: /* IM */
1025 return s->im;
1026 case 0x0c: /* ISC */
1027 return s->ris & s->im;
1028 case 0x10: /* OSTAT */
1029 return s->ostat;
1030 case 0x14: /* EMUX */
1031 return s->emux;
1032 case 0x18: /* USTAT */
1033 return s->ustat;
1034 case 0x20: /* SSPRI */
1035 return s->sspri;
1036 case 0x30: /* SAC */
1037 return s->sac;
1038 default:
1039 cpu_abort(cpu_single_env, "strllaris_adc_read: Bad offset 0x%x\n",
1040 (int)offset);
1041 return 0;
1042 }
1043 }
1044
1045 static void stellaris_adc_write(void *opaque, target_phys_addr_t offset,
1046 uint32_t value)
1047 {
1048 stellaris_adc_state *s = (stellaris_adc_state *)opaque;
1049
1050 /* TODO: Implement this. */
1051 if (offset >= 0x40 && offset < 0xc0) {
1052 int n;
1053 n = (offset - 0x40) >> 5;
1054 switch (offset & 0x1f) {
1055 case 0x00: /* SSMUX */
1056 s->ssmux[n] = value & 0x33333333;
1057 return;
1058 case 0x04: /* SSCTL */
1059 if (value != 6) {
1060 cpu_abort(cpu_single_env, "ADC: Unimplemented sequence %x\n",
1061 value);
1062 }
1063 s->ssctl[n] = value;
1064 return;
1065 default:
1066 break;
1067 }
1068 }
1069 switch (offset) {
1070 case 0x00: /* ACTSS */
1071 s->actss = value & 0xf;
1072 if (value & 0xe) {
1073 cpu_abort(cpu_single_env,
1074 "Not implemented: ADC sequencers 1-3\n");
1075 }
1076 break;
1077 case 0x08: /* IM */
1078 s->im = value;
1079 break;
1080 case 0x0c: /* ISC */
1081 s->ris &= ~value;
1082 break;
1083 case 0x10: /* OSTAT */
1084 s->ostat &= ~value;
1085 break;
1086 case 0x14: /* EMUX */
1087 s->emux = value;
1088 break;
1089 case 0x18: /* USTAT */
1090 s->ustat &= ~value;
1091 break;
1092 case 0x20: /* SSPRI */
1093 s->sspri = value;
1094 break;
1095 case 0x28: /* PSSI */
1096 cpu_abort(cpu_single_env, "Not implemented: ADC sample initiate\n");
1097 break;
1098 case 0x30: /* SAC */
1099 s->sac = value;
1100 break;
1101 default:
1102 cpu_abort(cpu_single_env, "stellaris_adc_write: Bad offset 0x%x\n",
1103 (int)offset);
1104 }
1105 stellaris_adc_update(s);
1106 }
1107
1108 static CPUReadMemoryFunc *stellaris_adc_readfn[] = {
1109 stellaris_adc_read,
1110 stellaris_adc_read,
1111 stellaris_adc_read
1112 };
1113
1114 static CPUWriteMemoryFunc *stellaris_adc_writefn[] = {
1115 stellaris_adc_write,
1116 stellaris_adc_write,
1117 stellaris_adc_write
1118 };
1119
1120 static void stellaris_adc_save(QEMUFile *f, void *opaque)
1121 {
1122 stellaris_adc_state *s = (stellaris_adc_state *)opaque;
1123 int i;
1124 int j;
1125
1126 qemu_put_be32(f, s->actss);
1127 qemu_put_be32(f, s->ris);
1128 qemu_put_be32(f, s->im);
1129 qemu_put_be32(f, s->emux);
1130 qemu_put_be32(f, s->ostat);
1131 qemu_put_be32(f, s->ustat);
1132 qemu_put_be32(f, s->sspri);
1133 qemu_put_be32(f, s->sac);
1134 for (i = 0; i < 4; i++) {
1135 qemu_put_be32(f, s->fifo[i].state);
1136 for (j = 0; j < 16; j++) {
1137 qemu_put_be32(f, s->fifo[i].data[j]);
1138 }
1139 qemu_put_be32(f, s->ssmux[i]);
1140 qemu_put_be32(f, s->ssctl[i]);
1141 }
1142 qemu_put_be32(f, s->noise);
1143 }
1144
1145 static int stellaris_adc_load(QEMUFile *f, void *opaque, int version_id)
1146 {
1147 stellaris_adc_state *s = (stellaris_adc_state *)opaque;
1148 int i;
1149 int j;
1150
1151 if (version_id != 1)
1152 return -EINVAL;
1153
1154 s->actss = qemu_get_be32(f);
1155 s->ris = qemu_get_be32(f);
1156 s->im = qemu_get_be32(f);
1157 s->emux = qemu_get_be32(f);
1158 s->ostat = qemu_get_be32(f);
1159 s->ustat = qemu_get_be32(f);
1160 s->sspri = qemu_get_be32(f);
1161 s->sac = qemu_get_be32(f);
1162 for (i = 0; i < 4; i++) {
1163 s->fifo[i].state = qemu_get_be32(f);
1164 for (j = 0; j < 16; j++) {
1165 s->fifo[i].data[j] = qemu_get_be32(f);
1166 }
1167 s->ssmux[i] = qemu_get_be32(f);
1168 s->ssctl[i] = qemu_get_be32(f);
1169 }
1170 s->noise = qemu_get_be32(f);
1171
1172 return 0;
1173 }
1174
1175 static qemu_irq stellaris_adc_init(uint32_t base, qemu_irq irq)
1176 {
1177 stellaris_adc_state *s;
1178 int iomemtype;
1179 qemu_irq *qi;
1180
1181 s = (stellaris_adc_state *)qemu_mallocz(sizeof(stellaris_adc_state));
1182 s->irq = irq;
1183
1184 iomemtype = cpu_register_io_memory(0, stellaris_adc_readfn,
1185 stellaris_adc_writefn, s);
1186 cpu_register_physical_memory(base, 0x00001000, iomemtype);
1187 stellaris_adc_reset(s);
1188 qi = qemu_allocate_irqs(stellaris_adc_trigger, s, 1);
1189 register_savevm("stellaris_adc", -1, 1,
1190 stellaris_adc_save, stellaris_adc_load, s);
1191 return qi[0];
1192 }
1193
1194 /* Some boards have both an OLED controller and SD card connected to
1195 the same SSI port, with the SD card chip select connected to a
1196 GPIO pin. Technically the OLED chip select is connected to the SSI
1197 Fss pin. We do not bother emulating that as both devices should
1198 never be selected simultaneously, and our OLED controller ignores stray
1199 0xff commands that occur when deselecting the SD card. */
1200
1201 typedef struct {
1202 ssi_xfer_cb xfer_cb[2];
1203 void *opaque[2];
1204 qemu_irq irq;
1205 int current_dev;
1206 } stellaris_ssi_bus_state;
1207
1208 static void stellaris_ssi_bus_select(void *opaque, int irq, int level)
1209 {
1210 stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
1211
1212 s->current_dev = level;
1213 }
1214
1215 static int stellaris_ssi_bus_xfer(void *opaque, int val)
1216 {
1217 stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
1218
1219 return s->xfer_cb[s->current_dev](s->opaque[s->current_dev], val);
1220 }
1221
1222 static void stellaris_ssi_bus_save(QEMUFile *f, void *opaque)
1223 {
1224 stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
1225
1226 qemu_put_be32(f, s->current_dev);
1227 }
1228
1229 static int stellaris_ssi_bus_load(QEMUFile *f, void *opaque, int version_id)
1230 {
1231 stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
1232
1233 if (version_id != 1)
1234 return -EINVAL;
1235
1236 s->current_dev = qemu_get_be32(f);
1237
1238 return 0;
1239 }
1240
1241 static void *stellaris_ssi_bus_init(qemu_irq *irqp,
1242 ssi_xfer_cb cb0, void *opaque0,
1243 ssi_xfer_cb cb1, void *opaque1)
1244 {
1245 qemu_irq *qi;
1246 stellaris_ssi_bus_state *s;
1247
1248 s = (stellaris_ssi_bus_state *)qemu_mallocz(sizeof(stellaris_ssi_bus_state));
1249 s->xfer_cb[0] = cb0;
1250 s->opaque[0] = opaque0;
1251 s->xfer_cb[1] = cb1;
1252 s->opaque[1] = opaque1;
1253 qi = qemu_allocate_irqs(stellaris_ssi_bus_select, s, 1);
1254 *irqp = *qi;
1255 register_savevm("stellaris_ssi_bus", -1, 1,
1256 stellaris_ssi_bus_save, stellaris_ssi_bus_load, s);
1257 return s;
1258 }
1259
1260 /* Board init. */
1261 static stellaris_board_info stellaris_boards[] = {
1262 { "LM3S811EVB",
1263 0,
1264 0x0032000e,
1265 0x001f001f, /* dc0 */
1266 0x001132bf,
1267 0x01071013,
1268 0x3f0f01ff,
1269 0x0000001f,
1270 BP_OLED_I2C
1271 },
1272 { "LM3S6965EVB",
1273 0x10010002,
1274 0x1073402e,
1275 0x00ff007f, /* dc0 */
1276 0x001133ff,
1277 0x030f5317,
1278 0x0f0f87ff,
1279 0x5000007f,
1280 BP_OLED_SSI | BP_GAMEPAD
1281 }
1282 };
1283
1284 static void stellaris_init(const char *kernel_filename, const char *cpu_model,
1285 DisplayState *ds, stellaris_board_info *board)
1286 {
1287 static const int uart_irq[] = {5, 6, 33, 34};
1288 static const int timer_irq[] = {19, 21, 23, 35};
1289 static const uint32_t gpio_addr[7] =
1290 { 0x40004000, 0x40005000, 0x40006000, 0x40007000,
1291 0x40024000, 0x40025000, 0x40026000};
1292 static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
1293
1294 qemu_irq *pic;
1295 qemu_irq *gpio_in[7];
1296 qemu_irq *gpio_out[7];
1297 qemu_irq adc;
1298 int sram_size;
1299 int flash_size;
1300 i2c_bus *i2c;
1301 int i;
1302
1303 flash_size = ((board->dc0 & 0xffff) + 1) << 1;
1304 sram_size = (board->dc0 >> 18) + 1;
1305 pic = armv7m_init(flash_size, sram_size, kernel_filename, cpu_model);
1306
1307 if (board->dc1 & (1 << 16)) {
1308 adc = stellaris_adc_init(0x40038000, pic[14]);
1309 } else {
1310 adc = NULL;
1311 }
1312 for (i = 0; i < 4; i++) {
1313 if (board->dc2 & (0x10000 << i)) {
1314 stellaris_gptm_init(0x40030000 + i * 0x1000,
1315 pic[timer_irq[i]], adc);
1316 }
1317 }
1318
1319 stellaris_sys_init(0x400fe000, pic[28], board, nd_table[0].macaddr);
1320
1321 for (i = 0; i < 7; i++) {
1322 if (board->dc4 & (1 << i)) {
1323 gpio_in[i] = pl061_init(gpio_addr[i], pic[gpio_irq[i]],
1324 &gpio_out[i]);
1325 }
1326 }
1327
1328 if (board->dc2 & (1 << 12)) {
1329 i2c = i2c_init_bus();
1330 stellaris_i2c_init(0x40020000, pic[8], i2c);
1331 if (board->peripherals & BP_OLED_I2C) {
1332 ssd0303_init(ds, i2c, 0x3d);
1333 }
1334 }
1335
1336 for (i = 0; i < 4; i++) {
1337 if (board->dc2 & (1 << i)) {
1338 pl011_init(0x4000c000 + i * 0x1000, pic[uart_irq[i]],
1339 serial_hds[i], PL011_LUMINARY);
1340 }
1341 }
1342 if (board->dc2 & (1 << 4)) {
1343 if (board->peripherals & BP_OLED_SSI) {
1344 void * oled;
1345 void * sd;
1346 void *ssi_bus;
1347 int index;
1348
1349 oled = ssd0323_init(ds, &gpio_out[GPIO_C][7]);
1350 index = drive_get_index(IF_SD, 0, 0);
1351 sd = ssi_sd_init(drives_table[index].bdrv);
1352
1353 ssi_bus = stellaris_ssi_bus_init(&gpio_out[GPIO_D][0],
1354 ssi_sd_xfer, sd,
1355 ssd0323_xfer_ssi, oled);
1356
1357 pl022_init(0x40008000, pic[7], stellaris_ssi_bus_xfer, ssi_bus);
1358 /* Make sure the select pin is high. */
1359 qemu_irq_raise(gpio_out[GPIO_D][0]);
1360 } else {
1361 pl022_init(0x40008000, pic[7], NULL, NULL);
1362 }
1363 }
1364 if (board->dc4 & (1 << 28))
1365 stellaris_enet_init(&nd_table[0], 0x40048000, pic[42]);
1366 if (board->peripherals & BP_GAMEPAD) {
1367 qemu_irq gpad_irq[5];
1368 static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d };
1369
1370 gpad_irq[0] = qemu_irq_invert(gpio_in[GPIO_E][0]); /* up */
1371 gpad_irq[1] = qemu_irq_invert(gpio_in[GPIO_E][1]); /* down */
1372 gpad_irq[2] = qemu_irq_invert(gpio_in[GPIO_E][2]); /* left */
1373 gpad_irq[3] = qemu_irq_invert(gpio_in[GPIO_E][3]); /* right */
1374 gpad_irq[4] = qemu_irq_invert(gpio_in[GPIO_F][1]); /* select */
1375
1376 stellaris_gamepad_init(5, gpad_irq, gpad_keycode);
1377 }
1378 }
1379
1380 /* FIXME: Figure out how to generate these from stellaris_boards. */
1381 static void lm3s811evb_init(ram_addr_t ram_size, int vga_ram_size,
1382 const char *boot_device, DisplayState *ds,
1383 const char *kernel_filename, const char *kernel_cmdline,
1384 const char *initrd_filename, const char *cpu_model)
1385 {
1386 stellaris_init(kernel_filename, cpu_model, ds, &stellaris_boards[0]);
1387 }
1388
1389 static void lm3s6965evb_init(ram_addr_t ram_size, int vga_ram_size,
1390 const char *boot_device, DisplayState *ds,
1391 const char *kernel_filename, const char *kernel_cmdline,
1392 const char *initrd_filename, const char *cpu_model)
1393 {
1394 stellaris_init(kernel_filename, cpu_model, ds, &stellaris_boards[1]);
1395 }
1396
1397 QEMUMachine lm3s811evb_machine = {
1398 .name = "lm3s811evb",
1399 .desc = "Stellaris LM3S811EVB",
1400 .init = lm3s811evb_init,
1401 .ram_require = (64 * 1024 + 8 * 1024) | RAMSIZE_FIXED,
1402 };
1403
1404 QEMUMachine lm3s6965evb_machine = {
1405 .name = "lm3s6965evb",
1406 .desc = "Stellaris LM3S6965EVB",
1407 .init = lm3s6965evb_init,
1408 .ram_require = (256 * 1024 + 64 * 1024) | RAMSIZE_FIXED,
1409 };