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