]> Git Repo - qemu.git/blob - hw/stellaris.c
hw/stellaris: Add support for RCC2 register
[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 licensed 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 const VMStateDescription vmstate_stellaris_gptm = {
283     .name = "stellaris_gptm",
284     .version_id = 1,
285     .minimum_version_id = 1,
286     .minimum_version_id_old = 1,
287     .fields      = (VMStateField[]) {
288         VMSTATE_UINT32(config, gptm_state),
289         VMSTATE_UINT32_ARRAY(mode, gptm_state, 2),
290         VMSTATE_UINT32(control, gptm_state),
291         VMSTATE_UINT32(state, gptm_state),
292         VMSTATE_UINT32(mask, gptm_state),
293         VMSTATE_UNUSED(8),
294         VMSTATE_UINT32_ARRAY(load, gptm_state, 2),
295         VMSTATE_UINT32_ARRAY(match, gptm_state, 2),
296         VMSTATE_UINT32_ARRAY(prescale, gptm_state, 2),
297         VMSTATE_UINT32_ARRAY(match_prescale, gptm_state, 2),
298         VMSTATE_UINT32(rtc, gptm_state),
299         VMSTATE_INT64_ARRAY(tick, gptm_state, 2),
300         VMSTATE_TIMER_ARRAY(timer, gptm_state, 2),
301         VMSTATE_END_OF_LIST()
302     }
303 };
304
305 static int stellaris_gptm_init(SysBusDevice *dev)
306 {
307     int iomemtype;
308     gptm_state *s = FROM_SYSBUS(gptm_state, dev);
309
310     sysbus_init_irq(dev, &s->irq);
311     qdev_init_gpio_out(&dev->qdev, &s->trigger, 1);
312
313     iomemtype = cpu_register_io_memory(gptm_readfn,
314                                        gptm_writefn, s,
315                                        DEVICE_NATIVE_ENDIAN);
316     sysbus_init_mmio(dev, 0x1000, iomemtype);
317
318     s->opaque[0] = s->opaque[1] = s;
319     s->timer[0] = qemu_new_timer_ns(vm_clock, gptm_tick, &s->opaque[0]);
320     s->timer[1] = qemu_new_timer_ns(vm_clock, gptm_tick, &s->opaque[1]);
321     vmstate_register(&dev->qdev, -1, &vmstate_stellaris_gptm, s);
322     return 0;
323 }
324
325
326 /* System controller.  */
327
328 typedef struct {
329     uint32_t pborctl;
330     uint32_t ldopctl;
331     uint32_t int_status;
332     uint32_t int_mask;
333     uint32_t resc;
334     uint32_t rcc;
335     uint32_t rcc2;
336     uint32_t rcgc[3];
337     uint32_t scgc[3];
338     uint32_t dcgc[3];
339     uint32_t clkvclr;
340     uint32_t ldoarst;
341     uint32_t user0;
342     uint32_t user1;
343     qemu_irq irq;
344     stellaris_board_info *board;
345 } ssys_state;
346
347 static void ssys_update(ssys_state *s)
348 {
349   qemu_set_irq(s->irq, (s->int_status & s->int_mask) != 0);
350 }
351
352 static uint32_t pllcfg_sandstorm[16] = {
353     0x31c0, /* 1 Mhz */
354     0x1ae0, /* 1.8432 Mhz */
355     0x18c0, /* 2 Mhz */
356     0xd573, /* 2.4576 Mhz */
357     0x37a6, /* 3.57954 Mhz */
358     0x1ae2, /* 3.6864 Mhz */
359     0x0c40, /* 4 Mhz */
360     0x98bc, /* 4.906 Mhz */
361     0x935b, /* 4.9152 Mhz */
362     0x09c0, /* 5 Mhz */
363     0x4dee, /* 5.12 Mhz */
364     0x0c41, /* 6 Mhz */
365     0x75db, /* 6.144 Mhz */
366     0x1ae6, /* 7.3728 Mhz */
367     0x0600, /* 8 Mhz */
368     0x585b /* 8.192 Mhz */
369 };
370
371 static uint32_t pllcfg_fury[16] = {
372     0x3200, /* 1 Mhz */
373     0x1b20, /* 1.8432 Mhz */
374     0x1900, /* 2 Mhz */
375     0xf42b, /* 2.4576 Mhz */
376     0x37e3, /* 3.57954 Mhz */
377     0x1b21, /* 3.6864 Mhz */
378     0x0c80, /* 4 Mhz */
379     0x98ee, /* 4.906 Mhz */
380     0xd5b4, /* 4.9152 Mhz */
381     0x0a00, /* 5 Mhz */
382     0x4e27, /* 5.12 Mhz */
383     0x1902, /* 6 Mhz */
384     0xec1c, /* 6.144 Mhz */
385     0x1b23, /* 7.3728 Mhz */
386     0x0640, /* 8 Mhz */
387     0xb11c /* 8.192 Mhz */
388 };
389
390 #define DID0_VER_MASK        0x70000000
391 #define DID0_VER_0           0x00000000
392 #define DID0_VER_1           0x10000000
393
394 #define DID0_CLASS_MASK      0x00FF0000
395 #define DID0_CLASS_SANDSTORM 0x00000000
396 #define DID0_CLASS_FURY      0x00010000
397
398 static int ssys_board_class(const ssys_state *s)
399 {
400     uint32_t did0 = s->board->did0;
401     switch (did0 & DID0_VER_MASK) {
402     case DID0_VER_0:
403         return DID0_CLASS_SANDSTORM;
404     case DID0_VER_1:
405         switch (did0 & DID0_CLASS_MASK) {
406         case DID0_CLASS_SANDSTORM:
407         case DID0_CLASS_FURY:
408             return did0 & DID0_CLASS_MASK;
409         }
410         /* for unknown classes, fall through */
411     default:
412         hw_error("ssys_board_class: Unknown class 0x%08x\n", did0);
413     }
414 }
415
416 static uint32_t ssys_read(void *opaque, target_phys_addr_t offset)
417 {
418     ssys_state *s = (ssys_state *)opaque;
419
420     switch (offset) {
421     case 0x000: /* DID0 */
422         return s->board->did0;
423     case 0x004: /* DID1 */
424         return s->board->did1;
425     case 0x008: /* DC0 */
426         return s->board->dc0;
427     case 0x010: /* DC1 */
428         return s->board->dc1;
429     case 0x014: /* DC2 */
430         return s->board->dc2;
431     case 0x018: /* DC3 */
432         return s->board->dc3;
433     case 0x01c: /* DC4 */
434         return s->board->dc4;
435     case 0x030: /* PBORCTL */
436         return s->pborctl;
437     case 0x034: /* LDOPCTL */
438         return s->ldopctl;
439     case 0x040: /* SRCR0 */
440         return 0;
441     case 0x044: /* SRCR1 */
442         return 0;
443     case 0x048: /* SRCR2 */
444         return 0;
445     case 0x050: /* RIS */
446         return s->int_status;
447     case 0x054: /* IMC */
448         return s->int_mask;
449     case 0x058: /* MISC */
450         return s->int_status & s->int_mask;
451     case 0x05c: /* RESC */
452         return s->resc;
453     case 0x060: /* RCC */
454         return s->rcc;
455     case 0x064: /* PLLCFG */
456         {
457             int xtal;
458             xtal = (s->rcc >> 6) & 0xf;
459             switch (ssys_board_class(s)) {
460             case DID0_CLASS_FURY:
461                 return pllcfg_fury[xtal];
462             case DID0_CLASS_SANDSTORM:
463                 return pllcfg_sandstorm[xtal];
464             default:
465                 hw_error("ssys_read: Unhandled class for PLLCFG read.\n");
466                 return 0;
467             }
468         }
469     case 0x070: /* RCC2 */
470         return s->rcc2;
471     case 0x100: /* RCGC0 */
472         return s->rcgc[0];
473     case 0x104: /* RCGC1 */
474         return s->rcgc[1];
475     case 0x108: /* RCGC2 */
476         return s->rcgc[2];
477     case 0x110: /* SCGC0 */
478         return s->scgc[0];
479     case 0x114: /* SCGC1 */
480         return s->scgc[1];
481     case 0x118: /* SCGC2 */
482         return s->scgc[2];
483     case 0x120: /* DCGC0 */
484         return s->dcgc[0];
485     case 0x124: /* DCGC1 */
486         return s->dcgc[1];
487     case 0x128: /* DCGC2 */
488         return s->dcgc[2];
489     case 0x150: /* CLKVCLR */
490         return s->clkvclr;
491     case 0x160: /* LDOARST */
492         return s->ldoarst;
493     case 0x1e0: /* USER0 */
494         return s->user0;
495     case 0x1e4: /* USER1 */
496         return s->user1;
497     default:
498         hw_error("ssys_read: Bad offset 0x%x\n", (int)offset);
499         return 0;
500     }
501 }
502
503 static bool ssys_use_rcc2(ssys_state *s)
504 {
505     return (s->rcc2 >> 31) & 0x1;
506 }
507
508 /*
509  * Caculate the sys. clock period in ms.
510  */
511 static void ssys_calculate_system_clock(ssys_state *s)
512 {
513     if (ssys_use_rcc2(s)) {
514         system_clock_scale = 5 * (((s->rcc2 >> 23) & 0x3f) + 1);
515     } else {
516         system_clock_scale = 5 * (((s->rcc >> 23) & 0xf) + 1);
517     }
518 }
519
520 static void ssys_write(void *opaque, target_phys_addr_t offset, uint32_t value)
521 {
522     ssys_state *s = (ssys_state *)opaque;
523
524     switch (offset) {
525     case 0x030: /* PBORCTL */
526         s->pborctl = value & 0xffff;
527         break;
528     case 0x034: /* LDOPCTL */
529         s->ldopctl = value & 0x1f;
530         break;
531     case 0x040: /* SRCR0 */
532     case 0x044: /* SRCR1 */
533     case 0x048: /* SRCR2 */
534         fprintf(stderr, "Peripheral reset not implemented\n");
535         break;
536     case 0x054: /* IMC */
537         s->int_mask = value & 0x7f;
538         break;
539     case 0x058: /* MISC */
540         s->int_status &= ~value;
541         break;
542     case 0x05c: /* RESC */
543         s->resc = value & 0x3f;
544         break;
545     case 0x060: /* RCC */
546         if ((s->rcc & (1 << 13)) != 0 && (value & (1 << 13)) == 0) {
547             /* PLL enable.  */
548             s->int_status |= (1 << 6);
549         }
550         s->rcc = value;
551         ssys_calculate_system_clock(s);
552         break;
553     case 0x070: /* RCC2 */
554         if (ssys_board_class(s) == DID0_CLASS_SANDSTORM) {
555             break;
556         }
557
558         if ((s->rcc2 & (1 << 13)) != 0 && (value & (1 << 13)) == 0) {
559             /* PLL enable.  */
560             s->int_status |= (1 << 6);
561         }
562         s->rcc2 = value;
563         ssys_calculate_system_clock(s);
564         break;
565     case 0x100: /* RCGC0 */
566         s->rcgc[0] = value;
567         break;
568     case 0x104: /* RCGC1 */
569         s->rcgc[1] = value;
570         break;
571     case 0x108: /* RCGC2 */
572         s->rcgc[2] = value;
573         break;
574     case 0x110: /* SCGC0 */
575         s->scgc[0] = value;
576         break;
577     case 0x114: /* SCGC1 */
578         s->scgc[1] = value;
579         break;
580     case 0x118: /* SCGC2 */
581         s->scgc[2] = value;
582         break;
583     case 0x120: /* DCGC0 */
584         s->dcgc[0] = value;
585         break;
586     case 0x124: /* DCGC1 */
587         s->dcgc[1] = value;
588         break;
589     case 0x128: /* DCGC2 */
590         s->dcgc[2] = value;
591         break;
592     case 0x150: /* CLKVCLR */
593         s->clkvclr = value;
594         break;
595     case 0x160: /* LDOARST */
596         s->ldoarst = value;
597         break;
598     default:
599         hw_error("ssys_write: Bad offset 0x%x\n", (int)offset);
600     }
601     ssys_update(s);
602 }
603
604 static CPUReadMemoryFunc * const ssys_readfn[] = {
605    ssys_read,
606    ssys_read,
607    ssys_read
608 };
609
610 static CPUWriteMemoryFunc * const ssys_writefn[] = {
611    ssys_write,
612    ssys_write,
613    ssys_write
614 };
615
616 static void ssys_reset(void *opaque)
617 {
618     ssys_state *s = (ssys_state *)opaque;
619
620     s->pborctl = 0x7ffd;
621     s->rcc = 0x078e3ac0;
622
623     if (ssys_board_class(s) == DID0_CLASS_SANDSTORM) {
624         s->rcc2 = 0;
625     } else {
626         s->rcc2 = 0x07802810;
627     }
628     s->rcgc[0] = 1;
629     s->scgc[0] = 1;
630     s->dcgc[0] = 1;
631 }
632
633 static int stellaris_sys_post_load(void *opaque, int version_id)
634 {
635     ssys_state *s = opaque;
636
637     ssys_calculate_system_clock(s);
638
639     return 0;
640 }
641
642 static const VMStateDescription vmstate_stellaris_sys = {
643     .name = "stellaris_sys",
644     .version_id = 2,
645     .minimum_version_id = 1,
646     .minimum_version_id_old = 1,
647     .post_load = stellaris_sys_post_load,
648     .fields      = (VMStateField[]) {
649         VMSTATE_UINT32(pborctl, ssys_state),
650         VMSTATE_UINT32(ldopctl, ssys_state),
651         VMSTATE_UINT32(int_mask, ssys_state),
652         VMSTATE_UINT32(int_status, ssys_state),
653         VMSTATE_UINT32(resc, ssys_state),
654         VMSTATE_UINT32(rcc, ssys_state),
655         VMSTATE_UINT32_V(rcc2, ssys_state, 2),
656         VMSTATE_UINT32_ARRAY(rcgc, ssys_state, 3),
657         VMSTATE_UINT32_ARRAY(scgc, ssys_state, 3),
658         VMSTATE_UINT32_ARRAY(dcgc, ssys_state, 3),
659         VMSTATE_UINT32(clkvclr, ssys_state),
660         VMSTATE_UINT32(ldoarst, ssys_state),
661         VMSTATE_END_OF_LIST()
662     }
663 };
664
665 static int stellaris_sys_init(uint32_t base, qemu_irq irq,
666                               stellaris_board_info * board,
667                               uint8_t *macaddr)
668 {
669     int iomemtype;
670     ssys_state *s;
671
672     s = (ssys_state *)qemu_mallocz(sizeof(ssys_state));
673     s->irq = irq;
674     s->board = board;
675     /* Most devices come preprogrammed with a MAC address in the user data. */
676     s->user0 = macaddr[0] | (macaddr[1] << 8) | (macaddr[2] << 16);
677     s->user1 = macaddr[3] | (macaddr[4] << 8) | (macaddr[5] << 16);
678
679     iomemtype = cpu_register_io_memory(ssys_readfn,
680                                        ssys_writefn, s,
681                                        DEVICE_NATIVE_ENDIAN);
682     cpu_register_physical_memory(base, 0x00001000, iomemtype);
683     ssys_reset(s);
684     vmstate_register(NULL, -1, &vmstate_stellaris_sys, s);
685     return 0;
686 }
687
688
689 /* I2C controller.  */
690
691 typedef struct {
692     SysBusDevice busdev;
693     i2c_bus *bus;
694     qemu_irq irq;
695     uint32_t msa;
696     uint32_t mcs;
697     uint32_t mdr;
698     uint32_t mtpr;
699     uint32_t mimr;
700     uint32_t mris;
701     uint32_t mcr;
702 } stellaris_i2c_state;
703
704 #define STELLARIS_I2C_MCS_BUSY    0x01
705 #define STELLARIS_I2C_MCS_ERROR   0x02
706 #define STELLARIS_I2C_MCS_ADRACK  0x04
707 #define STELLARIS_I2C_MCS_DATACK  0x08
708 #define STELLARIS_I2C_MCS_ARBLST  0x10
709 #define STELLARIS_I2C_MCS_IDLE    0x20
710 #define STELLARIS_I2C_MCS_BUSBSY  0x40
711
712 static uint32_t stellaris_i2c_read(void *opaque, target_phys_addr_t offset)
713 {
714     stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
715
716     switch (offset) {
717     case 0x00: /* MSA */
718         return s->msa;
719     case 0x04: /* MCS */
720         /* We don't emulate timing, so the controller is never busy.  */
721         return s->mcs | STELLARIS_I2C_MCS_IDLE;
722     case 0x08: /* MDR */
723         return s->mdr;
724     case 0x0c: /* MTPR */
725         return s->mtpr;
726     case 0x10: /* MIMR */
727         return s->mimr;
728     case 0x14: /* MRIS */
729         return s->mris;
730     case 0x18: /* MMIS */
731         return s->mris & s->mimr;
732     case 0x20: /* MCR */
733         return s->mcr;
734     default:
735         hw_error("strllaris_i2c_read: Bad offset 0x%x\n", (int)offset);
736         return 0;
737     }
738 }
739
740 static void stellaris_i2c_update(stellaris_i2c_state *s)
741 {
742     int level;
743
744     level = (s->mris & s->mimr) != 0;
745     qemu_set_irq(s->irq, level);
746 }
747
748 static void stellaris_i2c_write(void *opaque, target_phys_addr_t offset,
749                                 uint32_t value)
750 {
751     stellaris_i2c_state *s = (stellaris_i2c_state *)opaque;
752
753     switch (offset) {
754     case 0x00: /* MSA */
755         s->msa = value & 0xff;
756         break;
757     case 0x04: /* MCS */
758         if ((s->mcr & 0x10) == 0) {
759             /* Disabled.  Do nothing.  */
760             break;
761         }
762         /* Grab the bus if this is starting a transfer.  */
763         if ((value & 2) && (s->mcs & STELLARIS_I2C_MCS_BUSBSY) == 0) {
764             if (i2c_start_transfer(s->bus, s->msa >> 1, s->msa & 1)) {
765                 s->mcs |= STELLARIS_I2C_MCS_ARBLST;
766             } else {
767                 s->mcs &= ~STELLARIS_I2C_MCS_ARBLST;
768                 s->mcs |= STELLARIS_I2C_MCS_BUSBSY;
769             }
770         }
771         /* If we don't have the bus then indicate an error.  */
772         if (!i2c_bus_busy(s->bus)
773                 || (s->mcs & STELLARIS_I2C_MCS_BUSBSY) == 0) {
774             s->mcs |= STELLARIS_I2C_MCS_ERROR;
775             break;
776         }
777         s->mcs &= ~STELLARIS_I2C_MCS_ERROR;
778         if (value & 1) {
779             /* Transfer a byte.  */
780             /* TODO: Handle errors.  */
781             if (s->msa & 1) {
782                 /* Recv */
783                 s->mdr = i2c_recv(s->bus) & 0xff;
784             } else {
785                 /* Send */
786                 i2c_send(s->bus, s->mdr);
787             }
788             /* Raise an interrupt.  */
789             s->mris |= 1;
790         }
791         if (value & 4) {
792             /* Finish transfer.  */
793             i2c_end_transfer(s->bus);
794             s->mcs &= ~STELLARIS_I2C_MCS_BUSBSY;
795         }
796         break;
797     case 0x08: /* MDR */
798         s->mdr = value & 0xff;
799         break;
800     case 0x0c: /* MTPR */
801         s->mtpr = value & 0xff;
802         break;
803     case 0x10: /* MIMR */
804         s->mimr = 1;
805         break;
806     case 0x1c: /* MICR */
807         s->mris &= ~value;
808         break;
809     case 0x20: /* MCR */
810         if (value & 1)
811             hw_error(
812                       "stellaris_i2c_write: Loopback not implemented\n");
813         if (value & 0x20)
814             hw_error(
815                       "stellaris_i2c_write: Slave mode not implemented\n");
816         s->mcr = value & 0x31;
817         break;
818     default:
819         hw_error("stellaris_i2c_write: Bad offset 0x%x\n",
820                   (int)offset);
821     }
822     stellaris_i2c_update(s);
823 }
824
825 static void stellaris_i2c_reset(stellaris_i2c_state *s)
826 {
827     if (s->mcs & STELLARIS_I2C_MCS_BUSBSY)
828         i2c_end_transfer(s->bus);
829
830     s->msa = 0;
831     s->mcs = 0;
832     s->mdr = 0;
833     s->mtpr = 1;
834     s->mimr = 0;
835     s->mris = 0;
836     s->mcr = 0;
837     stellaris_i2c_update(s);
838 }
839
840 static CPUReadMemoryFunc * const stellaris_i2c_readfn[] = {
841    stellaris_i2c_read,
842    stellaris_i2c_read,
843    stellaris_i2c_read
844 };
845
846 static CPUWriteMemoryFunc * const stellaris_i2c_writefn[] = {
847    stellaris_i2c_write,
848    stellaris_i2c_write,
849    stellaris_i2c_write
850 };
851
852 static const VMStateDescription vmstate_stellaris_i2c = {
853     .name = "stellaris_i2c",
854     .version_id = 1,
855     .minimum_version_id = 1,
856     .minimum_version_id_old = 1,
857     .fields      = (VMStateField[]) {
858         VMSTATE_UINT32(msa, stellaris_i2c_state),
859         VMSTATE_UINT32(mcs, stellaris_i2c_state),
860         VMSTATE_UINT32(mdr, stellaris_i2c_state),
861         VMSTATE_UINT32(mtpr, stellaris_i2c_state),
862         VMSTATE_UINT32(mimr, stellaris_i2c_state),
863         VMSTATE_UINT32(mris, stellaris_i2c_state),
864         VMSTATE_UINT32(mcr, stellaris_i2c_state),
865         VMSTATE_END_OF_LIST()
866     }
867 };
868
869 static int stellaris_i2c_init(SysBusDevice * dev)
870 {
871     stellaris_i2c_state *s = FROM_SYSBUS(stellaris_i2c_state, dev);
872     i2c_bus *bus;
873     int iomemtype;
874
875     sysbus_init_irq(dev, &s->irq);
876     bus = i2c_init_bus(&dev->qdev, "i2c");
877     s->bus = bus;
878
879     iomemtype = cpu_register_io_memory(stellaris_i2c_readfn,
880                                        stellaris_i2c_writefn, s,
881                                        DEVICE_NATIVE_ENDIAN);
882     sysbus_init_mmio(dev, 0x1000, iomemtype);
883     /* ??? For now we only implement the master interface.  */
884     stellaris_i2c_reset(s);
885     vmstate_register(&dev->qdev, -1, &vmstate_stellaris_i2c, s);
886     return 0;
887 }
888
889 /* Analogue to Digital Converter.  This is only partially implemented,
890    enough for applications that use a combined ADC and timer tick.  */
891
892 #define STELLARIS_ADC_EM_CONTROLLER 0
893 #define STELLARIS_ADC_EM_COMP       1
894 #define STELLARIS_ADC_EM_EXTERNAL   4
895 #define STELLARIS_ADC_EM_TIMER      5
896 #define STELLARIS_ADC_EM_PWM0       6
897 #define STELLARIS_ADC_EM_PWM1       7
898 #define STELLARIS_ADC_EM_PWM2       8
899
900 #define STELLARIS_ADC_FIFO_EMPTY    0x0100
901 #define STELLARIS_ADC_FIFO_FULL     0x1000
902
903 typedef struct
904 {
905     SysBusDevice busdev;
906     uint32_t actss;
907     uint32_t ris;
908     uint32_t im;
909     uint32_t emux;
910     uint32_t ostat;
911     uint32_t ustat;
912     uint32_t sspri;
913     uint32_t sac;
914     struct {
915         uint32_t state;
916         uint32_t data[16];
917     } fifo[4];
918     uint32_t ssmux[4];
919     uint32_t ssctl[4];
920     uint32_t noise;
921     qemu_irq irq[4];
922 } stellaris_adc_state;
923
924 static uint32_t stellaris_adc_fifo_read(stellaris_adc_state *s, int n)
925 {
926     int tail;
927
928     tail = s->fifo[n].state & 0xf;
929     if (s->fifo[n].state & STELLARIS_ADC_FIFO_EMPTY) {
930         s->ustat |= 1 << n;
931     } else {
932         s->fifo[n].state = (s->fifo[n].state & ~0xf) | ((tail + 1) & 0xf);
933         s->fifo[n].state &= ~STELLARIS_ADC_FIFO_FULL;
934         if (tail + 1 == ((s->fifo[n].state >> 4) & 0xf))
935             s->fifo[n].state |= STELLARIS_ADC_FIFO_EMPTY;
936     }
937     return s->fifo[n].data[tail];
938 }
939
940 static void stellaris_adc_fifo_write(stellaris_adc_state *s, int n,
941                                      uint32_t value)
942 {
943     int head;
944
945     /* TODO: Real hardware has limited size FIFOs.  We have a full 16 entry 
946        FIFO fir each sequencer.  */
947     head = (s->fifo[n].state >> 4) & 0xf;
948     if (s->fifo[n].state & STELLARIS_ADC_FIFO_FULL) {
949         s->ostat |= 1 << n;
950         return;
951     }
952     s->fifo[n].data[head] = value;
953     head = (head + 1) & 0xf;
954     s->fifo[n].state &= ~STELLARIS_ADC_FIFO_EMPTY;
955     s->fifo[n].state = (s->fifo[n].state & ~0xf0) | (head << 4);
956     if ((s->fifo[n].state & 0xf) == head)
957         s->fifo[n].state |= STELLARIS_ADC_FIFO_FULL;
958 }
959
960 static void stellaris_adc_update(stellaris_adc_state *s)
961 {
962     int level;
963     int n;
964
965     for (n = 0; n < 4; n++) {
966         level = (s->ris & s->im & (1 << n)) != 0;
967         qemu_set_irq(s->irq[n], level);
968     }
969 }
970
971 static void stellaris_adc_trigger(void *opaque, int irq, int level)
972 {
973     stellaris_adc_state *s = (stellaris_adc_state *)opaque;
974     int n;
975
976     for (n = 0; n < 4; n++) {
977         if ((s->actss & (1 << n)) == 0) {
978             continue;
979         }
980
981         if (((s->emux >> (n * 4)) & 0xff) != 5) {
982             continue;
983         }
984
985         /* Some applications use the ADC as a random number source, so introduce
986            some variation into the signal.  */
987         s->noise = s->noise * 314159 + 1;
988         /* ??? actual inputs not implemented.  Return an arbitrary value.  */
989         stellaris_adc_fifo_write(s, n, 0x200 + ((s->noise >> 16) & 7));
990         s->ris |= (1 << n);
991         stellaris_adc_update(s);
992     }
993 }
994
995 static void stellaris_adc_reset(stellaris_adc_state *s)
996 {
997     int n;
998
999     for (n = 0; n < 4; n++) {
1000         s->ssmux[n] = 0;
1001         s->ssctl[n] = 0;
1002         s->fifo[n].state = STELLARIS_ADC_FIFO_EMPTY;
1003     }
1004 }
1005
1006 static uint32_t stellaris_adc_read(void *opaque, target_phys_addr_t offset)
1007 {
1008     stellaris_adc_state *s = (stellaris_adc_state *)opaque;
1009
1010     /* TODO: Implement this.  */
1011     if (offset >= 0x40 && offset < 0xc0) {
1012         int n;
1013         n = (offset - 0x40) >> 5;
1014         switch (offset & 0x1f) {
1015         case 0x00: /* SSMUX */
1016             return s->ssmux[n];
1017         case 0x04: /* SSCTL */
1018             return s->ssctl[n];
1019         case 0x08: /* SSFIFO */
1020             return stellaris_adc_fifo_read(s, n);
1021         case 0x0c: /* SSFSTAT */
1022             return s->fifo[n].state;
1023         default:
1024             break;
1025         }
1026     }
1027     switch (offset) {
1028     case 0x00: /* ACTSS */
1029         return s->actss;
1030     case 0x04: /* RIS */
1031         return s->ris;
1032     case 0x08: /* IM */
1033         return s->im;
1034     case 0x0c: /* ISC */
1035         return s->ris & s->im;
1036     case 0x10: /* OSTAT */
1037         return s->ostat;
1038     case 0x14: /* EMUX */
1039         return s->emux;
1040     case 0x18: /* USTAT */
1041         return s->ustat;
1042     case 0x20: /* SSPRI */
1043         return s->sspri;
1044     case 0x30: /* SAC */
1045         return s->sac;
1046     default:
1047         hw_error("strllaris_adc_read: Bad offset 0x%x\n",
1048                   (int)offset);
1049         return 0;
1050     }
1051 }
1052
1053 static void stellaris_adc_write(void *opaque, target_phys_addr_t offset,
1054                                 uint32_t value)
1055 {
1056     stellaris_adc_state *s = (stellaris_adc_state *)opaque;
1057
1058     /* TODO: Implement this.  */
1059     if (offset >= 0x40 && offset < 0xc0) {
1060         int n;
1061         n = (offset - 0x40) >> 5;
1062         switch (offset & 0x1f) {
1063         case 0x00: /* SSMUX */
1064             s->ssmux[n] = value & 0x33333333;
1065             return;
1066         case 0x04: /* SSCTL */
1067             if (value != 6) {
1068                 hw_error("ADC: Unimplemented sequence %x\n",
1069                           value);
1070             }
1071             s->ssctl[n] = value;
1072             return;
1073         default:
1074             break;
1075         }
1076     }
1077     switch (offset) {
1078     case 0x00: /* ACTSS */
1079         s->actss = value & 0xf;
1080         break;
1081     case 0x08: /* IM */
1082         s->im = value;
1083         break;
1084     case 0x0c: /* ISC */
1085         s->ris &= ~value;
1086         break;
1087     case 0x10: /* OSTAT */
1088         s->ostat &= ~value;
1089         break;
1090     case 0x14: /* EMUX */
1091         s->emux = value;
1092         break;
1093     case 0x18: /* USTAT */
1094         s->ustat &= ~value;
1095         break;
1096     case 0x20: /* SSPRI */
1097         s->sspri = value;
1098         break;
1099     case 0x28: /* PSSI */
1100         hw_error("Not implemented:  ADC sample initiate\n");
1101         break;
1102     case 0x30: /* SAC */
1103         s->sac = value;
1104         break;
1105     default:
1106         hw_error("stellaris_adc_write: Bad offset 0x%x\n", (int)offset);
1107     }
1108     stellaris_adc_update(s);
1109 }
1110
1111 static CPUReadMemoryFunc * const stellaris_adc_readfn[] = {
1112    stellaris_adc_read,
1113    stellaris_adc_read,
1114    stellaris_adc_read
1115 };
1116
1117 static CPUWriteMemoryFunc * const stellaris_adc_writefn[] = {
1118    stellaris_adc_write,
1119    stellaris_adc_write,
1120    stellaris_adc_write
1121 };
1122
1123 static const VMStateDescription vmstate_stellaris_adc = {
1124     .name = "stellaris_adc",
1125     .version_id = 1,
1126     .minimum_version_id = 1,
1127     .minimum_version_id_old = 1,
1128     .fields      = (VMStateField[]) {
1129         VMSTATE_UINT32(actss, stellaris_adc_state),
1130         VMSTATE_UINT32(ris, stellaris_adc_state),
1131         VMSTATE_UINT32(im, stellaris_adc_state),
1132         VMSTATE_UINT32(emux, stellaris_adc_state),
1133         VMSTATE_UINT32(ostat, stellaris_adc_state),
1134         VMSTATE_UINT32(ustat, stellaris_adc_state),
1135         VMSTATE_UINT32(sspri, stellaris_adc_state),
1136         VMSTATE_UINT32(sac, stellaris_adc_state),
1137         VMSTATE_UINT32(fifo[0].state, stellaris_adc_state),
1138         VMSTATE_UINT32_ARRAY(fifo[0].data, stellaris_adc_state, 16),
1139         VMSTATE_UINT32(ssmux[0], stellaris_adc_state),
1140         VMSTATE_UINT32(ssctl[0], stellaris_adc_state),
1141         VMSTATE_UINT32(fifo[1].state, stellaris_adc_state),
1142         VMSTATE_UINT32_ARRAY(fifo[1].data, stellaris_adc_state, 16),
1143         VMSTATE_UINT32(ssmux[1], stellaris_adc_state),
1144         VMSTATE_UINT32(ssctl[1], stellaris_adc_state),
1145         VMSTATE_UINT32(fifo[2].state, stellaris_adc_state),
1146         VMSTATE_UINT32_ARRAY(fifo[2].data, stellaris_adc_state, 16),
1147         VMSTATE_UINT32(ssmux[2], stellaris_adc_state),
1148         VMSTATE_UINT32(ssctl[2], stellaris_adc_state),
1149         VMSTATE_UINT32(fifo[3].state, stellaris_adc_state),
1150         VMSTATE_UINT32_ARRAY(fifo[3].data, stellaris_adc_state, 16),
1151         VMSTATE_UINT32(ssmux[3], stellaris_adc_state),
1152         VMSTATE_UINT32(ssctl[3], stellaris_adc_state),
1153         VMSTATE_UINT32(noise, stellaris_adc_state),
1154         VMSTATE_END_OF_LIST()
1155     }
1156 };
1157
1158 static int stellaris_adc_init(SysBusDevice *dev)
1159 {
1160     stellaris_adc_state *s = FROM_SYSBUS(stellaris_adc_state, dev);
1161     int iomemtype;
1162     int n;
1163
1164     for (n = 0; n < 4; n++) {
1165         sysbus_init_irq(dev, &s->irq[n]);
1166     }
1167
1168     iomemtype = cpu_register_io_memory(stellaris_adc_readfn,
1169                                        stellaris_adc_writefn, s,
1170                                        DEVICE_NATIVE_ENDIAN);
1171     sysbus_init_mmio(dev, 0x1000, iomemtype);
1172     stellaris_adc_reset(s);
1173     qdev_init_gpio_in(&dev->qdev, stellaris_adc_trigger, 1);
1174     vmstate_register(&dev->qdev, -1, &vmstate_stellaris_adc, s);
1175     return 0;
1176 }
1177
1178 /* Some boards have both an OLED controller and SD card connected to
1179    the same SSI port, with the SD card chip select connected to a
1180    GPIO pin.  Technically the OLED chip select is connected to the SSI
1181    Fss pin.  We do not bother emulating that as both devices should
1182    never be selected simultaneously, and our OLED controller ignores stray
1183    0xff commands that occur when deselecting the SD card.  */
1184
1185 typedef struct {
1186     SSISlave ssidev;
1187     qemu_irq irq;
1188     int current_dev;
1189     SSIBus *bus[2];
1190 } stellaris_ssi_bus_state;
1191
1192 static void stellaris_ssi_bus_select(void *opaque, int irq, int level)
1193 {
1194     stellaris_ssi_bus_state *s = (stellaris_ssi_bus_state *)opaque;
1195
1196     s->current_dev = level;
1197 }
1198
1199 static uint32_t stellaris_ssi_bus_transfer(SSISlave *dev, uint32_t val)
1200 {
1201     stellaris_ssi_bus_state *s = FROM_SSI_SLAVE(stellaris_ssi_bus_state, dev);
1202
1203     return ssi_transfer(s->bus[s->current_dev], val);
1204 }
1205
1206 static const VMStateDescription vmstate_stellaris_ssi_bus = {
1207     .name = "stellaris_ssi_bus",
1208     .version_id = 1,
1209     .minimum_version_id = 1,
1210     .minimum_version_id_old = 1,
1211     .fields      = (VMStateField[]) {
1212         VMSTATE_INT32(current_dev, stellaris_ssi_bus_state),
1213         VMSTATE_END_OF_LIST()
1214     }
1215 };
1216
1217 static int stellaris_ssi_bus_init(SSISlave *dev)
1218 {
1219     stellaris_ssi_bus_state *s = FROM_SSI_SLAVE(stellaris_ssi_bus_state, dev);
1220
1221     s->bus[0] = ssi_create_bus(&dev->qdev, "ssi0");
1222     s->bus[1] = ssi_create_bus(&dev->qdev, "ssi1");
1223     qdev_init_gpio_in(&dev->qdev, stellaris_ssi_bus_select, 1);
1224
1225     vmstate_register(&dev->qdev, -1, &vmstate_stellaris_ssi_bus, s);
1226     return 0;
1227 }
1228
1229 /* Board init.  */
1230 static stellaris_board_info stellaris_boards[] = {
1231   { "LM3S811EVB",
1232     0,
1233     0x0032000e,
1234     0x001f001f, /* dc0 */
1235     0x001132bf,
1236     0x01071013,
1237     0x3f0f01ff,
1238     0x0000001f,
1239     BP_OLED_I2C
1240   },
1241   { "LM3S6965EVB",
1242     0x10010002,
1243     0x1073402e,
1244     0x00ff007f, /* dc0 */
1245     0x001133ff,
1246     0x030f5317,
1247     0x0f0f87ff,
1248     0x5000007f,
1249     BP_OLED_SSI | BP_GAMEPAD
1250   }
1251 };
1252
1253 static void stellaris_init(const char *kernel_filename, const char *cpu_model,
1254                            stellaris_board_info *board)
1255 {
1256     static const int uart_irq[] = {5, 6, 33, 34};
1257     static const int timer_irq[] = {19, 21, 23, 35};
1258     static const uint32_t gpio_addr[7] =
1259       { 0x40004000, 0x40005000, 0x40006000, 0x40007000,
1260         0x40024000, 0x40025000, 0x40026000};
1261     static const int gpio_irq[7] = {0, 1, 2, 3, 4, 30, 31};
1262
1263     qemu_irq *pic;
1264     DeviceState *gpio_dev[7];
1265     qemu_irq gpio_in[7][8];
1266     qemu_irq gpio_out[7][8];
1267     qemu_irq adc;
1268     int sram_size;
1269     int flash_size;
1270     i2c_bus *i2c;
1271     DeviceState *dev;
1272     int i;
1273     int j;
1274
1275     flash_size = ((board->dc0 & 0xffff) + 1) << 1;
1276     sram_size = (board->dc0 >> 18) + 1;
1277     pic = armv7m_init(flash_size, sram_size, kernel_filename, cpu_model);
1278
1279     if (board->dc1 & (1 << 16)) {
1280         dev = sysbus_create_varargs("stellaris-adc", 0x40038000,
1281                                     pic[14], pic[15], pic[16], pic[17], NULL);
1282         adc = qdev_get_gpio_in(dev, 0);
1283     } else {
1284         adc = NULL;
1285     }
1286     for (i = 0; i < 4; i++) {
1287         if (board->dc2 & (0x10000 << i)) {
1288             dev = sysbus_create_simple("stellaris-gptm",
1289                                        0x40030000 + i * 0x1000,
1290                                        pic[timer_irq[i]]);
1291             /* TODO: This is incorrect, but we get away with it because
1292                the ADC output is only ever pulsed.  */
1293             qdev_connect_gpio_out(dev, 0, adc);
1294         }
1295     }
1296
1297     stellaris_sys_init(0x400fe000, pic[28], board, nd_table[0].macaddr.a);
1298
1299     for (i = 0; i < 7; i++) {
1300         if (board->dc4 & (1 << i)) {
1301             gpio_dev[i] = sysbus_create_simple("pl061_luminary", gpio_addr[i],
1302                                                pic[gpio_irq[i]]);
1303             for (j = 0; j < 8; j++) {
1304                 gpio_in[i][j] = qdev_get_gpio_in(gpio_dev[i], j);
1305                 gpio_out[i][j] = NULL;
1306             }
1307         }
1308     }
1309
1310     if (board->dc2 & (1 << 12)) {
1311         dev = sysbus_create_simple("stellaris-i2c", 0x40020000, pic[8]);
1312         i2c = (i2c_bus *)qdev_get_child_bus(dev, "i2c");
1313         if (board->peripherals & BP_OLED_I2C) {
1314             i2c_create_slave(i2c, "ssd0303", 0x3d);
1315         }
1316     }
1317
1318     for (i = 0; i < 4; i++) {
1319         if (board->dc2 & (1 << i)) {
1320             sysbus_create_simple("pl011_luminary", 0x4000c000 + i * 0x1000,
1321                                  pic[uart_irq[i]]);
1322         }
1323     }
1324     if (board->dc2 & (1 << 4)) {
1325         dev = sysbus_create_simple("pl022", 0x40008000, pic[7]);
1326         if (board->peripherals & BP_OLED_SSI) {
1327             DeviceState *mux;
1328             void *bus;
1329
1330             bus = qdev_get_child_bus(dev, "ssi");
1331             mux = ssi_create_slave(bus, "evb6965-ssi");
1332             gpio_out[GPIO_D][0] = qdev_get_gpio_in(mux, 0);
1333
1334             bus = qdev_get_child_bus(mux, "ssi0");
1335             ssi_create_slave(bus, "ssi-sd");
1336
1337             bus = qdev_get_child_bus(mux, "ssi1");
1338             dev = ssi_create_slave(bus, "ssd0323");
1339             gpio_out[GPIO_C][7] = qdev_get_gpio_in(dev, 0);
1340
1341             /* Make sure the select pin is high.  */
1342             qemu_irq_raise(gpio_out[GPIO_D][0]);
1343         }
1344     }
1345     if (board->dc4 & (1 << 28)) {
1346         DeviceState *enet;
1347
1348         qemu_check_nic_model(&nd_table[0], "stellaris");
1349
1350         enet = qdev_create(NULL, "stellaris_enet");
1351         qdev_set_nic_properties(enet, &nd_table[0]);
1352         qdev_init_nofail(enet);
1353         sysbus_mmio_map(sysbus_from_qdev(enet), 0, 0x40048000);
1354         sysbus_connect_irq(sysbus_from_qdev(enet), 0, pic[42]);
1355     }
1356     if (board->peripherals & BP_GAMEPAD) {
1357         qemu_irq gpad_irq[5];
1358         static const int gpad_keycode[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d };
1359
1360         gpad_irq[0] = qemu_irq_invert(gpio_in[GPIO_E][0]); /* up */
1361         gpad_irq[1] = qemu_irq_invert(gpio_in[GPIO_E][1]); /* down */
1362         gpad_irq[2] = qemu_irq_invert(gpio_in[GPIO_E][2]); /* left */
1363         gpad_irq[3] = qemu_irq_invert(gpio_in[GPIO_E][3]); /* right */
1364         gpad_irq[4] = qemu_irq_invert(gpio_in[GPIO_F][1]); /* select */
1365
1366         stellaris_gamepad_init(5, gpad_irq, gpad_keycode);
1367     }
1368     for (i = 0; i < 7; i++) {
1369         if (board->dc4 & (1 << i)) {
1370             for (j = 0; j < 8; j++) {
1371                 if (gpio_out[i][j]) {
1372                     qdev_connect_gpio_out(gpio_dev[i], j, gpio_out[i][j]);
1373                 }
1374             }
1375         }
1376     }
1377 }
1378
1379 /* FIXME: Figure out how to generate these from stellaris_boards.  */
1380 static void lm3s811evb_init(ram_addr_t ram_size,
1381                      const char *boot_device,
1382                      const char *kernel_filename, const char *kernel_cmdline,
1383                      const char *initrd_filename, const char *cpu_model)
1384 {
1385     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[0]);
1386 }
1387
1388 static void lm3s6965evb_init(ram_addr_t ram_size,
1389                      const char *boot_device,
1390                      const char *kernel_filename, const char *kernel_cmdline,
1391                      const char *initrd_filename, const char *cpu_model)
1392 {
1393     stellaris_init(kernel_filename, cpu_model, &stellaris_boards[1]);
1394 }
1395
1396 static QEMUMachine lm3s811evb_machine = {
1397     .name = "lm3s811evb",
1398     .desc = "Stellaris LM3S811EVB",
1399     .init = lm3s811evb_init,
1400 };
1401
1402 static QEMUMachine lm3s6965evb_machine = {
1403     .name = "lm3s6965evb",
1404     .desc = "Stellaris LM3S6965EVB",
1405     .init = lm3s6965evb_init,
1406 };
1407
1408 static void stellaris_machine_init(void)
1409 {
1410     qemu_register_machine(&lm3s811evb_machine);
1411     qemu_register_machine(&lm3s6965evb_machine);
1412 }
1413
1414 machine_init(stellaris_machine_init);
1415
1416 static SSISlaveInfo stellaris_ssi_bus_info = {
1417     .qdev.name = "evb6965-ssi",
1418     .qdev.size = sizeof(stellaris_ssi_bus_state),
1419     .init = stellaris_ssi_bus_init,
1420     .transfer = stellaris_ssi_bus_transfer
1421 };
1422
1423 static void stellaris_register_devices(void)
1424 {
1425     sysbus_register_dev("stellaris-i2c", sizeof(stellaris_i2c_state),
1426                         stellaris_i2c_init);
1427     sysbus_register_dev("stellaris-gptm", sizeof(gptm_state),
1428                         stellaris_gptm_init);
1429     sysbus_register_dev("stellaris-adc", sizeof(stellaris_adc_state),
1430                         stellaris_adc_init);
1431     ssi_register_slave(&stellaris_ssi_bus_info);
1432 }
1433
1434 device_init(stellaris_register_devices)
This page took 0.102626 seconds and 4 git commands to generate.