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