153018216SPaolo Bonzini /* 253018216SPaolo Bonzini * Gumstix Platforms 353018216SPaolo Bonzini * 453018216SPaolo Bonzini * Copyright (c) 2007 by Thorsten Zitterell <info@bitmux.org> 553018216SPaolo Bonzini * 653018216SPaolo Bonzini * Code based on spitz platform by Andrzej Zaborowski <balrog@zabor.org> 753018216SPaolo Bonzini * 853018216SPaolo Bonzini * This code is licensed under the GNU GPL v2. 953018216SPaolo Bonzini * 1053018216SPaolo Bonzini * Contributions after 2012-01-13 are licensed under the terms of the 1153018216SPaolo Bonzini * GNU GPL, version 2 or (at your option) any later version. 1253018216SPaolo Bonzini */ 1353018216SPaolo Bonzini 1453018216SPaolo Bonzini /* 1553018216SPaolo Bonzini * Example usage: 1653018216SPaolo Bonzini * 1753018216SPaolo Bonzini * connex: 1853018216SPaolo Bonzini * ======= 1953018216SPaolo Bonzini * create image: 2053018216SPaolo Bonzini * # dd of=flash bs=1k count=16k if=/dev/zero 2153018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc if=u-boot.bin 2253018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=256 if=rootfs.arm_nofpu.jffs2 2353018216SPaolo Bonzini * start it: 2453018216SPaolo Bonzini * # qemu-system-arm -M connex -pflash flash -monitor null -nographic 2553018216SPaolo Bonzini * 2653018216SPaolo Bonzini * verdex: 2753018216SPaolo Bonzini * ======= 2853018216SPaolo Bonzini * create image: 2953018216SPaolo Bonzini * # dd of=flash bs=1k count=32k if=/dev/zero 3053018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc if=u-boot.bin 3153018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=256 if=rootfs.arm_nofpu.jffs2 3253018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=31744 if=uImage 3353018216SPaolo Bonzini * start it: 3453018216SPaolo Bonzini * # qemu-system-arm -M verdex -pflash flash -monitor null -nographic -m 289 3553018216SPaolo Bonzini */ 3653018216SPaolo Bonzini 3753018216SPaolo Bonzini #include "hw/hw.h" 380d09e41aSPaolo Bonzini #include "hw/arm/pxa.h" 3953018216SPaolo Bonzini #include "net/net.h" 400d09e41aSPaolo Bonzini #include "hw/block/flash.h" 41bd2be150SPeter Maydell #include "hw/devices.h" 4253018216SPaolo Bonzini #include "hw/boards.h" 43*fa1d36dfSMarkus Armbruster #include "sysemu/block-backend.h" 4453018216SPaolo Bonzini #include "sysemu/blockdev.h" 4553018216SPaolo Bonzini #include "exec/address-spaces.h" 46bdf921d6SAndreas Färber #include "sysemu/qtest.h" 4753018216SPaolo Bonzini 4853018216SPaolo Bonzini static const int sector_len = 128 * 1024; 4953018216SPaolo Bonzini 503ef96221SMarcel Apfelbaum static void connex_init(MachineState *machine) 5153018216SPaolo Bonzini { 5253018216SPaolo Bonzini PXA2xxState *cpu; 5353018216SPaolo Bonzini DriveInfo *dinfo; 5453018216SPaolo Bonzini int be; 5553018216SPaolo Bonzini MemoryRegion *address_space_mem = get_system_memory(); 5653018216SPaolo Bonzini 5753018216SPaolo Bonzini uint32_t connex_rom = 0x01000000; 5853018216SPaolo Bonzini uint32_t connex_ram = 0x04000000; 5953018216SPaolo Bonzini 6053018216SPaolo Bonzini cpu = pxa255_init(address_space_mem, connex_ram); 6153018216SPaolo Bonzini 6253018216SPaolo Bonzini dinfo = drive_get(IF_PFLASH, 0, 0); 63bdf921d6SAndreas Färber if (!dinfo && !qtest_enabled()) { 6453018216SPaolo Bonzini fprintf(stderr, "A flash image must be given with the " 6553018216SPaolo Bonzini "'pflash' parameter\n"); 6653018216SPaolo Bonzini exit(1); 6753018216SPaolo Bonzini } 6853018216SPaolo Bonzini 6953018216SPaolo Bonzini #ifdef TARGET_WORDS_BIGENDIAN 7053018216SPaolo Bonzini be = 1; 7153018216SPaolo Bonzini #else 7253018216SPaolo Bonzini be = 0; 7353018216SPaolo Bonzini #endif 7453018216SPaolo Bonzini if (!pflash_cfi01_register(0x00000000, NULL, "connext.rom", connex_rom, 75*fa1d36dfSMarkus Armbruster dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL, 76bdf921d6SAndreas Färber sector_len, connex_rom / sector_len, 7753018216SPaolo Bonzini 2, 0, 0, 0, 0, be)) { 7853018216SPaolo Bonzini fprintf(stderr, "qemu: Error registering flash memory.\n"); 7953018216SPaolo Bonzini exit(1); 8053018216SPaolo Bonzini } 8153018216SPaolo Bonzini 8253018216SPaolo Bonzini /* Interrupt line of NIC is connected to GPIO line 36 */ 8353018216SPaolo Bonzini smc91c111_init(&nd_table[0], 0x04000300, 8453018216SPaolo Bonzini qdev_get_gpio_in(cpu->gpio, 36)); 8553018216SPaolo Bonzini } 8653018216SPaolo Bonzini 873ef96221SMarcel Apfelbaum static void verdex_init(MachineState *machine) 8853018216SPaolo Bonzini { 893ef96221SMarcel Apfelbaum const char *cpu_model = machine->cpu_model; 9053018216SPaolo Bonzini PXA2xxState *cpu; 9153018216SPaolo Bonzini DriveInfo *dinfo; 9253018216SPaolo Bonzini int be; 9353018216SPaolo Bonzini MemoryRegion *address_space_mem = get_system_memory(); 9453018216SPaolo Bonzini 9553018216SPaolo Bonzini uint32_t verdex_rom = 0x02000000; 9653018216SPaolo Bonzini uint32_t verdex_ram = 0x10000000; 9753018216SPaolo Bonzini 9853018216SPaolo Bonzini cpu = pxa270_init(address_space_mem, verdex_ram, cpu_model ?: "pxa270-c0"); 9953018216SPaolo Bonzini 10053018216SPaolo Bonzini dinfo = drive_get(IF_PFLASH, 0, 0); 101bdf921d6SAndreas Färber if (!dinfo && !qtest_enabled()) { 10253018216SPaolo Bonzini fprintf(stderr, "A flash image must be given with the " 10353018216SPaolo Bonzini "'pflash' parameter\n"); 10453018216SPaolo Bonzini exit(1); 10553018216SPaolo Bonzini } 10653018216SPaolo Bonzini 10753018216SPaolo Bonzini #ifdef TARGET_WORDS_BIGENDIAN 10853018216SPaolo Bonzini be = 1; 10953018216SPaolo Bonzini #else 11053018216SPaolo Bonzini be = 0; 11153018216SPaolo Bonzini #endif 11253018216SPaolo Bonzini if (!pflash_cfi01_register(0x00000000, NULL, "verdex.rom", verdex_rom, 113*fa1d36dfSMarkus Armbruster dinfo ? blk_bs(blk_by_legacy_dinfo(dinfo)) : NULL, 114bdf921d6SAndreas Färber sector_len, verdex_rom / sector_len, 11553018216SPaolo Bonzini 2, 0, 0, 0, 0, be)) { 11653018216SPaolo Bonzini fprintf(stderr, "qemu: Error registering flash memory.\n"); 11753018216SPaolo Bonzini exit(1); 11853018216SPaolo Bonzini } 11953018216SPaolo Bonzini 12053018216SPaolo Bonzini /* Interrupt line of NIC is connected to GPIO line 99 */ 12153018216SPaolo Bonzini smc91c111_init(&nd_table[0], 0x04000300, 12253018216SPaolo Bonzini qdev_get_gpio_in(cpu->gpio, 99)); 12353018216SPaolo Bonzini } 12453018216SPaolo Bonzini 12553018216SPaolo Bonzini static QEMUMachine connex_machine = { 12653018216SPaolo Bonzini .name = "connex", 12753018216SPaolo Bonzini .desc = "Gumstix Connex (PXA255)", 12853018216SPaolo Bonzini .init = connex_init, 12953018216SPaolo Bonzini }; 13053018216SPaolo Bonzini 13153018216SPaolo Bonzini static QEMUMachine verdex_machine = { 13253018216SPaolo Bonzini .name = "verdex", 13353018216SPaolo Bonzini .desc = "Gumstix Verdex (PXA270)", 13453018216SPaolo Bonzini .init = verdex_init, 13553018216SPaolo Bonzini }; 13653018216SPaolo Bonzini 13753018216SPaolo Bonzini static void gumstix_machine_init(void) 13853018216SPaolo Bonzini { 13953018216SPaolo Bonzini qemu_register_machine(&connex_machine); 14053018216SPaolo Bonzini qemu_register_machine(&verdex_machine); 14153018216SPaolo Bonzini } 14253018216SPaolo Bonzini 14353018216SPaolo Bonzini machine_init(gumstix_machine_init); 144