2 * Luminary Micro Stellaris peripherals
4 * Copyright (c) 2006 CodeSourcery.
5 * Written by Paul Brook
7 * This code is licenced under the GPL.
14 #include "qemu-timer.h"
28 #define BP_OLED_I2C 0x01
29 #define BP_OLED_SSI 0x02
30 #define BP_GAMEPAD 0x04
32 typedef const struct {
42 } stellaris_board_info
;
44 /* General purpose timer module. */
46 typedef struct gptm_state
{
56 uint32_t match_prescale
[2];
59 struct gptm_state
*opaque
[2];
61 /* The timers have an alternate output used to trigger the ADC. */
66 static void gptm_update_irq(gptm_state
*s
)
69 level
= (s
->state
& s
->mask
) != 0;
70 qemu_set_irq(s
->irq
, level
);
73 static void gptm_stop(gptm_state
*s
, int n
)
75 qemu_del_timer(s
->timer
[n
]);
78 static void gptm_reload(gptm_state
*s
, int n
, int reset
)
82 tick
= qemu_get_clock(vm_clock
);
87 /* 32-bit CountDown. */
89 count
= s
->load
[0] | (s
->load
[1] << 16);
90 tick
+= (int64_t)count
* system_clock_scale
;
91 } else if (s
->config
== 1) {
92 /* 32-bit RTC. 1Hz tick. */
93 tick
+= get_ticks_per_sec();
94 } else if (s
->mode
[n
] == 0xa) {
95 /* PWM mode. Not implemented. */
97 hw_error("TODO: 16-bit timer mode 0x%x\n", s
->mode
[n
]);
100 qemu_mod_timer(s
->timer
[n
], tick
);
103 static void gptm_tick(void *opaque
)
105 gptm_state
**p
= (gptm_state
**)opaque
;
111 if (s
->config
== 0) {
113 if ((s
->control
& 0x20)) {
114 /* Output trigger. */
115 qemu_irq_pulse(s
->trigger
);
117 if (s
->mode
[0] & 1) {
122 gptm_reload(s
, 0, 0);
124 } else if (s
->config
== 1) {
128 match
= s
->match
[0] | (s
->match
[1] << 16);
134 gptm_reload(s
, 0, 0);
135 } else if (s
->mode
[n
] == 0xa) {
136 /* PWM mode. Not implemented. */
138 hw_error("TODO: 16-bit timer mode 0x%x\n", s
->mode
[n
]);
143 static uint32_t gptm_read(void *opaque
, target_phys_addr_t offset
)
145 gptm_state
*s
= (gptm_state
*)opaque
;
150 case 0x04: /* TAMR */
152 case 0x08: /* TBMR */
161 return s
->state
& s
->mask
;
164 case 0x28: /* TAILR */
165 return s
->load
[0] | ((s
->config
< 4) ? (s
->load
[1] << 16) : 0);
166 case 0x2c: /* TBILR */
168 case 0x30: /* TAMARCHR */
169 return s
->match
[0] | ((s
->config
< 4) ? (s
->match
[1] << 16) : 0);
170 case 0x34: /* TBMATCHR */
172 case 0x38: /* TAPR */
173 return s
->prescale
[0];
174 case 0x3c: /* TBPR */
175 return s
->prescale
[1];
176 case 0x40: /* TAPMR */
177 return s
->match_prescale
[0];
178 case 0x44: /* TBPMR */
179 return s
->match_prescale
[1];
184 hw_error("TODO: Timer value read\n");
186 hw_error("gptm_read: Bad offset 0x%x\n", (int)offset
);
191 static void gptm_write(void *opaque
, target_phys_addr_t offset
, uint32_t value
)
193 gptm_state
*s
= (gptm_state
*)opaque
;
196 /* The timers should be disabled before changing the configuration.
197 We take advantage of this and defer everything until the timer
203 case 0x04: /* TAMR */
206 case 0x08: /* TBMR */
212 /* TODO: Implement pause. */
213 if ((oldval
^ value
) & 1) {
215 gptm_reload(s
, 0, 1);
220 if (((oldval
^ value
) & 0x100) && s
->config
>= 4) {
222 gptm_reload(s
, 1, 1);
229 s
->mask
= value
& 0x77;
235 case 0x28: /* TAILR */
236 s
->load
[0] = value
& 0xffff;
238 s
->load
[1] = value
>> 16;
241 case 0x2c: /* TBILR */
242 s
->load
[1] = value
& 0xffff;
244 case 0x30: /* TAMARCHR */
245 s
->match
[0] = value
& 0xffff;
247 s
->match
[1] = value
>> 16;
250 case 0x34: /* TBMATCHR */
251 s
->match
[1] = value
>> 16;
253 case 0x38: /* TAPR */
254 s
->prescale
[0] = value
;
256 case 0x3c: /* TBPR */
257 s
->prescale
[1] = value
;
259 case 0x40: /* TAPMR */
260 s
->match_prescale
[0] = value
;
262 case 0x44: /* TBPMR */
263 s
->match_prescale
[0] = value
;
266 hw_error("gptm_write: Bad offset 0x%x\n", (int)offset
);
271 static CPUReadMemoryFunc
* const gptm_readfn
[] = {
277 static CPUWriteMemoryFunc
* const gptm_writefn
[] = {
283 static void gptm_save(QEMUFile
*f
, void *opaque
)
285 gptm_state
*s
= (gptm_state
*)opaque
;
287 qemu_put_be32(f
, s
->config
);
288 qemu_put_be32(f
, s
->mode
[0]);
289 qemu_put_be32(f
, s
->mode
[1]);
290 qemu_put_be32(f
, s
->control
);
291 qemu_put_be32(f
, s
->state
);
292 qemu_put_be32(f
, s
->mask
);
293 qemu_put_be32(f
, s
->mode
[0]);
294 qemu_put_be32(f
, s
->mode
[0]);
295 qemu_put_be32(f
, s
->load
[0]);
296 qemu_put_be32(f
, s
->load
[1]);
297 qemu_put_be32(f
, s
->match
[0]);
298 qemu_put_be32(f
, s
->match
[1]);
299 qemu_put_be32(f
, s
->prescale
[0]);
300 qemu_put_be32(f
, s
->prescale
[1]);
301 qemu_put_be32(f
, s
->match_prescale
[0]);
302 qemu_put_be32(f
, s
->match_prescale
[1]);
303 qemu_put_be32(f
, s
->rtc
);
304 qemu_put_be64(f
, s
->tick
[0]);
305 qemu_put_be64(f
, s
->tick
[1]);
306 qemu_put_timer(f
, s
->timer
[0]);
307 qemu_put_timer(f
, s
->timer
[1]);
310 static int gptm_load(QEMUFile
*f
, void *opaque
, int version_id
)
312 gptm_state
*s
= (gptm_state
*)opaque
;
317 s
->config
= qemu_get_be32(f
);
318 s
->mode
[0] = qemu_get_be32(f
);
319 s
->mode
[1] = qemu_get_be32(f
);
320 s
->control
= qemu_get_be32(f
);
321 s
->state
= qemu_get_be32(f
);
322 s
->mask
= qemu_get_be32(f
);
323 s
->mode
[0] = qemu_get_be32(f
);
324 s
->mode
[0] = qemu_get_be32(f
);
325 s
->load
[0] = qemu_get_be32(f
);
326 s
->load
[1] = qemu_get_be32(f
);
327 s
->match
[0] = qemu_get_be32(f
);
328 s
->match
[1] = qemu_get_be32(f
);
329 s
->prescale
[0] = qemu_get_be32(f
);
330 s
->prescale
[1] = qemu_get_be32(f
);
331 s
->match_prescale
[0] = qemu_get_be32(f
);
332 s
->match_prescale
[1] = qemu_get_be32(f
);
333 s
->rtc
= qemu_get_be32(f
);
334 s
->tick
[0] = qemu_get_be64(f
);
335 s
->tick
[1] = qemu_get_be64(f
);
336 qemu_get_timer(f
, s
->timer
[0]);
337 qemu_get_timer(f
, s
->timer
[1]);
342 static int stellaris_gptm_init(SysBusDevice
*dev
)
345 gptm_state
*s
= FROM_SYSBUS(gptm_state
, dev
);
347 sysbus_init_irq(dev
, &s
->irq
);
348 qdev_init_gpio_out(&dev
->qdev
, &s
->trigger
, 1);
350 iomemtype
= cpu_register_io_memory(gptm_readfn
,
352 sysbus_init_mmio(dev
, 0x1000, iomemtype
);
354 s
->opaque
[0] = s
->opaque
[1] = s
;
355 s
->timer
[0] = qemu_new_timer(vm_clock
, gptm_tick
, &s
->opaque
[0]);
356 s
->timer
[1] = qemu_new_timer(vm_clock
, gptm_tick
, &s
->opaque
[1]);
357 register_savevm(&dev
->qdev
, "stellaris_gptm", -1, 1,
358 gptm_save
, gptm_load
, s
);
363 /* System controller. */
380 stellaris_board_info
*board
;
383 static void ssys_update(ssys_state
*s
)
385 qemu_set_irq(s
->irq
, (s
->int_status
& s
->int_mask
) != 0);
388 static uint32_t pllcfg_sandstorm
[16] = {
390 0x1ae0, /* 1.8432 Mhz */
392 0xd573, /* 2.4576 Mhz */
393 0x37a6, /* 3.57954 Mhz */
394 0x1ae2, /* 3.6864 Mhz */
396 0x98bc, /* 4.906 Mhz */
397 0x935b, /* 4.9152 Mhz */
399 0x4dee, /* 5.12 Mhz */
401 0x75db, /* 6.144 Mhz */
402 0x1ae6, /* 7.3728 Mhz */
404 0x585b /* 8.192 Mhz */
407 static uint32_t pllcfg_fury
[16] = {
409 0x1b20, /* 1.8432 Mhz */
411 0xf42b, /* 2.4576 Mhz */
412 0x37e3, /* 3.57954 Mhz */
413 0x1b21, /* 3.6864 Mhz */
415 0x98ee, /* 4.906 Mhz */
416 0xd5b4, /* 4.9152 Mhz */
418 0x4e27, /* 5.12 Mhz */
420 0xec1c, /* 6.144 Mhz */
421 0x1b23, /* 7.3728 Mhz */
423 0xb11c /* 8.192 Mhz */
426 static uint32_t ssys_read(void *opaque
, target_phys_addr_t offset
)
428 ssys_state
*s
= (ssys_state
*)opaque
;
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 */
447 case 0x034: /* LDOPCTL */
449 case 0x040: /* SRCR0 */
451 case 0x044: /* SRCR1 */
453 case 0x048: /* SRCR2 */
455 case 0x050: /* RIS */
456 return s
->int_status
;
457 case 0x054: /* IMC */
459 case 0x058: /* MISC */
460 return s
->int_status
& s
->int_mask
;
461 case 0x05c: /* RESC */
463 case 0x060: /* RCC */
465 case 0x064: /* PLLCFG */
468 xtal
= (s
->rcc
>> 6) & 0xf;
469 if (s
->board
->did0
& (1 << 16)) {
470 return pllcfg_fury
[xtal
];
472 return pllcfg_sandstorm
[xtal
];
475 case 0x100: /* RCGC0 */
477 case 0x104: /* RCGC1 */
479 case 0x108: /* RCGC2 */
481 case 0x110: /* SCGC0 */
483 case 0x114: /* SCGC1 */
485 case 0x118: /* SCGC2 */
487 case 0x120: /* DCGC0 */
489 case 0x124: /* DCGC1 */
491 case 0x128: /* DCGC2 */
493 case 0x150: /* CLKVCLR */
495 case 0x160: /* LDOARST */
497 case 0x1e0: /* USER0 */
499 case 0x1e4: /* USER1 */
502 hw_error("ssys_read: Bad offset 0x%x\n", (int)offset
);
507 static void ssys_calculate_system_clock(ssys_state
*s
)
509 system_clock_scale
= 5 * (((s
->rcc
>> 23) & 0xf) + 1);
512 static void ssys_write(void *opaque
, target_phys_addr_t offset
, uint32_t value
)
514 ssys_state
*s
= (ssys_state
*)opaque
;
517 case 0x030: /* PBORCTL */
518 s
->pborctl
= value
& 0xffff;
520 case 0x034: /* LDOPCTL */
521 s
->ldopctl
= value
& 0x1f;
523 case 0x040: /* SRCR0 */
524 case 0x044: /* SRCR1 */
525 case 0x048: /* SRCR2 */
526 fprintf(stderr
, "Peripheral reset not implemented\n");
528 case 0x054: /* IMC */
529 s
->int_mask
= value
& 0x7f;
531 case 0x058: /* MISC */
532 s
->int_status
&= ~value
;
534 case 0x05c: /* RESC */
535 s
->resc
= value
& 0x3f;
537 case 0x060: /* RCC */
538 if ((s
->rcc
& (1 << 13)) != 0 && (value
& (1 << 13)) == 0) {
540 s
->int_status
|= (1 << 6);
543 ssys_calculate_system_clock(s
);
545 case 0x100: /* RCGC0 */
548 case 0x104: /* RCGC1 */
551 case 0x108: /* RCGC2 */
554 case 0x110: /* SCGC0 */
557 case 0x114: /* SCGC1 */
560 case 0x118: /* SCGC2 */
563 case 0x120: /* DCGC0 */
566 case 0x124: /* DCGC1 */
569 case 0x128: /* DCGC2 */
572 case 0x150: /* CLKVCLR */
575 case 0x160: /* LDOARST */
579 hw_error("ssys_write: Bad offset 0x%x\n", (int)offset
);
584 static CPUReadMemoryFunc
* const ssys_readfn
[] = {
590 static CPUWriteMemoryFunc
* const ssys_writefn
[] = {
596 static void ssys_reset(void *opaque
)
598 ssys_state
*s
= (ssys_state
*)opaque
;
607 static void ssys_save(QEMUFile
*f
, void *opaque
)
609 ssys_state
*s
= (ssys_state
*)opaque
;
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
);
630 static int ssys_load(QEMUFile
*f
, void *opaque
, int version_id
)
632 ssys_state
*s
= (ssys_state
*)opaque
;
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
);
659 static int stellaris_sys_init(uint32_t base
, qemu_irq irq
,
660 stellaris_board_info
* board
,
666 s
= (ssys_state
*)qemu_mallocz(sizeof(ssys_state
));
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);
673 iomemtype
= cpu_register_io_memory(ssys_readfn
,
675 cpu_register_physical_memory(base
, 0x00001000, iomemtype
);
677 register_savevm(NULL
, "stellaris_sys", -1, 1, ssys_save
, ssys_load
, s
);
682 /* I2C controller. */
695 } stellaris_i2c_state
;
697 #define STELLARIS_I2C_MCS_BUSY 0x01
698 #define STELLARIS_I2C_MCS_ERROR 0x02
699 #define STELLARIS_I2C_MCS_ADRACK 0x04
700 #define STELLARIS_I2C_MCS_DATACK 0x08
701 #define STELLARIS_I2C_MCS_ARBLST 0x10
702 #define STELLARIS_I2C_MCS_IDLE 0x20
703 #define STELLARIS_I2C_MCS_BUSBSY 0x40
705 static uint32_t stellaris_i2c_read(void *opaque
, target_phys_addr_t offset
)
707 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
713 /* We don't emulate timing, so the controller is never busy. */
714 return s
->mcs
| STELLARIS_I2C_MCS_IDLE
;
717 case 0x0c: /* MTPR */
719 case 0x10: /* MIMR */
721 case 0x14: /* MRIS */
723 case 0x18: /* MMIS */
724 return s
->mris
& s
->mimr
;
728 hw_error("strllaris_i2c_read: Bad offset 0x%x\n", (int)offset
);
733 static void stellaris_i2c_update(stellaris_i2c_state
*s
)
737 level
= (s
->mris
& s
->mimr
) != 0;
738 qemu_set_irq(s
->irq
, level
);
741 static void stellaris_i2c_write(void *opaque
, target_phys_addr_t offset
,
744 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
748 s
->msa
= value
& 0xff;
751 if ((s
->mcr
& 0x10) == 0) {
752 /* Disabled. Do nothing. */
755 /* Grab the bus if this is starting a transfer. */
756 if ((value
& 2) && (s
->mcs
& STELLARIS_I2C_MCS_BUSBSY
) == 0) {
757 if (i2c_start_transfer(s
->bus
, s
->msa
>> 1, s
->msa
& 1)) {
758 s
->mcs
|= STELLARIS_I2C_MCS_ARBLST
;
760 s
->mcs
&= ~STELLARIS_I2C_MCS_ARBLST
;
761 s
->mcs
|= STELLARIS_I2C_MCS_BUSBSY
;
764 /* If we don't have the bus then indicate an error. */
765 if (!i2c_bus_busy(s
->bus
)
766 || (s
->mcs
& STELLARIS_I2C_MCS_BUSBSY
) == 0) {
767 s
->mcs
|= STELLARIS_I2C_MCS_ERROR
;
770 s
->mcs
&= ~STELLARIS_I2C_MCS_ERROR
;
772 /* Transfer a byte. */
773 /* TODO: Handle errors. */
776 s
->mdr
= i2c_recv(s
->bus
) & 0xff;
779 i2c_send(s
->bus
, s
->mdr
);
781 /* Raise an interrupt. */
785 /* Finish transfer. */
786 i2c_end_transfer(s
->bus
);
787 s
->mcs
&= ~STELLARIS_I2C_MCS_BUSBSY
;
791 s
->mdr
= value
& 0xff;
793 case 0x0c: /* MTPR */
794 s
->mtpr
= value
& 0xff;
796 case 0x10: /* MIMR */
799 case 0x1c: /* MICR */
805 "stellaris_i2c_write: Loopback not implemented\n");
808 "stellaris_i2c_write: Slave mode not implemented\n");
809 s
->mcr
= value
& 0x31;
812 hw_error("stellaris_i2c_write: Bad offset 0x%x\n",
815 stellaris_i2c_update(s
);
818 static void stellaris_i2c_reset(stellaris_i2c_state
*s
)
820 if (s
->mcs
& STELLARIS_I2C_MCS_BUSBSY
)
821 i2c_end_transfer(s
->bus
);
830 stellaris_i2c_update(s
);
833 static CPUReadMemoryFunc
* const stellaris_i2c_readfn
[] = {
839 static CPUWriteMemoryFunc
* const stellaris_i2c_writefn
[] = {
845 static void stellaris_i2c_save(QEMUFile
*f
, void *opaque
)
847 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
849 qemu_put_be32(f
, s
->msa
);
850 qemu_put_be32(f
, s
->mcs
);
851 qemu_put_be32(f
, s
->mdr
);
852 qemu_put_be32(f
, s
->mtpr
);
853 qemu_put_be32(f
, s
->mimr
);
854 qemu_put_be32(f
, s
->mris
);
855 qemu_put_be32(f
, s
->mcr
);
858 static int stellaris_i2c_load(QEMUFile
*f
, void *opaque
, int version_id
)
860 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
865 s
->msa
= qemu_get_be32(f
);
866 s
->mcs
= qemu_get_be32(f
);
867 s
->mdr
= qemu_get_be32(f
);
868 s
->mtpr
= qemu_get_be32(f
);
869 s
->mimr
= qemu_get_be32(f
);
870 s
->mris
= qemu_get_be32(f
);
871 s
->mcr
= qemu_get_be32(f
);
876 static int stellaris_i2c_init(SysBusDevice
* dev
)
878 stellaris_i2c_state
*s
= FROM_SYSBUS(stellaris_i2c_state
, dev
);
882 sysbus_init_irq(dev
, &s
->irq
);
883 bus
= i2c_init_bus(&dev
->qdev
, "i2c");
886 iomemtype
= cpu_register_io_memory(stellaris_i2c_readfn
,
887 stellaris_i2c_writefn
, s
);
888 sysbus_init_mmio(dev
, 0x1000, iomemtype
);
889 /* ??? For now we only implement the master interface. */
890 stellaris_i2c_reset(s
);
891 register_savevm(&dev
->qdev
, "stellaris_i2c", -1, 1,
892 stellaris_i2c_save
, stellaris_i2c_load
, s
);
896 /* Analogue to Digital Converter. This is only partially implemented,
897 enough for applications that use a combined ADC and timer tick. */
899 #define STELLARIS_ADC_EM_CONTROLLER 0
900 #define STELLARIS_ADC_EM_COMP 1
901 #define STELLARIS_ADC_EM_EXTERNAL 4
902 #define STELLARIS_ADC_EM_TIMER 5
903 #define STELLARIS_ADC_EM_PWM0 6
904 #define STELLARIS_ADC_EM_PWM1 7
905 #define STELLARIS_ADC_EM_PWM2 8
907 #define STELLARIS_ADC_FIFO_EMPTY 0x0100
908 #define STELLARIS_ADC_FIFO_FULL 0x1000
929 } stellaris_adc_state
;
931 static uint32_t stellaris_adc_fifo_read(stellaris_adc_state
*s
, int n
)
935 tail
= s
->fifo
[n
].state
& 0xf;
936 if (s
->fifo
[n
].state
& STELLARIS_ADC_FIFO_EMPTY
) {
939 s
->fifo
[n
].state
= (s
->fifo
[n
].state
& ~0xf) | ((tail
+ 1) & 0xf);
940 s
->fifo
[n
].state
&= ~STELLARIS_ADC_FIFO_FULL
;
941 if (tail
+ 1 == ((s
->fifo
[n
].state
>> 4) & 0xf))
942 s
->fifo
[n
].state
|= STELLARIS_ADC_FIFO_EMPTY
;
944 return s
->fifo
[n
].data
[tail
];
947 static void stellaris_adc_fifo_write(stellaris_adc_state
*s
, int n
,
952 /* TODO: Real hardware has limited size FIFOs. We have a full 16 entry
953 FIFO fir each sequencer. */
954 head
= (s
->fifo
[n
].state
>> 4) & 0xf;
955 if (s
->fifo
[n
].state
& STELLARIS_ADC_FIFO_FULL
) {
959 s
->fifo
[n
].data
[head
] = value
;
960 head
= (head
+ 1) & 0xf;
961 s
->fifo
[n
].state
&= ~STELLARIS_ADC_FIFO_EMPTY
;
962 s
->fifo
[n
].state
= (s
->fifo
[n
].state
& ~0xf0) | (head
<< 4);
963 if ((s
->fifo
[n
].state
& 0xf) == head
)
964 s
->fifo
[n
].state
|= STELLARIS_ADC_FIFO_FULL
;
967 static void stellaris_adc_update(stellaris_adc_state
*s
)
972 for (n
= 0; n
< 4; n
++) {
973 level
= (s
->ris
& s
->im
& (1 << n
)) != 0;
974 qemu_set_irq(s
->irq
[n
], level
);
978 static void stellaris_adc_trigger(void *opaque
, int irq
, int level
)
980 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
983 for (n
= 0; n
< 4; n
++) {
984 if ((s
->actss
& (1 << n
)) == 0) {
988 if (((s
->emux
>> (n
* 4)) & 0xff) != 5) {
992 /* Some applications use the ADC as a random number source, so introduce
993 some variation into the signal. */
994 s
->noise
= s
->noise
* 314159 + 1;
995 /* ??? actual inputs not implemented. Return an arbitrary value. */
996 stellaris_adc_fifo_write(s
, n
, 0x200 + ((s
->noise
>> 16) & 7));
998 stellaris_adc_update(s
);
1002 static void stellaris_adc_reset(stellaris_adc_state
*s
)
1006 for (n
= 0; n
< 4; n
++) {
1009 s
->fifo
[n
].state
= STELLARIS_ADC_FIFO_EMPTY
;
1013 static uint32_t stellaris_adc_read(void *opaque
, target_phys_addr_t offset
)
1015 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1017 /* TODO: Implement this. */
1018 if (offset
>= 0x40 && offset
< 0xc0) {
1020 n
= (offset
- 0x40) >> 5;
1021 switch (offset
& 0x1f) {
1022 case 0x00: /* SSMUX */
1024 case 0x04: /* SSCTL */
1026 case 0x08: /* SSFIFO */
1027 return stellaris_adc_fifo_read(s
, n
);
1028 case 0x0c: /* SSFSTAT */
1029 return s
->fifo
[n
].state
;
1035 case 0x00: /* ACTSS */
1037 case 0x04: /* RIS */
1041 case 0x0c: /* ISC */
1042 return s
->ris
& s
->im
;
1043 case 0x10: /* OSTAT */
1045 case 0x14: /* EMUX */
1047 case 0x18: /* USTAT */
1049 case 0x20: /* SSPRI */
1051 case 0x30: /* SAC */
1054 hw_error("strllaris_adc_read: Bad offset 0x%x\n",
1060 static void stellaris_adc_write(void *opaque
, target_phys_addr_t offset
,
1063 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1065 /* TODO: Implement this. */
1066 if (offset
>= 0x40 && offset
< 0xc0) {
1068 n
= (offset
- 0x40) >> 5;
1069 switch (offset
& 0x1f) {
1070 case 0x00: /* SSMUX */
1071 s
->ssmux
[n
] = value
& 0x33333333;
1073 case 0x04: /* SSCTL */
1075 hw_error("ADC: Unimplemented sequence %x\n",
1078 s
->ssctl
[n
] = value
;
1085 case 0x00: /* ACTSS */
1086 s
->actss
= value
& 0xf;
1091 case 0x0c: /* ISC */
1094 case 0x10: /* OSTAT */
1097 case 0x14: /* EMUX */
1100 case 0x18: /* USTAT */
1103 case 0x20: /* SSPRI */
1106 case 0x28: /* PSSI */
1107 hw_error("Not implemented: ADC sample initiate\n");
1109 case 0x30: /* SAC */
1113 hw_error("stellaris_adc_write: Bad offset 0x%x\n", (int)offset
);
1115 stellaris_adc_update(s
);
1118 static CPUReadMemoryFunc
* const stellaris_adc_readfn
[] = {
1124 static CPUWriteMemoryFunc
* const stellaris_adc_writefn
[] = {
1125 stellaris_adc_write
,
1126 stellaris_adc_write
,
1130 static void stellaris_adc_save(QEMUFile
*f
, void *opaque
)
1132 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1136 qemu_put_be32(f
, s
->actss
);
1137 qemu_put_be32(f
, s
->ris
);
1138 qemu_put_be32(f
, s
->im
);
1139 qemu_put_be32(f
, s
->emux
);
1140 qemu_put_be32(f
, s
->ostat
);
1141 qemu_put_be32(f
, s
->ustat
);
1142 qemu_put_be32(f
, s
->sspri
);
1143 qemu_put_be32(f
, s
->sac
);
1144 for (i
= 0; i
< 4; i
++) {
1145 qemu_put_be32(f
, s
->fifo
[i
].state
);
1146 for (j
= 0; j
< 16; j
++) {
1147 qemu_put_be32(f
, s
->fifo
[i
].data
[j
]);
1149 qemu_put_be32(f
, s
->ssmux
[i
]);
1150 qemu_put_be32(f
, s
->ssctl
[i
]);
1152 qemu_put_be32(f
, s
->noise
);
1155 static int stellaris_adc_load(QEMUFile
*f
, void *opaque
, int version_id
)
1157 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1161 if (version_id
!= 1)
1164 s
->actss
= qemu_get_be32(f
);
1165 s
->ris
= qemu_get_be32(f
);
1166 s
->im
= qemu_get_be32(f
);
1167 s
->emux
= qemu_get_be32(f
);
1168 s
->ostat
= qemu_get_be32(f
);
1169 s
->ustat
= qemu_get_be32(f
);
1170 s
->sspri
= qemu_get_be32(f
);
1171 s
->sac
= qemu_get_be32(f
);
1172 for (i
= 0; i
< 4; i
++) {
1173 s
->fifo
[i
].state
= qemu_get_be32(f
);
1174 for (j
= 0; j
< 16; j
++) {
1175 s
->fifo
[i
].data
[j
] = qemu_get_be32(f
);
1177 s
->ssmux
[i
] = qemu_get_be32(f
);
1178 s
->ssctl
[i
] = qemu_get_be32(f
);
1180 s
->noise
= qemu_get_be32(f
);
1185 static int stellaris_adc_init(SysBusDevice
*dev
)
1187 stellaris_adc_state
*s
= FROM_SYSBUS(stellaris_adc_state
, dev
);
1191 for (n
= 0; n
< 4; n
++) {
1192 sysbus_init_irq(dev
, &s
->irq
[n
]);
1195 iomemtype
= cpu_register_io_memory(stellaris_adc_readfn
,
1196 stellaris_adc_writefn
, s
);
1197 sysbus_init_mmio(dev
, 0x1000, iomemtype
);
1198 stellaris_adc_reset(s
);
1199 qdev_init_gpio_in(&dev
->qdev
, stellaris_adc_trigger
, 1);
1200 register_savevm(&dev
->qdev
, "stellaris_adc", -1, 1,
1201 stellaris_adc_save
, stellaris_adc_load
, s
);
1205 /* Some boards have both an OLED controller and SD card connected to
1206 the same SSI port, with the SD card chip select connected to a
1207 GPIO pin. Technically the OLED chip select is connected to the SSI
1208 Fss pin. We do not bother emulating that as both devices should
1209 never be selected simultaneously, and our OLED controller ignores stray
1210 0xff commands that occur when deselecting the SD card. */
1217 } stellaris_ssi_bus_state
;
1219 static void stellaris_ssi_bus_select(void *opaque
, int irq
, int level
)
1221 stellaris_ssi_bus_state
*s
= (stellaris_ssi_bus_state
*)opaque
;
1223 s
->current_dev
= level
;
1226 static uint32_t stellaris_ssi_bus_transfer(SSISlave
*dev
, uint32_t val
)
1228 stellaris_ssi_bus_state
*s
= FROM_SSI_SLAVE(stellaris_ssi_bus_state
, dev
);
1230 return ssi_transfer(s
->bus
[s
->current_dev
], val
);
1233 static void stellaris_ssi_bus_save(QEMUFile
*f
, void *opaque
)
1235 stellaris_ssi_bus_state
*s
= (stellaris_ssi_bus_state
*)opaque
;
1237 qemu_put_be32(f
, s
->current_dev
);
1240 static int stellaris_ssi_bus_load(QEMUFile
*f
, void *opaque
, int version_id
)
1242 stellaris_ssi_bus_state
*s
= (stellaris_ssi_bus_state
*)opaque
;
1244 if (version_id
!= 1)
1247 s
->current_dev
= qemu_get_be32(f
);
1252 static int stellaris_ssi_bus_init(SSISlave
*dev
)
1254 stellaris_ssi_bus_state
*s
= FROM_SSI_SLAVE(stellaris_ssi_bus_state
, dev
);
1256 s
->bus
[0] = ssi_create_bus(&dev
->qdev
, "ssi0");
1257 s
->bus
[1] = ssi_create_bus(&dev
->qdev
, "ssi1");
1258 qdev_init_gpio_in(&dev
->qdev
, stellaris_ssi_bus_select
, 1);
1260 register_savevm(&dev
->qdev
, "stellaris_ssi_bus", -1, 1,
1261 stellaris_ssi_bus_save
, stellaris_ssi_bus_load
, s
);
1266 static stellaris_board_info stellaris_boards
[] = {
1270 0x001f001f, /* dc0 */
1280 0x00ff007f, /* dc0 */
1285 BP_OLED_SSI
| BP_GAMEPAD
1289 static void stellaris_init(const char *kernel_filename
, const char *cpu_model
,
1290 stellaris_board_info
*board
)
1292 static const int uart_irq
[] = {5, 6, 33, 34};
1293 static const int timer_irq
[] = {19, 21, 23, 35};
1294 static const uint32_t gpio_addr
[7] =
1295 { 0x40004000, 0x40005000, 0x40006000, 0x40007000,
1296 0x40024000, 0x40025000, 0x40026000};
1297 static const int gpio_irq
[7] = {0, 1, 2, 3, 4, 30, 31};
1300 DeviceState
*gpio_dev
[7];
1301 qemu_irq gpio_in
[7][8];
1302 qemu_irq gpio_out
[7][8];
1311 flash_size
= ((board
->dc0
& 0xffff) + 1) << 1;
1312 sram_size
= (board
->dc0
>> 18) + 1;
1313 pic
= armv7m_init(flash_size
, sram_size
, kernel_filename
, cpu_model
);
1315 if (board
->dc1
& (1 << 16)) {
1316 dev
= sysbus_create_varargs("stellaris-adc", 0x40038000,
1317 pic
[14], pic
[15], pic
[16], pic
[17], NULL
);
1318 adc
= qdev_get_gpio_in(dev
, 0);
1322 for (i
= 0; i
< 4; i
++) {
1323 if (board
->dc2
& (0x10000 << i
)) {
1324 dev
= sysbus_create_simple("stellaris-gptm",
1325 0x40030000 + i
* 0x1000,
1327 /* TODO: This is incorrect, but we get away with it because
1328 the ADC output is only ever pulsed. */
1329 qdev_connect_gpio_out(dev
, 0, adc
);
1333 stellaris_sys_init(0x400fe000, pic
[28], board
, nd_table
[0].macaddr
);
1335 for (i
= 0; i
< 7; i
++) {
1336 if (board
->dc4
& (1 << i
)) {
1337 gpio_dev
[i
] = sysbus_create_simple("pl061", gpio_addr
[i
],
1339 for (j
= 0; j
< 8; j
++) {
1340 gpio_in
[i
][j
] = qdev_get_gpio_in(gpio_dev
[i
], j
);
1341 gpio_out
[i
][j
] = NULL
;
1346 if (board
->dc2
& (1 << 12)) {
1347 dev
= sysbus_create_simple("stellaris-i2c", 0x40020000, pic
[8]);
1348 i2c
= (i2c_bus
*)qdev_get_child_bus(dev
, "i2c");
1349 if (board
->peripherals
& BP_OLED_I2C
) {
1350 i2c_create_slave(i2c
, "ssd0303", 0x3d);
1354 for (i
= 0; i
< 4; i
++) {
1355 if (board
->dc2
& (1 << i
)) {
1356 sysbus_create_simple("pl011_luminary", 0x4000c000 + i
* 0x1000,
1360 if (board
->dc2
& (1 << 4)) {
1361 dev
= sysbus_create_simple("pl022", 0x40008000, pic
[7]);
1362 if (board
->peripherals
& BP_OLED_SSI
) {
1366 bus
= qdev_get_child_bus(dev
, "ssi");
1367 mux
= ssi_create_slave(bus
, "evb6965-ssi");
1368 gpio_out
[GPIO_D
][0] = qdev_get_gpio_in(mux
, 0);
1370 bus
= qdev_get_child_bus(mux
, "ssi0");
1371 ssi_create_slave(bus
, "ssi-sd");
1373 bus
= qdev_get_child_bus(mux
, "ssi1");
1374 dev
= ssi_create_slave(bus
, "ssd0323");
1375 gpio_out
[GPIO_C
][7] = qdev_get_gpio_in(dev
, 0);
1377 /* Make sure the select pin is high. */
1378 qemu_irq_raise(gpio_out
[GPIO_D
][0]);
1381 if (board
->dc4
& (1 << 28)) {
1384 qemu_check_nic_model(&nd_table
[0], "stellaris");
1386 enet
= qdev_create(NULL
, "stellaris_enet");
1387 qdev_set_nic_properties(enet
, &nd_table
[0]);
1388 qdev_init_nofail(enet
);
1389 sysbus_mmio_map(sysbus_from_qdev(enet
), 0, 0x40048000);
1390 sysbus_connect_irq(sysbus_from_qdev(enet
), 0, pic
[42]);
1392 if (board
->peripherals
& BP_GAMEPAD
) {
1393 qemu_irq gpad_irq
[5];
1394 static const int gpad_keycode
[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d };
1396 gpad_irq
[0] = qemu_irq_invert(gpio_in
[GPIO_E
][0]); /* up */
1397 gpad_irq
[1] = qemu_irq_invert(gpio_in
[GPIO_E
][1]); /* down */
1398 gpad_irq
[2] = qemu_irq_invert(gpio_in
[GPIO_E
][2]); /* left */
1399 gpad_irq
[3] = qemu_irq_invert(gpio_in
[GPIO_E
][3]); /* right */
1400 gpad_irq
[4] = qemu_irq_invert(gpio_in
[GPIO_F
][1]); /* select */
1402 stellaris_gamepad_init(5, gpad_irq
, gpad_keycode
);
1404 for (i
= 0; i
< 7; i
++) {
1405 if (board
->dc4
& (1 << i
)) {
1406 for (j
= 0; j
< 8; j
++) {
1407 if (gpio_out
[i
][j
]) {
1408 qdev_connect_gpio_out(gpio_dev
[i
], j
, gpio_out
[i
][j
]);
1415 /* FIXME: Figure out how to generate these from stellaris_boards. */
1416 static void lm3s811evb_init(ram_addr_t ram_size
,
1417 const char *boot_device
,
1418 const char *kernel_filename
, const char *kernel_cmdline
,
1419 const char *initrd_filename
, const char *cpu_model
)
1421 stellaris_init(kernel_filename
, cpu_model
, &stellaris_boards
[0]);
1424 static void lm3s6965evb_init(ram_addr_t ram_size
,
1425 const char *boot_device
,
1426 const char *kernel_filename
, const char *kernel_cmdline
,
1427 const char *initrd_filename
, const char *cpu_model
)
1429 stellaris_init(kernel_filename
, cpu_model
, &stellaris_boards
[1]);
1432 static QEMUMachine lm3s811evb_machine
= {
1433 .name
= "lm3s811evb",
1434 .desc
= "Stellaris LM3S811EVB",
1435 .init
= lm3s811evb_init
,
1438 static QEMUMachine lm3s6965evb_machine
= {
1439 .name
= "lm3s6965evb",
1440 .desc
= "Stellaris LM3S6965EVB",
1441 .init
= lm3s6965evb_init
,
1444 static void stellaris_machine_init(void)
1446 qemu_register_machine(&lm3s811evb_machine
);
1447 qemu_register_machine(&lm3s6965evb_machine
);
1450 machine_init(stellaris_machine_init
);
1452 static SSISlaveInfo stellaris_ssi_bus_info
= {
1453 .qdev
.name
= "evb6965-ssi",
1454 .qdev
.size
= sizeof(stellaris_ssi_bus_state
),
1455 .init
= stellaris_ssi_bus_init
,
1456 .transfer
= stellaris_ssi_bus_transfer
1459 static void stellaris_register_devices(void)
1461 sysbus_register_dev("stellaris-i2c", sizeof(stellaris_i2c_state
),
1462 stellaris_i2c_init
);
1463 sysbus_register_dev("stellaris-gptm", sizeof(gptm_state
),
1464 stellaris_gptm_init
);
1465 sysbus_register_dev("stellaris-adc", sizeof(stellaris_adc_state
),
1466 stellaris_adc_init
);
1467 ssi_register_slave(&stellaris_ssi_bus_info
);
1470 device_init(stellaris_register_devices
)