int main(int argc, char *argv[]) { // elf_firmware_t f; const char * pwd = dirname(argv[0]); avr = avr_make_mcu_by_name("at90usb162"); if (!avr) { fprintf(stderr, "%s: Error creating the AVR core\n", argv[0]); exit(1); } strcpy(avr_flash_path, "simusb_flash.bin"); // register our own functions avr->special_init = avr_special_init; avr->special_deinit = avr_special_deinit; //avr->reset = NULL; avr_init(avr); avr->frequency = 8000000; // this trick creates a file that contains /and keep/ the flash // in the same state as it was before. This allow the bootloader // app to be kept, and re-run if the bootloader doesn't get a // new one { char path[1024]; uint32_t base, size; snprintf(path, sizeof(path), "%s/../%s", pwd, "at90usb162_cdc_loopback.hex"); uint8_t * boot = read_ihex_file(path, &size, &base); if (!boot) { fprintf(stderr, "%s: Unable to load %s\n", argv[0], path); exit(1); } printf("Booloader %04x: %d\n", base, size); memcpy(avr->flash + base, boot, size); free(boot); avr->pc = base; avr->codeend = avr->flashend; } // even if not setup at startup, activate gdb if crashing avr->gdb_port = 1234; if (0) { //avr->state = cpu_Stopped; avr_gdb_init(avr); } vhci_usb_init(avr, &vhci_usb); vhci_usb_connect(&vhci_usb, '0'); while (1) { avr_run(avr); } }
int main(int argc, char *argv[]) { struct avr_flash flash_data; char boot_path[1024] = "ATmegaBOOT_168_atmega328.ihex"; uint32_t boot_base, boot_size; char * mmcu = "atmega328p"; uint32_t freq = 16000000; int debug = 0; int verbose = 0; /* * To allow other programs to know that the model is * online and ready for programming, we create a file * called emu_online.txt * * At the beginning we clean up the file and then write * to it later on once the emulator is running. */ char * emu_online_file = "emu_online.txt"; int emu_online_flag = 0; for (int i = 1; i < argc; i++) { if (!strcmp(argv[i] + strlen(argv[i]) - 4, ".hex")) strncpy(boot_path, argv[i], sizeof(boot_path)); else if (!strcmp(argv[i], "-d")) debug++; else if (!strcmp(argv[i], "-v")) verbose++; else if (strstr(argv[i], ".ihex") != NULL) strcpy( boot_path, argv[1] ); else { fprintf(stderr, "%s: invalid argument %s\n", argv[0], argv[i]); exit(1); } } if( access(emu_online_file, F_OK) != -1 ){ remove(emu_online_file); } avr = avr_make_mcu_by_name(mmcu); if (!avr) { fprintf(stderr, "%s: Error creating the AVR core\n", argv[0]); exit(1); } uint8_t * boot = read_ihex_file(boot_path, &boot_size, &boot_base); if (!boot) { fprintf(stderr, "%s: Unable to load %s\n", argv[0], boot_path); exit(1); } if (boot_base > 32*1024*1024) { mmcu = "atmega2560"; freq = 20000000; } printf("%s booloader 0x%05x: %d bytes\n", mmcu, boot_base, boot_size); snprintf(flash_data.avr_flash_path, sizeof(flash_data.avr_flash_path), "simduino_%s_flash.bin", mmcu); flash_data.avr_flash_fd = 0; // register our own functions avr->custom.init = avr_special_init; avr->custom.deinit = avr_special_deinit; avr->custom.data = &flash_data; avr_init(avr); avr->frequency = freq; memcpy(avr->flash + boot_base, boot, boot_size); free(boot); avr->pc = boot_base; /* end of flash, remember we are writing /code/ */ avr->codeend = avr->flashend; avr->log = 1 + verbose; // even if not setup at startup, activate gdb if crashing avr->gdb_port = 1234; if (debug) { avr->state = cpu_Stopped; avr_gdb_init(avr); } uart_pty_init(avr, &uart_pty); uart_pty_connect(&uart_pty, '0'); while (1) { int state = avr_run(avr); if ( state == cpu_Done || state == cpu_Crashed) break; if( emu_online_flag == 0){ fopen(emu_online_file, "w+"); emu_online_flag = 1; } } }