520
514
spitz_keyboard_save, spitz_keyboard_load, s);
525
struct scoop_info_s {
526
target_phys_addr_t target_base;
527
qemu_irq handler[16];
544
#define SCOOP_MCR 0x00
545
#define SCOOP_CDR 0x04
546
#define SCOOP_CSR 0x08
547
#define SCOOP_CPR 0x0c
548
#define SCOOP_CCR 0x10
549
#define SCOOP_IRR_IRM 0x14
550
#define SCOOP_IMR 0x18
551
#define SCOOP_ISR 0x1c
552
#define SCOOP_GPCR 0x20
553
#define SCOOP_GPWR 0x24
554
#define SCOOP_GPRR 0x28
556
static inline void scoop_gpio_handler_update(struct scoop_info_s *s) {
557
uint32_t level, diff;
559
level = s->gpio_level & s->gpio_dir;
561
for (diff = s->prev_level ^ level; diff; diff ^= 1 << bit) {
563
qemu_set_irq(s->handler[bit], (level >> bit) & 1);
566
s->prev_level = level;
569
static uint32_t scoop_readb(void *opaque, target_phys_addr_t addr)
571
struct scoop_info_s *s = (struct scoop_info_s *) opaque;
572
addr -= s->target_base;
594
return s->gpio_level;
598
spitz_printf("Bad register offset " REG_FMT "\n", addr);
604
static void scoop_writeb(void *opaque, target_phys_addr_t addr, uint32_t value)
606
struct scoop_info_s *s = (struct scoop_info_s *) opaque;
607
addr -= s->target_base;
636
scoop_gpio_handler_update(s);
639
s->gpio_level = value & s->gpio_dir;
640
scoop_gpio_handler_update(s);
646
spitz_printf("Bad register offset " REG_FMT "\n", addr);
650
CPUReadMemoryFunc *scoop_readfn[] = {
655
CPUWriteMemoryFunc *scoop_writefn[] = {
661
static void scoop_gpio_set(void *opaque, int line, int level)
663
struct scoop_info_s *s = (struct scoop_info_s *) s;
666
s->gpio_level |= (1 << line);
668
s->gpio_level &= ~(1 << line);
671
static inline qemu_irq *scoop_gpio_in_get(struct scoop_info_s *s)
676
static inline void scoop_gpio_out_set(struct scoop_info_s *s, int line,
679
spitz_printf("No GPIO pin %i\n", line);
683
s->handler[line] = handler;
686
static void scoop_save(QEMUFile *f, void *opaque)
688
struct scoop_info_s *s = (struct scoop_info_s *) opaque;
689
qemu_put_be16s(f, &s->status);
690
qemu_put_be16s(f, &s->power);
691
qemu_put_be32s(f, &s->gpio_level);
692
qemu_put_be32s(f, &s->gpio_dir);
693
qemu_put_be32s(f, &s->prev_level);
694
qemu_put_be16s(f, &s->mcr);
695
qemu_put_be16s(f, &s->cdr);
696
qemu_put_be16s(f, &s->ccr);
697
qemu_put_be16s(f, &s->irr);
698
qemu_put_be16s(f, &s->imr);
699
qemu_put_be16s(f, &s->isr);
700
qemu_put_be16s(f, &s->gprr);
703
static int scoop_load(QEMUFile *f, void *opaque, int version_id)
705
struct scoop_info_s *s = (struct scoop_info_s *) opaque;
706
qemu_get_be16s(f, &s->status);
707
qemu_get_be16s(f, &s->power);
708
qemu_get_be32s(f, &s->gpio_level);
709
qemu_get_be32s(f, &s->gpio_dir);
710
qemu_get_be32s(f, &s->prev_level);
711
qemu_get_be16s(f, &s->mcr);
712
qemu_get_be16s(f, &s->cdr);
713
qemu_get_be16s(f, &s->ccr);
714
qemu_get_be16s(f, &s->irr);
715
qemu_get_be16s(f, &s->imr);
716
qemu_get_be16s(f, &s->isr);
717
qemu_get_be16s(f, &s->gprr);
722
static struct scoop_info_s *spitz_scoop_init(struct pxa2xx_state_s *cpu,
725
struct scoop_info_s *s;
727
s = (struct scoop_info_s *)
728
qemu_mallocz(sizeof(struct scoop_info_s) * 2);
729
memset(s, 0, sizeof(struct scoop_info_s) * count);
730
s[0].target_base = 0x10800000;
731
s[1].target_base = 0x08800040;
737
s[0].in = qemu_allocate_irqs(scoop_gpio_set, &s[0], 16);
738
iomemtype = cpu_register_io_memory(0, scoop_readfn,
739
scoop_writefn, &s[0]);
740
cpu_register_physical_memory(s[0].target_base, 0x1000, iomemtype);
741
register_savevm("scoop", 0, 0, scoop_save, scoop_load, &s[0]);
746
s[1].in = qemu_allocate_irqs(scoop_gpio_set, &s[1], 16);
747
iomemtype = cpu_register_io_memory(0, scoop_readfn,
748
scoop_writefn, &s[1]);
749
cpu_register_physical_memory(s[1].target_base, 0x1000, iomemtype);
750
register_savevm("scoop", 1, 0, scoop_save, scoop_load, &s[1]);
755
517
/* LCD backlight controller */
757
519
#define LCDTG_RESCTL 0x00
1050
812
#define SPITZ_SCP2_MIC_BIAS 9
1052
814
static void spitz_scoop_gpio_setup(struct pxa2xx_state_s *cpu,
1053
struct scoop_info_s *scp, int num)
815
struct scoop_info_s *scp0, struct scoop_info_s *scp1)
1055
817
qemu_irq *outsignals = qemu_allocate_irqs(spitz_out_switch, cpu, 8);
1057
scoop_gpio_out_set(&scp[0], SPITZ_SCP_CHRG_ON, outsignals[0]);
1058
scoop_gpio_out_set(&scp[0], SPITZ_SCP_JK_B, outsignals[1]);
1059
scoop_gpio_out_set(&scp[0], SPITZ_SCP_LED_GREEN, outsignals[2]);
1060
scoop_gpio_out_set(&scp[0], SPITZ_SCP_LED_ORANGE, outsignals[3]);
819
scoop_gpio_out_set(scp0, SPITZ_SCP_CHRG_ON, outsignals[0]);
820
scoop_gpio_out_set(scp0, SPITZ_SCP_JK_B, outsignals[1]);
821
scoop_gpio_out_set(scp0, SPITZ_SCP_LED_GREEN, outsignals[2]);
822
scoop_gpio_out_set(scp0, SPITZ_SCP_LED_ORANGE, outsignals[3]);
1063
scoop_gpio_out_set(&scp[1], SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
1064
scoop_gpio_out_set(&scp[1], SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
825
scoop_gpio_out_set(scp1, SPITZ_SCP2_BACKLIGHT_CONT, outsignals[4]);
826
scoop_gpio_out_set(scp1, SPITZ_SCP2_BACKLIGHT_ON, outsignals[5]);
1067
scoop_gpio_out_set(&scp[0], SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
829
scoop_gpio_out_set(scp0, SPITZ_SCP_ADC_TEMP_ON, outsignals[6]);
1070
832
#define SPITZ_GPIO_HSYNC 22
1134
896
spitz_gpio_invert[4]);
1137
/* Write the bootloader parameters memory area. */
1139
#define MAGIC_CHG(a, b, c, d) ((d << 24) | (c << 16) | (b << 8) | a)
1141
struct __attribute__ ((__packed__)) sl_param_info {
1142
uint32_t comadj_keyword;
1145
uint32_t uuid_keyword;
1148
uint32_t touch_keyword;
1154
uint32_t adadj_keyword;
1157
uint32_t phad_keyword;
1159
} spitz_bootparam = {
1160
.comadj_keyword = MAGIC_CHG('C', 'M', 'A', 'D'),
1162
.uuid_keyword = MAGIC_CHG('U', 'U', 'I', 'D'),
1164
.touch_keyword = MAGIC_CHG('T', 'U', 'C', 'H'),
1166
.adadj_keyword = MAGIC_CHG('B', 'V', 'A', 'D'),
1168
.phad_keyword = MAGIC_CHG('P', 'H', 'A', 'D'),
1172
static void sl_bootparam_write(uint32_t ptr)
1174
memcpy(phys_ram_base + ptr, &spitz_bootparam,
1175
sizeof(struct sl_param_info));
1178
#define SL_PXA_PARAM_BASE 0xa0000a00
1180
899
/* Board init. */
1181
900
enum spitz_model_e { spitz, akita, borzoi, terrier };
1183
static void spitz_common_init(int ram_size, int vga_ram_size,
1184
DisplayState *ds, const char *kernel_filename,
902
#define SPITZ_RAM 0x04000000
903
#define SPITZ_ROM 0x00800000
905
static struct arm_boot_info spitz_binfo = {
906
.loader_start = PXA2XX_SDRAM_BASE,
907
.ram_size = 0x04000000,
910
static void spitz_common_init(ram_addr_t ram_size, int vga_ram_size,
911
const char *kernel_filename,
1185
912
const char *kernel_cmdline, const char *initrd_filename,
1186
913
const char *cpu_model, enum spitz_model_e model, int arm_id)
1188
uint32_t spitz_ram = 0x04000000;
1189
uint32_t spitz_rom = 0x00800000;
1190
915
struct pxa2xx_state_s *cpu;
1191
struct scoop_info_s *scp;
916
struct scoop_info_s *scp0, *scp1 = NULL;
1194
919
cpu_model = (model == terrier) ? "pxa270-c5" : "pxa270-c0";
1196
921
/* Setup CPU & memory */
1197
if (ram_size < spitz_ram + spitz_rom + PXA2XX_INTERNAL_SIZE) {
922
if (ram_size < SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE) {
1198
923
fprintf(stderr, "This platform requires %i bytes of memory\n",
1199
spitz_ram + spitz_rom + PXA2XX_INTERNAL_SIZE);
924
SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE);
1202
cpu = pxa270_init(spitz_ram, ds, cpu_model);
927
cpu = pxa270_init(spitz_binfo.ram_size, cpu_model);
1204
929
sl_flash_register(cpu, (model == spitz) ? FLASH_128M : FLASH_1024M);
1206
cpu_register_physical_memory(0, spitz_rom,
1207
qemu_ram_alloc(spitz_rom) | IO_MEM_ROM);
931
cpu_register_physical_memory(0, SPITZ_ROM,
932
qemu_ram_alloc(SPITZ_ROM) | IO_MEM_ROM);
1209
934
/* Setup peripherals */
1210
935
spitz_keyboard_register(cpu);
1212
937
spitz_ssp_attach(cpu);
1214
scp = spitz_scoop_init(cpu, (model == akita) ? 1 : 2);
939
scp0 = scoop_init(cpu, 0, 0x10800000);
940
if (model != akita) {
941
scp1 = scoop_init(cpu, 1, 0x08800040);
1216
spitz_scoop_gpio_setup(cpu, scp, (model == akita) ? 1 : 2);
944
spitz_scoop_gpio_setup(cpu, scp0, scp1);
1218
946
spitz_gpio_setup(cpu, (model == akita) ? 1 : 2);
1225
953
if (model == terrier)
1226
954
/* A 6.0 GB microdrive is permanently sitting in CF slot 1. */
1227
spitz_microdrive_attach(cpu);
955
spitz_microdrive_attach(cpu, 1);
1228
956
else if (model != akita)
1229
/* A 4.0 GB microdrive is permanently sitting in CF slot 1. */
1230
spitz_microdrive_attach(cpu);
957
/* A 4.0 GB microdrive is permanently sitting in CF slot 0. */
958
spitz_microdrive_attach(cpu, 0);
1232
960
/* Setup initial (reset) machine state */
1233
cpu->env->regs[15] = PXA2XX_SDRAM_BASE;
961
cpu->env->regs[15] = spitz_binfo.loader_start;
1235
arm_load_kernel(cpu->env, spitz_ram, kernel_filename, kernel_cmdline,
1236
initrd_filename, arm_id, PXA2XX_SDRAM_BASE);
963
spitz_binfo.kernel_filename = kernel_filename;
964
spitz_binfo.kernel_cmdline = kernel_cmdline;
965
spitz_binfo.initrd_filename = initrd_filename;
966
spitz_binfo.board_id = arm_id;
967
arm_load_kernel(cpu->env, &spitz_binfo);
1237
968
sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_SDRAM_BASE);
1240
static void spitz_init(int ram_size, int vga_ram_size,
1241
const char *boot_device, DisplayState *ds,
971
static void spitz_init(ram_addr_t ram_size, int vga_ram_size,
972
const char *boot_device,
1242
973
const char *kernel_filename, const char *kernel_cmdline,
1243
974
const char *initrd_filename, const char *cpu_model)
1245
spitz_common_init(ram_size, vga_ram_size, ds, kernel_filename,
976
spitz_common_init(ram_size, vga_ram_size, kernel_filename,
1246
977
kernel_cmdline, initrd_filename, cpu_model, spitz, 0x2c9);
1249
static void borzoi_init(int ram_size, int vga_ram_size,
1250
const char *boot_device, DisplayState *ds,
980
static void borzoi_init(ram_addr_t ram_size, int vga_ram_size,
981
const char *boot_device,
1251
982
const char *kernel_filename, const char *kernel_cmdline,
1252
983
const char *initrd_filename, const char *cpu_model)
1254
spitz_common_init(ram_size, vga_ram_size, ds, kernel_filename,
985
spitz_common_init(ram_size, vga_ram_size, kernel_filename,
1255
986
kernel_cmdline, initrd_filename, cpu_model, borzoi, 0x33f);
1258
static void akita_init(int ram_size, int vga_ram_size,
1259
const char *boot_device, DisplayState *ds,
989
static void akita_init(ram_addr_t ram_size, int vga_ram_size,
990
const char *boot_device,
1260
991
const char *kernel_filename, const char *kernel_cmdline,
1261
992
const char *initrd_filename, const char *cpu_model)
1263
spitz_common_init(ram_size, vga_ram_size, ds, kernel_filename,
994
spitz_common_init(ram_size, vga_ram_size, kernel_filename,
1264
995
kernel_cmdline, initrd_filename, cpu_model, akita, 0x2e8);
1267
static void terrier_init(int ram_size, int vga_ram_size,
1268
const char *boot_device, DisplayState *ds,
998
static void terrier_init(ram_addr_t ram_size, int vga_ram_size,
999
const char *boot_device,
1269
1000
const char *kernel_filename, const char *kernel_cmdline,
1270
1001
const char *initrd_filename, const char *cpu_model)
1272
spitz_common_init(ram_size, vga_ram_size, ds, kernel_filename,
1003
spitz_common_init(ram_size, vga_ram_size, kernel_filename,
1273
1004
kernel_cmdline, initrd_filename, cpu_model, terrier, 0x33f);
1276
1007
QEMUMachine akitapda_machine = {
1278
"Akita PDA (PXA270)",
1009
.desc = "Akita PDA (PXA270)",
1011
.ram_require = SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
1282
1014
QEMUMachine spitzpda_machine = {
1284
"Spitz PDA (PXA270)",
1016
.desc = "Spitz PDA (PXA270)",
1018
.ram_require = SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
1288
1021
QEMUMachine borzoipda_machine = {
1290
"Borzoi PDA (PXA270)",
1023
.desc = "Borzoi PDA (PXA270)",
1024
.init = borzoi_init,
1025
.ram_require = SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,
1294
1028
QEMUMachine terrierpda_machine = {
1296
"Terrier PDA (PXA270)",
1030
.desc = "Terrier PDA (PXA270)",
1031
.init = terrier_init,
1032
.ram_require = SPITZ_RAM + SPITZ_ROM + PXA2XX_INTERNAL_SIZE + RAMSIZE_FIXED,