1*53018216SPaolo Bonzini /* 2*53018216SPaolo Bonzini * Gumstix Platforms 3*53018216SPaolo Bonzini * 4*53018216SPaolo Bonzini * Copyright (c) 2007 by Thorsten Zitterell <info@bitmux.org> 5*53018216SPaolo Bonzini * 6*53018216SPaolo Bonzini * Code based on spitz platform by Andrzej Zaborowski <balrog@zabor.org> 7*53018216SPaolo Bonzini * 8*53018216SPaolo Bonzini * This code is licensed under the GNU GPL v2. 9*53018216SPaolo Bonzini * 10*53018216SPaolo Bonzini * Contributions after 2012-01-13 are licensed under the terms of the 11*53018216SPaolo Bonzini * GNU GPL, version 2 or (at your option) any later version. 12*53018216SPaolo Bonzini */ 13*53018216SPaolo Bonzini 14*53018216SPaolo Bonzini /* 15*53018216SPaolo Bonzini * Example usage: 16*53018216SPaolo Bonzini * 17*53018216SPaolo Bonzini * connex: 18*53018216SPaolo Bonzini * ======= 19*53018216SPaolo Bonzini * create image: 20*53018216SPaolo Bonzini * # dd of=flash bs=1k count=16k if=/dev/zero 21*53018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc if=u-boot.bin 22*53018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=256 if=rootfs.arm_nofpu.jffs2 23*53018216SPaolo Bonzini * start it: 24*53018216SPaolo Bonzini * # qemu-system-arm -M connex -pflash flash -monitor null -nographic 25*53018216SPaolo Bonzini * 26*53018216SPaolo Bonzini * verdex: 27*53018216SPaolo Bonzini * ======= 28*53018216SPaolo Bonzini * create image: 29*53018216SPaolo Bonzini * # dd of=flash bs=1k count=32k if=/dev/zero 30*53018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc if=u-boot.bin 31*53018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=256 if=rootfs.arm_nofpu.jffs2 32*53018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=31744 if=uImage 33*53018216SPaolo Bonzini * start it: 34*53018216SPaolo Bonzini * # qemu-system-arm -M verdex -pflash flash -monitor null -nographic -m 289 35*53018216SPaolo Bonzini */ 36*53018216SPaolo Bonzini 37*53018216SPaolo Bonzini #include "hw/hw.h" 38*53018216SPaolo Bonzini #include "hw/pxa.h" 39*53018216SPaolo Bonzini #include "net/net.h" 40*53018216SPaolo Bonzini #include "hw/flash.h" 41*53018216SPaolo Bonzini #include "hw/devices.h" 42*53018216SPaolo Bonzini #include "hw/boards.h" 43*53018216SPaolo Bonzini #include "sysemu/blockdev.h" 44*53018216SPaolo Bonzini #include "exec/address-spaces.h" 45*53018216SPaolo Bonzini 46*53018216SPaolo Bonzini static const int sector_len = 128 * 1024; 47*53018216SPaolo Bonzini 48*53018216SPaolo Bonzini static void connex_init(QEMUMachineInitArgs *args) 49*53018216SPaolo Bonzini { 50*53018216SPaolo Bonzini PXA2xxState *cpu; 51*53018216SPaolo Bonzini DriveInfo *dinfo; 52*53018216SPaolo Bonzini int be; 53*53018216SPaolo Bonzini MemoryRegion *address_space_mem = get_system_memory(); 54*53018216SPaolo Bonzini 55*53018216SPaolo Bonzini uint32_t connex_rom = 0x01000000; 56*53018216SPaolo Bonzini uint32_t connex_ram = 0x04000000; 57*53018216SPaolo Bonzini 58*53018216SPaolo Bonzini cpu = pxa255_init(address_space_mem, connex_ram); 59*53018216SPaolo Bonzini 60*53018216SPaolo Bonzini dinfo = drive_get(IF_PFLASH, 0, 0); 61*53018216SPaolo Bonzini if (!dinfo) { 62*53018216SPaolo Bonzini fprintf(stderr, "A flash image must be given with the " 63*53018216SPaolo Bonzini "'pflash' parameter\n"); 64*53018216SPaolo Bonzini exit(1); 65*53018216SPaolo Bonzini } 66*53018216SPaolo Bonzini 67*53018216SPaolo Bonzini #ifdef TARGET_WORDS_BIGENDIAN 68*53018216SPaolo Bonzini be = 1; 69*53018216SPaolo Bonzini #else 70*53018216SPaolo Bonzini be = 0; 71*53018216SPaolo Bonzini #endif 72*53018216SPaolo Bonzini if (!pflash_cfi01_register(0x00000000, NULL, "connext.rom", connex_rom, 73*53018216SPaolo Bonzini dinfo->bdrv, sector_len, connex_rom / sector_len, 74*53018216SPaolo Bonzini 2, 0, 0, 0, 0, be)) { 75*53018216SPaolo Bonzini fprintf(stderr, "qemu: Error registering flash memory.\n"); 76*53018216SPaolo Bonzini exit(1); 77*53018216SPaolo Bonzini } 78*53018216SPaolo Bonzini 79*53018216SPaolo Bonzini /* Interrupt line of NIC is connected to GPIO line 36 */ 80*53018216SPaolo Bonzini smc91c111_init(&nd_table[0], 0x04000300, 81*53018216SPaolo Bonzini qdev_get_gpio_in(cpu->gpio, 36)); 82*53018216SPaolo Bonzini } 83*53018216SPaolo Bonzini 84*53018216SPaolo Bonzini static void verdex_init(QEMUMachineInitArgs *args) 85*53018216SPaolo Bonzini { 86*53018216SPaolo Bonzini const char *cpu_model = args->cpu_model; 87*53018216SPaolo Bonzini PXA2xxState *cpu; 88*53018216SPaolo Bonzini DriveInfo *dinfo; 89*53018216SPaolo Bonzini int be; 90*53018216SPaolo Bonzini MemoryRegion *address_space_mem = get_system_memory(); 91*53018216SPaolo Bonzini 92*53018216SPaolo Bonzini uint32_t verdex_rom = 0x02000000; 93*53018216SPaolo Bonzini uint32_t verdex_ram = 0x10000000; 94*53018216SPaolo Bonzini 95*53018216SPaolo Bonzini cpu = pxa270_init(address_space_mem, verdex_ram, cpu_model ?: "pxa270-c0"); 96*53018216SPaolo Bonzini 97*53018216SPaolo Bonzini dinfo = drive_get(IF_PFLASH, 0, 0); 98*53018216SPaolo Bonzini if (!dinfo) { 99*53018216SPaolo Bonzini fprintf(stderr, "A flash image must be given with the " 100*53018216SPaolo Bonzini "'pflash' parameter\n"); 101*53018216SPaolo Bonzini exit(1); 102*53018216SPaolo Bonzini } 103*53018216SPaolo Bonzini 104*53018216SPaolo Bonzini #ifdef TARGET_WORDS_BIGENDIAN 105*53018216SPaolo Bonzini be = 1; 106*53018216SPaolo Bonzini #else 107*53018216SPaolo Bonzini be = 0; 108*53018216SPaolo Bonzini #endif 109*53018216SPaolo Bonzini if (!pflash_cfi01_register(0x00000000, NULL, "verdex.rom", verdex_rom, 110*53018216SPaolo Bonzini dinfo->bdrv, sector_len, verdex_rom / sector_len, 111*53018216SPaolo Bonzini 2, 0, 0, 0, 0, be)) { 112*53018216SPaolo Bonzini fprintf(stderr, "qemu: Error registering flash memory.\n"); 113*53018216SPaolo Bonzini exit(1); 114*53018216SPaolo Bonzini } 115*53018216SPaolo Bonzini 116*53018216SPaolo Bonzini /* Interrupt line of NIC is connected to GPIO line 99 */ 117*53018216SPaolo Bonzini smc91c111_init(&nd_table[0], 0x04000300, 118*53018216SPaolo Bonzini qdev_get_gpio_in(cpu->gpio, 99)); 119*53018216SPaolo Bonzini } 120*53018216SPaolo Bonzini 121*53018216SPaolo Bonzini static QEMUMachine connex_machine = { 122*53018216SPaolo Bonzini .name = "connex", 123*53018216SPaolo Bonzini .desc = "Gumstix Connex (PXA255)", 124*53018216SPaolo Bonzini .init = connex_init, 125*53018216SPaolo Bonzini DEFAULT_MACHINE_OPTIONS, 126*53018216SPaolo Bonzini }; 127*53018216SPaolo Bonzini 128*53018216SPaolo Bonzini static QEMUMachine verdex_machine = { 129*53018216SPaolo Bonzini .name = "verdex", 130*53018216SPaolo Bonzini .desc = "Gumstix Verdex (PXA270)", 131*53018216SPaolo Bonzini .init = verdex_init, 132*53018216SPaolo Bonzini DEFAULT_MACHINE_OPTIONS, 133*53018216SPaolo Bonzini }; 134*53018216SPaolo Bonzini 135*53018216SPaolo Bonzini static void gumstix_machine_init(void) 136*53018216SPaolo Bonzini { 137*53018216SPaolo Bonzini qemu_register_machine(&connex_machine); 138*53018216SPaolo Bonzini qemu_register_machine(&verdex_machine); 139*53018216SPaolo Bonzini } 140*53018216SPaolo Bonzini 141*53018216SPaolo Bonzini machine_init(gumstix_machine_init); 142