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
+= 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
*gptm_readfn
[] = {
277 static CPUWriteMemoryFunc
*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 void 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(0, 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("stellaris_gptm", -1, 1, gptm_save
, gptm_load
, s
);
361 /* System controller. */
378 stellaris_board_info
*board
;
381 static void ssys_update(ssys_state
*s
)
383 qemu_set_irq(s
->irq
, (s
->int_status
& s
->int_mask
) != 0);
386 static uint32_t pllcfg_sandstorm
[16] = {
388 0x1ae0, /* 1.8432 Mhz */
390 0xd573, /* 2.4576 Mhz */
391 0x37a6, /* 3.57954 Mhz */
392 0x1ae2, /* 3.6864 Mhz */
394 0x98bc, /* 4.906 Mhz */
395 0x935b, /* 4.9152 Mhz */
397 0x4dee, /* 5.12 Mhz */
399 0x75db, /* 6.144 Mhz */
400 0x1ae6, /* 7.3728 Mhz */
402 0x585b /* 8.192 Mhz */
405 static uint32_t pllcfg_fury
[16] = {
407 0x1b20, /* 1.8432 Mhz */
409 0xf42b, /* 2.4576 Mhz */
410 0x37e3, /* 3.57954 Mhz */
411 0x1b21, /* 3.6864 Mhz */
413 0x98ee, /* 4.906 Mhz */
414 0xd5b4, /* 4.9152 Mhz */
416 0x4e27, /* 5.12 Mhz */
418 0xec1c, /* 6.144 Mhz */
419 0x1b23, /* 7.3728 Mhz */
421 0xb11c /* 8.192 Mhz */
424 static uint32_t ssys_read(void *opaque
, target_phys_addr_t offset
)
426 ssys_state
*s
= (ssys_state
*)opaque
;
429 case 0x000: /* DID0 */
430 return s
->board
->did0
;
431 case 0x004: /* DID1 */
432 return s
->board
->did1
;
433 case 0x008: /* DC0 */
434 return s
->board
->dc0
;
435 case 0x010: /* DC1 */
436 return s
->board
->dc1
;
437 case 0x014: /* DC2 */
438 return s
->board
->dc2
;
439 case 0x018: /* DC3 */
440 return s
->board
->dc3
;
441 case 0x01c: /* DC4 */
442 return s
->board
->dc4
;
443 case 0x030: /* PBORCTL */
445 case 0x034: /* LDOPCTL */
447 case 0x040: /* SRCR0 */
449 case 0x044: /* SRCR1 */
451 case 0x048: /* SRCR2 */
453 case 0x050: /* RIS */
454 return s
->int_status
;
455 case 0x054: /* IMC */
457 case 0x058: /* MISC */
458 return s
->int_status
& s
->int_mask
;
459 case 0x05c: /* RESC */
461 case 0x060: /* RCC */
463 case 0x064: /* PLLCFG */
466 xtal
= (s
->rcc
>> 6) & 0xf;
467 if (s
->board
->did0
& (1 << 16)) {
468 return pllcfg_fury
[xtal
];
470 return pllcfg_sandstorm
[xtal
];
473 case 0x100: /* RCGC0 */
475 case 0x104: /* RCGC1 */
477 case 0x108: /* RCGC2 */
479 case 0x110: /* SCGC0 */
481 case 0x114: /* SCGC1 */
483 case 0x118: /* SCGC2 */
485 case 0x120: /* DCGC0 */
487 case 0x124: /* DCGC1 */
489 case 0x128: /* DCGC2 */
491 case 0x150: /* CLKVCLR */
493 case 0x160: /* LDOARST */
495 case 0x1e0: /* USER0 */
497 case 0x1e4: /* USER1 */
500 hw_error("ssys_read: Bad offset 0x%x\n", (int)offset
);
505 static void ssys_calculate_system_clock(ssys_state
*s
)
507 system_clock_scale
= 5 * (((s
->rcc
>> 23) & 0xf) + 1);
510 static void ssys_write(void *opaque
, target_phys_addr_t offset
, uint32_t value
)
512 ssys_state
*s
= (ssys_state
*)opaque
;
515 case 0x030: /* PBORCTL */
516 s
->pborctl
= value
& 0xffff;
518 case 0x034: /* LDOPCTL */
519 s
->ldopctl
= value
& 0x1f;
521 case 0x040: /* SRCR0 */
522 case 0x044: /* SRCR1 */
523 case 0x048: /* SRCR2 */
524 fprintf(stderr
, "Peripheral reset not implemented\n");
526 case 0x054: /* IMC */
527 s
->int_mask
= value
& 0x7f;
529 case 0x058: /* MISC */
530 s
->int_status
&= ~value
;
532 case 0x05c: /* RESC */
533 s
->resc
= value
& 0x3f;
535 case 0x060: /* RCC */
536 if ((s
->rcc
& (1 << 13)) != 0 && (value
& (1 << 13)) == 0) {
538 s
->int_status
|= (1 << 6);
541 ssys_calculate_system_clock(s
);
543 case 0x100: /* RCGC0 */
546 case 0x104: /* RCGC1 */
549 case 0x108: /* RCGC2 */
552 case 0x110: /* SCGC0 */
555 case 0x114: /* SCGC1 */
558 case 0x118: /* SCGC2 */
561 case 0x120: /* DCGC0 */
564 case 0x124: /* DCGC1 */
567 case 0x128: /* DCGC2 */
570 case 0x150: /* CLKVCLR */
573 case 0x160: /* LDOARST */
577 hw_error("ssys_write: Bad offset 0x%x\n", (int)offset
);
582 static CPUReadMemoryFunc
*ssys_readfn
[] = {
588 static CPUWriteMemoryFunc
*ssys_writefn
[] = {
594 static void ssys_reset(void *opaque
)
596 ssys_state
*s
= (ssys_state
*)opaque
;
605 static void ssys_save(QEMUFile
*f
, void *opaque
)
607 ssys_state
*s
= (ssys_state
*)opaque
;
609 qemu_put_be32(f
, s
->pborctl
);
610 qemu_put_be32(f
, s
->ldopctl
);
611 qemu_put_be32(f
, s
->int_mask
);
612 qemu_put_be32(f
, s
->int_status
);
613 qemu_put_be32(f
, s
->resc
);
614 qemu_put_be32(f
, s
->rcc
);
615 qemu_put_be32(f
, s
->rcgc
[0]);
616 qemu_put_be32(f
, s
->rcgc
[1]);
617 qemu_put_be32(f
, s
->rcgc
[2]);
618 qemu_put_be32(f
, s
->scgc
[0]);
619 qemu_put_be32(f
, s
->scgc
[1]);
620 qemu_put_be32(f
, s
->scgc
[2]);
621 qemu_put_be32(f
, s
->dcgc
[0]);
622 qemu_put_be32(f
, s
->dcgc
[1]);
623 qemu_put_be32(f
, s
->dcgc
[2]);
624 qemu_put_be32(f
, s
->clkvclr
);
625 qemu_put_be32(f
, s
->ldoarst
);
628 static int ssys_load(QEMUFile
*f
, void *opaque
, int version_id
)
630 ssys_state
*s
= (ssys_state
*)opaque
;
635 s
->pborctl
= qemu_get_be32(f
);
636 s
->ldopctl
= qemu_get_be32(f
);
637 s
->int_mask
= qemu_get_be32(f
);
638 s
->int_status
= qemu_get_be32(f
);
639 s
->resc
= qemu_get_be32(f
);
640 s
->rcc
= qemu_get_be32(f
);
641 s
->rcgc
[0] = qemu_get_be32(f
);
642 s
->rcgc
[1] = qemu_get_be32(f
);
643 s
->rcgc
[2] = qemu_get_be32(f
);
644 s
->scgc
[0] = qemu_get_be32(f
);
645 s
->scgc
[1] = qemu_get_be32(f
);
646 s
->scgc
[2] = qemu_get_be32(f
);
647 s
->dcgc
[0] = qemu_get_be32(f
);
648 s
->dcgc
[1] = qemu_get_be32(f
);
649 s
->dcgc
[2] = qemu_get_be32(f
);
650 s
->clkvclr
= qemu_get_be32(f
);
651 s
->ldoarst
= qemu_get_be32(f
);
652 ssys_calculate_system_clock(s
);
657 static void stellaris_sys_init(uint32_t base
, qemu_irq irq
,
658 stellaris_board_info
* board
,
664 s
= (ssys_state
*)qemu_mallocz(sizeof(ssys_state
));
667 /* Most devices come preprogrammed with a MAC address in the user data. */
668 s
->user0
= macaddr
[0] | (macaddr
[1] << 8) | (macaddr
[2] << 16);
669 s
->user1
= macaddr
[3] | (macaddr
[4] << 8) | (macaddr
[5] << 16);
671 iomemtype
= cpu_register_io_memory(0, ssys_readfn
,
673 cpu_register_physical_memory(base
, 0x00001000, iomemtype
);
675 register_savevm("stellaris_sys", -1, 1, ssys_save
, ssys_load
, s
);
679 /* I2C controller. */
692 } stellaris_i2c_state
;
694 #define STELLARIS_I2C_MCS_BUSY 0x01
695 #define STELLARIS_I2C_MCS_ERROR 0x02
696 #define STELLARIS_I2C_MCS_ADRACK 0x04
697 #define STELLARIS_I2C_MCS_DATACK 0x08
698 #define STELLARIS_I2C_MCS_ARBLST 0x10
699 #define STELLARIS_I2C_MCS_IDLE 0x20
700 #define STELLARIS_I2C_MCS_BUSBSY 0x40
702 static uint32_t stellaris_i2c_read(void *opaque
, target_phys_addr_t offset
)
704 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
710 /* We don't emulate timing, so the controller is never busy. */
711 return s
->mcs
| STELLARIS_I2C_MCS_IDLE
;
714 case 0x0c: /* MTPR */
716 case 0x10: /* MIMR */
718 case 0x14: /* MRIS */
720 case 0x18: /* MMIS */
721 return s
->mris
& s
->mimr
;
725 hw_error("strllaris_i2c_read: Bad offset 0x%x\n", (int)offset
);
730 static void stellaris_i2c_update(stellaris_i2c_state
*s
)
734 level
= (s
->mris
& s
->mimr
) != 0;
735 qemu_set_irq(s
->irq
, level
);
738 static void stellaris_i2c_write(void *opaque
, target_phys_addr_t offset
,
741 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
745 s
->msa
= value
& 0xff;
748 if ((s
->mcr
& 0x10) == 0) {
749 /* Disabled. Do nothing. */
752 /* Grab the bus if this is starting a transfer. */
753 if ((value
& 2) && (s
->mcs
& STELLARIS_I2C_MCS_BUSBSY
) == 0) {
754 if (i2c_start_transfer(s
->bus
, s
->msa
>> 1, s
->msa
& 1)) {
755 s
->mcs
|= STELLARIS_I2C_MCS_ARBLST
;
757 s
->mcs
&= ~STELLARIS_I2C_MCS_ARBLST
;
758 s
->mcs
|= STELLARIS_I2C_MCS_BUSBSY
;
761 /* If we don't have the bus then indicate an error. */
762 if (!i2c_bus_busy(s
->bus
)
763 || (s
->mcs
& STELLARIS_I2C_MCS_BUSBSY
) == 0) {
764 s
->mcs
|= STELLARIS_I2C_MCS_ERROR
;
767 s
->mcs
&= ~STELLARIS_I2C_MCS_ERROR
;
769 /* Transfer a byte. */
770 /* TODO: Handle errors. */
773 s
->mdr
= i2c_recv(s
->bus
) & 0xff;
776 i2c_send(s
->bus
, s
->mdr
);
778 /* Raise an interrupt. */
782 /* Finish transfer. */
783 i2c_end_transfer(s
->bus
);
784 s
->mcs
&= ~STELLARIS_I2C_MCS_BUSBSY
;
788 s
->mdr
= value
& 0xff;
790 case 0x0c: /* MTPR */
791 s
->mtpr
= value
& 0xff;
793 case 0x10: /* MIMR */
796 case 0x1c: /* MICR */
802 "stellaris_i2c_write: Loopback not implemented\n");
805 "stellaris_i2c_write: Slave mode not implemented\n");
806 s
->mcr
= value
& 0x31;
809 hw_error("stellaris_i2c_write: Bad offset 0x%x\n",
812 stellaris_i2c_update(s
);
815 static void stellaris_i2c_reset(stellaris_i2c_state
*s
)
817 if (s
->mcs
& STELLARIS_I2C_MCS_BUSBSY
)
818 i2c_end_transfer(s
->bus
);
827 stellaris_i2c_update(s
);
830 static CPUReadMemoryFunc
*stellaris_i2c_readfn
[] = {
836 static CPUWriteMemoryFunc
*stellaris_i2c_writefn
[] = {
842 static void stellaris_i2c_save(QEMUFile
*f
, void *opaque
)
844 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
846 qemu_put_be32(f
, s
->msa
);
847 qemu_put_be32(f
, s
->mcs
);
848 qemu_put_be32(f
, s
->mdr
);
849 qemu_put_be32(f
, s
->mtpr
);
850 qemu_put_be32(f
, s
->mimr
);
851 qemu_put_be32(f
, s
->mris
);
852 qemu_put_be32(f
, s
->mcr
);
855 static int stellaris_i2c_load(QEMUFile
*f
, void *opaque
, int version_id
)
857 stellaris_i2c_state
*s
= (stellaris_i2c_state
*)opaque
;
862 s
->msa
= qemu_get_be32(f
);
863 s
->mcs
= qemu_get_be32(f
);
864 s
->mdr
= qemu_get_be32(f
);
865 s
->mtpr
= qemu_get_be32(f
);
866 s
->mimr
= qemu_get_be32(f
);
867 s
->mris
= qemu_get_be32(f
);
868 s
->mcr
= qemu_get_be32(f
);
873 static void stellaris_i2c_init(SysBusDevice
* dev
)
875 stellaris_i2c_state
*s
= FROM_SYSBUS(stellaris_i2c_state
, dev
);
879 sysbus_init_irq(dev
, &s
->irq
);
880 bus
= i2c_init_bus(&dev
->qdev
, "i2c");
883 iomemtype
= cpu_register_io_memory(0, stellaris_i2c_readfn
,
884 stellaris_i2c_writefn
, s
);
885 sysbus_init_mmio(dev
, 0x1000, iomemtype
);
886 /* ??? For now we only implement the master interface. */
887 stellaris_i2c_reset(s
);
888 register_savevm("stellaris_i2c", -1, 1,
889 stellaris_i2c_save
, stellaris_i2c_load
, s
);
892 /* Analogue to Digital Converter. This is only partially implemented,
893 enough for applications that use a combined ADC and timer tick. */
895 #define STELLARIS_ADC_EM_CONTROLLER 0
896 #define STELLARIS_ADC_EM_COMP 1
897 #define STELLARIS_ADC_EM_EXTERNAL 4
898 #define STELLARIS_ADC_EM_TIMER 5
899 #define STELLARIS_ADC_EM_PWM0 6
900 #define STELLARIS_ADC_EM_PWM1 7
901 #define STELLARIS_ADC_EM_PWM2 8
903 #define STELLARIS_ADC_FIFO_EMPTY 0x0100
904 #define STELLARIS_ADC_FIFO_FULL 0x1000
925 } stellaris_adc_state
;
927 static uint32_t stellaris_adc_fifo_read(stellaris_adc_state
*s
, int n
)
931 tail
= s
->fifo
[n
].state
& 0xf;
932 if (s
->fifo
[n
].state
& STELLARIS_ADC_FIFO_EMPTY
) {
935 s
->fifo
[n
].state
= (s
->fifo
[n
].state
& ~0xf) | ((tail
+ 1) & 0xf);
936 s
->fifo
[n
].state
&= ~STELLARIS_ADC_FIFO_FULL
;
937 if (tail
+ 1 == ((s
->fifo
[n
].state
>> 4) & 0xf))
938 s
->fifo
[n
].state
|= STELLARIS_ADC_FIFO_EMPTY
;
940 return s
->fifo
[n
].data
[tail
];
943 static void stellaris_adc_fifo_write(stellaris_adc_state
*s
, int n
,
948 /* TODO: Real hardware has limited size FIFOs. We have a full 16 entry
949 FIFO fir each sequencer. */
950 head
= (s
->fifo
[n
].state
>> 4) & 0xf;
951 if (s
->fifo
[n
].state
& STELLARIS_ADC_FIFO_FULL
) {
955 s
->fifo
[n
].data
[head
] = value
;
956 head
= (head
+ 1) & 0xf;
957 s
->fifo
[n
].state
&= ~STELLARIS_ADC_FIFO_EMPTY
;
958 s
->fifo
[n
].state
= (s
->fifo
[n
].state
& ~0xf0) | (head
<< 4);
959 if ((s
->fifo
[n
].state
& 0xf) == head
)
960 s
->fifo
[n
].state
|= STELLARIS_ADC_FIFO_FULL
;
963 static void stellaris_adc_update(stellaris_adc_state
*s
)
968 for (n
= 0; n
< 4; n
++) {
969 level
= (s
->ris
& s
->im
& (1 << n
)) != 0;
970 qemu_set_irq(s
->irq
[n
], level
);
974 static void stellaris_adc_trigger(void *opaque
, int irq
, int level
)
976 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
979 for (n
= 0; n
< 4; n
++) {
980 if ((s
->actss
& (1 << n
)) == 0) {
984 if (((s
->emux
>> (n
* 4)) & 0xff) != 5) {
988 /* Some applications use the ADC as a random number source, so introduce
989 some variation into the signal. */
990 s
->noise
= s
->noise
* 314159 + 1;
991 /* ??? actual inputs not implemented. Return an arbitrary value. */
992 stellaris_adc_fifo_write(s
, n
, 0x200 + ((s
->noise
>> 16) & 7));
994 stellaris_adc_update(s
);
998 static void stellaris_adc_reset(stellaris_adc_state
*s
)
1002 for (n
= 0; n
< 4; n
++) {
1005 s
->fifo
[n
].state
= STELLARIS_ADC_FIFO_EMPTY
;
1009 static uint32_t stellaris_adc_read(void *opaque
, target_phys_addr_t offset
)
1011 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1013 /* TODO: Implement this. */
1014 if (offset
>= 0x40 && offset
< 0xc0) {
1016 n
= (offset
- 0x40) >> 5;
1017 switch (offset
& 0x1f) {
1018 case 0x00: /* SSMUX */
1020 case 0x04: /* SSCTL */
1022 case 0x08: /* SSFIFO */
1023 return stellaris_adc_fifo_read(s
, n
);
1024 case 0x0c: /* SSFSTAT */
1025 return s
->fifo
[n
].state
;
1031 case 0x00: /* ACTSS */
1033 case 0x04: /* RIS */
1037 case 0x0c: /* ISC */
1038 return s
->ris
& s
->im
;
1039 case 0x10: /* OSTAT */
1041 case 0x14: /* EMUX */
1043 case 0x18: /* USTAT */
1045 case 0x20: /* SSPRI */
1047 case 0x30: /* SAC */
1050 hw_error("strllaris_adc_read: Bad offset 0x%x\n",
1056 static void stellaris_adc_write(void *opaque
, target_phys_addr_t offset
,
1059 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1061 /* TODO: Implement this. */
1062 if (offset
>= 0x40 && offset
< 0xc0) {
1064 n
= (offset
- 0x40) >> 5;
1065 switch (offset
& 0x1f) {
1066 case 0x00: /* SSMUX */
1067 s
->ssmux
[n
] = value
& 0x33333333;
1069 case 0x04: /* SSCTL */
1071 hw_error("ADC: Unimplemented sequence %x\n",
1074 s
->ssctl
[n
] = value
;
1081 case 0x00: /* ACTSS */
1082 s
->actss
= value
& 0xf;
1087 case 0x0c: /* ISC */
1090 case 0x10: /* OSTAT */
1093 case 0x14: /* EMUX */
1096 case 0x18: /* USTAT */
1099 case 0x20: /* SSPRI */
1102 case 0x28: /* PSSI */
1103 hw_error("Not implemented: ADC sample initiate\n");
1105 case 0x30: /* SAC */
1109 hw_error("stellaris_adc_write: Bad offset 0x%x\n", (int)offset
);
1111 stellaris_adc_update(s
);
1114 static CPUReadMemoryFunc
*stellaris_adc_readfn
[] = {
1120 static CPUWriteMemoryFunc
*stellaris_adc_writefn
[] = {
1121 stellaris_adc_write
,
1122 stellaris_adc_write
,
1126 static void stellaris_adc_save(QEMUFile
*f
, void *opaque
)
1128 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1132 qemu_put_be32(f
, s
->actss
);
1133 qemu_put_be32(f
, s
->ris
);
1134 qemu_put_be32(f
, s
->im
);
1135 qemu_put_be32(f
, s
->emux
);
1136 qemu_put_be32(f
, s
->ostat
);
1137 qemu_put_be32(f
, s
->ustat
);
1138 qemu_put_be32(f
, s
->sspri
);
1139 qemu_put_be32(f
, s
->sac
);
1140 for (i
= 0; i
< 4; i
++) {
1141 qemu_put_be32(f
, s
->fifo
[i
].state
);
1142 for (j
= 0; j
< 16; j
++) {
1143 qemu_put_be32(f
, s
->fifo
[i
].data
[j
]);
1145 qemu_put_be32(f
, s
->ssmux
[i
]);
1146 qemu_put_be32(f
, s
->ssctl
[i
]);
1148 qemu_put_be32(f
, s
->noise
);
1151 static int stellaris_adc_load(QEMUFile
*f
, void *opaque
, int version_id
)
1153 stellaris_adc_state
*s
= (stellaris_adc_state
*)opaque
;
1157 if (version_id
!= 1)
1160 s
->actss
= qemu_get_be32(f
);
1161 s
->ris
= qemu_get_be32(f
);
1162 s
->im
= qemu_get_be32(f
);
1163 s
->emux
= qemu_get_be32(f
);
1164 s
->ostat
= qemu_get_be32(f
);
1165 s
->ustat
= qemu_get_be32(f
);
1166 s
->sspri
= qemu_get_be32(f
);
1167 s
->sac
= qemu_get_be32(f
);
1168 for (i
= 0; i
< 4; i
++) {
1169 s
->fifo
[i
].state
= qemu_get_be32(f
);
1170 for (j
= 0; j
< 16; j
++) {
1171 s
->fifo
[i
].data
[j
] = qemu_get_be32(f
);
1173 s
->ssmux
[i
] = qemu_get_be32(f
);
1174 s
->ssctl
[i
] = qemu_get_be32(f
);
1176 s
->noise
= qemu_get_be32(f
);
1181 static void stellaris_adc_init(SysBusDevice
*dev
)
1183 stellaris_adc_state
*s
= FROM_SYSBUS(stellaris_adc_state
, dev
);
1187 for (n
= 0; n
< 4; n
++) {
1188 sysbus_init_irq(dev
, &s
->irq
[n
]);
1191 iomemtype
= cpu_register_io_memory(0, stellaris_adc_readfn
,
1192 stellaris_adc_writefn
, s
);
1193 sysbus_init_mmio(dev
, 0x1000, iomemtype
);
1194 stellaris_adc_reset(s
);
1195 qdev_init_gpio_in(&dev
->qdev
, stellaris_adc_trigger
, 1);
1196 register_savevm("stellaris_adc", -1, 1,
1197 stellaris_adc_save
, stellaris_adc_load
, s
);
1200 /* Some boards have both an OLED controller and SD card connected to
1201 the same SSI port, with the SD card chip select connected to a
1202 GPIO pin. Technically the OLED chip select is connected to the SSI
1203 Fss pin. We do not bother emulating that as both devices should
1204 never be selected simultaneously, and our OLED controller ignores stray
1205 0xff commands that occur when deselecting the SD card. */
1212 } stellaris_ssi_bus_state
;
1214 static void stellaris_ssi_bus_select(void *opaque
, int irq
, int level
)
1216 stellaris_ssi_bus_state
*s
= (stellaris_ssi_bus_state
*)opaque
;
1218 s
->current_dev
= level
;
1221 static uint32_t stellaris_ssi_bus_transfer(SSISlave
*dev
, uint32_t val
)
1223 stellaris_ssi_bus_state
*s
= FROM_SSI_SLAVE(stellaris_ssi_bus_state
, dev
);
1225 return ssi_transfer(s
->bus
[s
->current_dev
], val
);
1228 static void stellaris_ssi_bus_save(QEMUFile
*f
, void *opaque
)
1230 stellaris_ssi_bus_state
*s
= (stellaris_ssi_bus_state
*)opaque
;
1232 qemu_put_be32(f
, s
->current_dev
);
1235 static int stellaris_ssi_bus_load(QEMUFile
*f
, void *opaque
, int version_id
)
1237 stellaris_ssi_bus_state
*s
= (stellaris_ssi_bus_state
*)opaque
;
1239 if (version_id
!= 1)
1242 s
->current_dev
= qemu_get_be32(f
);
1247 static void stellaris_ssi_bus_init(SSISlave
*dev
)
1249 stellaris_ssi_bus_state
*s
= FROM_SSI_SLAVE(stellaris_ssi_bus_state
, dev
);
1251 s
->bus
[0] = ssi_create_bus(&dev
->qdev
, "ssi0");
1252 s
->bus
[1] = ssi_create_bus(&dev
->qdev
, "ssi1");
1253 qdev_init_gpio_in(&dev
->qdev
, stellaris_ssi_bus_select
, 1);
1255 register_savevm("stellaris_ssi_bus", -1, 1,
1256 stellaris_ssi_bus_save
, stellaris_ssi_bus_load
, s
);
1260 static stellaris_board_info stellaris_boards
[] = {
1264 0x001f001f, /* dc0 */
1274 0x00ff007f, /* dc0 */
1279 BP_OLED_SSI
| BP_GAMEPAD
1283 static void stellaris_init(const char *kernel_filename
, const char *cpu_model
,
1284 stellaris_board_info
*board
)
1286 static const int uart_irq
[] = {5, 6, 33, 34};
1287 static const int timer_irq
[] = {19, 21, 23, 35};
1288 static const uint32_t gpio_addr
[7] =
1289 { 0x40004000, 0x40005000, 0x40006000, 0x40007000,
1290 0x40024000, 0x40025000, 0x40026000};
1291 static const int gpio_irq
[7] = {0, 1, 2, 3, 4, 30, 31};
1294 DeviceState
*gpio_dev
[7];
1295 qemu_irq gpio_in
[7][8];
1296 qemu_irq gpio_out
[7][8];
1305 flash_size
= ((board
->dc0
& 0xffff) + 1) << 1;
1306 sram_size
= (board
->dc0
>> 18) + 1;
1307 pic
= armv7m_init(flash_size
, sram_size
, kernel_filename
, cpu_model
);
1309 if (board
->dc1
& (1 << 16)) {
1310 dev
= sysbus_create_varargs("stellaris-adc", 0x40038000,
1311 pic
[14], pic
[15], pic
[16], pic
[17], NULL
);
1312 adc
= qdev_get_gpio_in(dev
, 0);
1316 for (i
= 0; i
< 4; i
++) {
1317 if (board
->dc2
& (0x10000 << i
)) {
1318 dev
= sysbus_create_simple("stellaris-gptm",
1319 0x40030000 + i
* 0x1000,
1321 /* TODO: This is incorrect, but we get away with it because
1322 the ADC output is only ever pulsed. */
1323 qdev_connect_gpio_out(dev
, 0, adc
);
1327 stellaris_sys_init(0x400fe000, pic
[28], board
, nd_table
[0].macaddr
);
1329 for (i
= 0; i
< 7; i
++) {
1330 if (board
->dc4
& (1 << i
)) {
1331 gpio_dev
[i
] = sysbus_create_simple("pl061", gpio_addr
[i
],
1333 for (j
= 0; j
< 8; j
++) {
1334 gpio_in
[i
][j
] = qdev_get_gpio_in(gpio_dev
[i
], j
);
1335 gpio_out
[i
][j
] = NULL
;
1340 if (board
->dc2
& (1 << 12)) {
1341 dev
= sysbus_create_simple("stellaris-i2c", 0x40020000, pic
[8]);
1342 i2c
= (i2c_bus
*)qdev_get_child_bus(dev
, "i2c");
1343 if (board
->peripherals
& BP_OLED_I2C
) {
1344 i2c_create_slave(i2c
, "ssd0303", 0x3d);
1348 for (i
= 0; i
< 4; i
++) {
1349 if (board
->dc2
& (1 << i
)) {
1350 sysbus_create_simple("pl011_luminary", 0x4000c000 + i
* 0x1000,
1354 if (board
->dc2
& (1 << 4)) {
1355 dev
= sysbus_create_simple("pl022", 0x40008000, pic
[7]);
1356 if (board
->peripherals
& BP_OLED_SSI
) {
1360 bus
= qdev_get_child_bus(dev
, "ssi");
1361 mux
= ssi_create_slave(bus
, "evb6965-ssi");
1362 gpio_out
[GPIO_D
][0] = qdev_get_gpio_in(mux
, 0);
1364 bus
= qdev_get_child_bus(mux
, "ssi0");
1365 dev
= ssi_create_slave(bus
, "ssi-sd");
1367 bus
= qdev_get_child_bus(mux
, "ssi1");
1368 dev
= ssi_create_slave(bus
, "ssd0323");
1369 gpio_out
[GPIO_C
][7] = qdev_get_gpio_in(dev
, 0);
1371 /* Make sure the select pin is high. */
1372 qemu_irq_raise(gpio_out
[GPIO_D
][0]);
1375 if (board
->dc4
& (1 << 28)) {
1378 qemu_check_nic_model(&nd_table
[0], "stellaris");
1380 enet
= qdev_create(NULL
, "stellaris_enet");
1381 qdev_set_netdev(enet
, &nd_table
[0]);
1383 sysbus_mmio_map(sysbus_from_qdev(enet
), 0, 0x40048000);
1384 sysbus_connect_irq(sysbus_from_qdev(enet
), 0, pic
[42]);
1386 if (board
->peripherals
& BP_GAMEPAD
) {
1387 qemu_irq gpad_irq
[5];
1388 static const int gpad_keycode
[5] = { 0xc8, 0xd0, 0xcb, 0xcd, 0x1d };
1390 gpad_irq
[0] = qemu_irq_invert(gpio_in
[GPIO_E
][0]); /* up */
1391 gpad_irq
[1] = qemu_irq_invert(gpio_in
[GPIO_E
][1]); /* down */
1392 gpad_irq
[2] = qemu_irq_invert(gpio_in
[GPIO_E
][2]); /* left */
1393 gpad_irq
[3] = qemu_irq_invert(gpio_in
[GPIO_E
][3]); /* right */
1394 gpad_irq
[4] = qemu_irq_invert(gpio_in
[GPIO_F
][1]); /* select */
1396 stellaris_gamepad_init(5, gpad_irq
, gpad_keycode
);
1398 for (i
= 0; i
< 7; i
++) {
1399 if (board
->dc4
& (1 << i
)) {
1400 for (j
= 0; j
< 8; j
++) {
1401 if (gpio_out
[i
][j
]) {
1402 qdev_connect_gpio_out(gpio_dev
[i
], j
, gpio_out
[i
][j
]);
1409 /* FIXME: Figure out how to generate these from stellaris_boards. */
1410 static void lm3s811evb_init(ram_addr_t ram_size
,
1411 const char *boot_device
,
1412 const char *kernel_filename
, const char *kernel_cmdline
,
1413 const char *initrd_filename
, const char *cpu_model
)
1415 stellaris_init(kernel_filename
, cpu_model
, &stellaris_boards
[0]);
1418 static void lm3s6965evb_init(ram_addr_t ram_size
,
1419 const char *boot_device
,
1420 const char *kernel_filename
, const char *kernel_cmdline
,
1421 const char *initrd_filename
, const char *cpu_model
)
1423 stellaris_init(kernel_filename
, cpu_model
, &stellaris_boards
[1]);
1426 static QEMUMachine lm3s811evb_machine
= {
1427 .name
= "lm3s811evb",
1428 .desc
= "Stellaris LM3S811EVB",
1429 .init
= lm3s811evb_init
,
1432 static QEMUMachine lm3s6965evb_machine
= {
1433 .name
= "lm3s6965evb",
1434 .desc
= "Stellaris LM3S6965EVB",
1435 .init
= lm3s6965evb_init
,
1438 static void stellaris_machine_init(void)
1440 qemu_register_machine(&lm3s811evb_machine
);
1441 qemu_register_machine(&lm3s6965evb_machine
);
1444 machine_init(stellaris_machine_init
);
1446 static SSISlaveInfo stellaris_ssi_bus_info
= {
1447 .init
= stellaris_ssi_bus_init
,
1448 .transfer
= stellaris_ssi_bus_transfer
1451 static void stellaris_register_devices(void)
1453 sysbus_register_dev("stellaris-i2c", sizeof(stellaris_i2c_state
),
1454 stellaris_i2c_init
);
1455 sysbus_register_dev("stellaris-gptm", sizeof(gptm_state
),
1456 stellaris_gptm_init
);
1457 sysbus_register_dev("stellaris-adc", sizeof(stellaris_adc_state
),
1458 stellaris_adc_init
);
1459 ssi_register_slave("evb6965-ssi", sizeof(stellaris_ssi_bus_state
),
1460 &stellaris_ssi_bus_info
);
1463 device_init(stellaris_register_devices
)