fx3_dev_err_t FX3Dev::loadAdditionalFirmware( const char* fw_name, uint32_t stop_addr ) { if ( !fw_name ) { return FX3_ERR_ADDFIRMWARE_FILE_IO_ERROR; } FILE* f = fopen( fw_name, "r" ); if ( !f ) { fprintf( stderr, "FX3Dev::loadAdditionalFirmware __error__ can't open '%s'\n", fw_name ); return FX3_ERR_ADDFIRMWARE_FILE_IO_ERROR; } else { fclose( f ); } std::vector<uint32_t> addr; std::vector<uint32_t> data; parse_hex_file( fw_name, addr, data ); for ( uint32_t i = 0; i < addr.size(); i++ ) { fx3_dev_err_t eres = send16bitToDeviceSynch(data[i], addr[i]); if ( eres != FX3_ERR_OK ) { return eres; } std::this_thread::sleep_for( std::chrono::milliseconds((uint64_t)ADD_FW_LOAD_PAUSE_MS) ); if ( addr[i] == stop_addr ) { break; } } return FX3_ERR_OK; }
int main( int argc, char **argv) { HexFileParser ps; prime_hex_file_parser( &ps, sink); FILE *f = fopen( argv[1], "r"); int byte; while ( (byte = fgetc(f)) != EOF) { if ( parse_hex_file( &ps, (char)byte) ) printf("ERR\n"); } printf("ep:%08x\n", ps.entry_point); fclose( f); }
int main(int argc, char* argv[]) { try { // parse command line po::options_description opts("Options"); opts.add_options() ("help,h", "this help") ("gdb-server,g", po::value<int>()->implicit_value(2345), "run a gdbserver on given port") ("sys-ticks", po::value<unsigned int>(), "stop after given number of ticks") ("conf-file,f", po::value<std::string>(), "configuration file") ; po::options_description opts_hidden; // hidden opts_hidden.add_options() ("input-file", po::value<std::string>(), "input file") ; po::positional_options_description popts; popts.add("input-file", 1); po::options_description opts_all; opts_all.add(opts).add(opts_hidden); po::variables_map vm; po::store(po::command_line_parser(argc, argv) .options(opts_all).positional(popts).run(), vm); po::notify(vm); // process command line parameters if(vm.count("help")) { usage(argv[0], opts); return 0; } else if(vm.count("input-file") == 0) { std::cerr << "missing input file" << std::endl; return 1; } pt::ptree ptconf; if(vm.count("conf-file")) { std::string fname = vm["conf-file"].as<std::string>(); pt::ini_parser::read_ini(fname, ptconf); } Log::setMinimumSeverity(Log::INFO); LOG(NOTICE) << "logging start"; model::ATxmega128A1 device(ptconf); DLOG(NOTICE) << "device created"; std::vector<uint8_t> progdata = parse_hex_file(vm["input-file"].as<std::string>()); device.loadFlash(progdata); DLOG(NOTICE) << "flash data loaded"; device.reset(); if(vm.count("gdb-server")) { if(vm.count("sys-ticks")) { std::cerr << "--gdb-server and --sys-ticks are incompatible" << std::endl; return 1; } GdbServer gdbserver(&device); gdbserver.run(vm["gdb-server"].as<int>()); } else if(vm.count("sys-ticks")) { unsigned int ticks = vm["sys-ticks"].as<unsigned int>(); while(device.clk_sys_tick() < ticks) { device.step(); } } else { for(;;) { device.step(); } } } catch(const std::exception& e) { std::cerr << "error: " << e.what() << std::endl; return 1; } catch(...) { std::cerr << "unknown error" << std::endl; } }