Pages: [1] 2   Go Down
Author Topic: [SOLVED]Passing extra options to avrdude  (Read 3109 times)
0 Members and 1 Guest are viewing this topic.
Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi all,
anybody knows how to pass options to avrdude within the arduino ide?
could be in the preferences.txt file or the board.txt file?
(i patched avrdude to make it program some mcu with the signature "FFFFFFFF", and it work!, but i would like to doit also using the arduino ide and not only from command line)
« Last Edit: March 24, 2012, 02:35:23 am by BrainBooster » Logged

Belgium
Offline Offline
Edison Member
*
Karma: 58
Posts: 1742
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

BrainBooster
The way i usually do this type of stuff is like this:
I rename avrdude.exe to avrdude.exe.exe.

I write a small C/C++ program called avrdude.exe that calls avrdude.exe.exe and this program adds the wished parameters.
The code below compiles fine in visual studio C++ express as a console project
Best regards
Jantje

Code:
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;



int main(int argc, char* argv[])
{
  string sarg;
  string sCommand;

sCommand.assign(argv[0]);
sCommand +=".exe ";
sCommand +=" My extra command"; //add your command here

   for(int i = 1 ; i < argc; i++)
   {
   sarg.assign(argv[i]);
   sCommand += " ";
   sCommand += sarg;
   }
   
   return system(sCommand.c_str());
}
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Global Moderator
Netherlands
Online Online
Shannon Member
*****
Karma: 170
Posts: 12487
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi Jantje,

just wanted to post the same idea, but you have allready made it. Did try if avrdude.bat or avrdude.cmd would work but unfortunatelly smiley-sad

Can you create a version of your C program that reads the parameters from a file e.g.  "avrdude.opt"  so I do not need to recompile every time

Ideally it should overrule the params used by the IDE of course ...

And if that works we can use it also for gcc++.exe as all options are coming from an external text file.

Trick is to let the <application.exe> search for argv[0].opt  as option file

Rob
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

maybe i've been unclear (sorry for my english in that case smiley )
i have recompiled myself avrdude starting from the available source code in MingW and i've added the requested flag (-R = resurrect mode), so now i can also program the microcontrollers with the signature damaged.
My problem now is to make it work in the arduino ide, i would like to recall the flag optionally from a file like preferences or options, but i don't know how to pass the instrucion to avrdude.
Logged

Belgium
Offline Offline
Edison Member
*
Karma: 58
Posts: 1742
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Rob
Specific -> easy
Generic-> difficult.
So I try to keep it specific.
Note that you also need to specify the special file somewhere. So the systems has limitations.
I attached the code that reads the first line from a file and uses that as application to call and starting arguments.
Note that if you do not specify a full path in the code you need to be sure in which folder you start the program.
Best regards
Jantje

Code:
// capture.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;



int main(int argc, char* argv[])
{
  string sarg;
  ifstream  myfile;
  char buffer[2048];


  myfile.open ("c:\\input.txt",ios::app);
  myfile.getline (buffer,2048);
   myfile.close();
   string sCommand(buffer);

   for(int i = 1 ; i < argc; i++)
   {
  sarg.assign(argv[i]);
  sCommand += " ";
  sCommand += sarg;
   }
  
   return system(sCommand.c_str());
}
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Belgium
Offline Offline
Edison Member
*
Karma: 58
Posts: 1742
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Brainbooster
No I don't understand why this trick would not be able to add parameters to avrdude started from Arduino IDE.
No I don't know a setting in Arduino IDE to pass extra parameters to Arduino.

But my question is: If you can recompile avrdude and make a special version; why do you need arduino to pass parameters? Can't you hard code them in a modded avrdude?
Best regards
Jantje

FYI: You can easily do this with my Arduino eclipse plugin.
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hei guys,i want to modify the arduino code smiley ,avrdude is readymade and working accepting the new option.
@Jantje yes i could do it, but  i prefer to recall the flag optionally because it is dangerous as it skips the signature check and goes on programming  and could even program a wrong mcu by mistake (more powerfull than -F) option and it could mess with the fuses and brick the chip.
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

update: digging in the arduino source code i found the file: AvrdudeUploader.java, do you think i can modify it to make it parse a new option? something like "upload.zoombie"
This is what i've done, but it doesn't work, pasing the option in the preferences file.
Code:
/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */

/*
  AvrdudeUploader - uploader implementation using avrdude
  Part of the Arduino project - http://www.arduino.cc/

  Copyright (c) 2004-05
  Hernando Barragan

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software Foundation,
  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  $Id$
*/

package processing.app.debug;

import processing.app.Base;
import processing.app.Preferences;
import processing.app.Serial;
import processing.app.SerialException;

import java.io.*;
import java.util.*;
import java.util.zip.*;
import javax.swing.*;
import gnu.io.*;


public class AvrdudeUploader extends Uploader  {
  public AvrdudeUploader() {
  }

  public boolean uploadUsingPreferences(String buildPath, String className, boolean usingProgrammer)
  throws RunnerException, SerialException {
    this.verbose = verbose;
    Map<String, String> boardPreferences = Base.getBoardPreferences();

    // if no protocol is specified for this board, assume it lacks a
    // bootloader and upload using the selected programmer.
    if (usingProgrammer || boardPreferences.get("upload.protocol") == null) {
      String programmer = Preferences.get("programmer");
      Target target = Base.getTarget();

      if (programmer.indexOf(":") != -1) {
        target = Base.targetsTable.get(programmer.substring(0, programmer.indexOf(":")));
        programmer = programmer.substring(programmer.indexOf(":") + 1);
      }
     
      Collection params = getProgrammerCommands(target, programmer);
      params.add("-Uflash:w:" + buildPath + File.separator + className + ".hex:i");
      return avrdude(params);
    }

    return uploadViaBootloader(buildPath, className);
  }
 
  private boolean uploadViaBootloader(String buildPath, String className)
  throws RunnerException, SerialException {
    Map<String, String> boardPreferences = Base.getBoardPreferences();
    List commandDownloader = new ArrayList();
    String protocol = boardPreferences.get("upload.protocol");
   
    // avrdude wants "stk500v1" to distinguish it from stk500v2
    if (protocol.equals("stk500"))
      protocol = "stk500v1";
    commandDownloader.add("-c" + protocol);
    commandDownloader.add(
      "-P" + (Base.isWindows() ? "\\\\.\\" : "") + Preferences.get("serial.port"));
    commandDownloader.add(
      "-b" + Integer.parseInt(boardPreferences.get("upload.speed")));
    commandDownloader.add("-D"); // don't erase
    if (!Preferences.getBoolean("upload.verify")) commandDownloader.add("-V"); // disable verify
    if (Preferences.getBoolean("upload.zoombie")) commandDownloader.add("-R"); // enable resurrect mode
    commandDownloader.add("-Uflash:w:" + buildPath + File.separator + className + ".hex:i");

    if (boardPreferences.get("upload.disable_flushing") == null ||
        boardPreferences.get("upload.disable_flushing").toLowerCase().equals("false")) {
      flushSerialBuffer();
    }

    return avrdude(commandDownloader);
  }
 
  public boolean burnBootloader() throws RunnerException {
    String programmer = Preferences.get("programmer");
    Target target = Base.getTarget();
    if (programmer.indexOf(":") != -1) {
      target = Base.targetsTable.get(programmer.substring(0, programmer.indexOf(":")));
      programmer = programmer.substring(programmer.indexOf(":") + 1);
    }
    return burnBootloader(getProgrammerCommands(target, programmer));
  }
 
  private Collection getProgrammerCommands(Target target, String programmer) {
    Map<String, String> programmerPreferences = target.getProgrammers().get(programmer);
    List params = new ArrayList();
    params.add("-c" + programmerPreferences.get("protocol"));
   
    if ("usb".equals(programmerPreferences.get("communication"))) {
      params.add("-Pusb");
    } else if ("serial".equals(programmerPreferences.get("communication"))) {
      params.add("-P" + (Base.isWindows() ? "\\\\.\\" : "") + Preferences.get("serial.port"));
      if (programmerPreferences.get("speed") != null) {
params.add("-b" + Integer.parseInt(programmerPreferences.get("speed")));
      }
    }
    // XXX: add support for specifying the port address for parallel
    // programmers, although avrdude has a default that works in most cases.
   
    if (programmerPreferences.get("force") != null &&
        programmerPreferences.get("force").toLowerCase().equals("true"))
      params.add("-F");
   
    if (programmerPreferences.get("delay") != null)
      params.add("-i" + programmerPreferences.get("delay"));
   
    return params;
  }
 
  protected boolean burnBootloader(Collection params)
  throws RunnerException {
    Map<String, String> boardPreferences = Base.getBoardPreferences();
    List fuses = new ArrayList();
    fuses.add("-e"); // erase the chip
    if (boardPreferences.get("bootloader.unlock_bits") != null)
      fuses.add("-Ulock:w:" + boardPreferences.get("bootloader.unlock_bits") + ":m");
    if (boardPreferences.get("bootloader.extended_fuses") != null)
      fuses.add("-Uefuse:w:" + boardPreferences.get("bootloader.extended_fuses") + ":m");
    fuses.add("-Uhfuse:w:" + boardPreferences.get("bootloader.high_fuses") + ":m");
    fuses.add("-Ulfuse:w:" + boardPreferences.get("bootloader.low_fuses") + ":m");

    if (!avrdude(params, fuses))
      return false;

    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {}
   
    Target t;
    List bootloader = new ArrayList();
    String bootloaderPath = boardPreferences.get("bootloader.path");
   
    if (bootloaderPath != null) {
      if (bootloaderPath.indexOf(':') == -1) {
        t = Base.getTarget(); // the current target (associated with the board)
      } else {
        String targetName = bootloaderPath.substring(0, bootloaderPath.indexOf(':'));
        t = Base.targetsTable.get(targetName);
        bootloaderPath = bootloaderPath.substring(bootloaderPath.indexOf(':') + 1);
      }
     
      File bootloadersFile = new File(t.getFolder(), "bootloaders");
      File bootloaderFile = new File(bootloadersFile, bootloaderPath);
      bootloaderPath = bootloaderFile.getAbsolutePath();
     
      bootloader.add("-Uflash:w:" + bootloaderPath + File.separator +
                     boardPreferences.get("bootloader.file") + ":i");
    }
    if (boardPreferences.get("bootloader.lock_bits") != null)
      bootloader.add("-Ulock:w:" + boardPreferences.get("bootloader.lock_bits") + ":m");

    if (bootloader.size() > 0)
      return avrdude(params, bootloader);
   
    return true;
  }
 
  public boolean avrdude(Collection p1, Collection p2) throws RunnerException {
    ArrayList p = new ArrayList(p1);
    p.addAll(p2);
    return avrdude(p);
  }
 
  public boolean avrdude(Collection params) throws RunnerException {
    List commandDownloader = new ArrayList();
     
    if(Base.isLinux()) {
      if ((new File(Base.getHardwarePath() + "/tools/" + "avrdude")).exists()) {
        commandDownloader.add(Base.getHardwarePath() + "/tools/" + "avrdude");
        commandDownloader.add("-C" + Base.getHardwarePath() + "/tools/avrdude.conf");
      } else {
        commandDownloader.add("avrdude");
      }
    }
    else {
      commandDownloader.add(Base.getHardwarePath() + "/tools/avr/bin/" + "avrdude");
      commandDownloader.add("-C" + Base.getHardwarePath() + "/tools/avr/etc/avrdude.conf");
    }
    if (verbose || Preferences.getBoolean("upload.verbose")) {
      commandDownloader.add("-v");
      commandDownloader.add("-v");
      commandDownloader.add("-v");
      commandDownloader.add("-v");
    } else {
      commandDownloader.add("-q");
      commandDownloader.add("-q");
    }
    commandDownloader.add("-p" + Base.getBoardPreferences().get("build.mcu"));
    commandDownloader.addAll(params);

    return executeUploadCommand(commandDownloader);
  }
}

Logged

Belgium
Offline Offline
Edison Member
*
Karma: 58
Posts: 1742
Arduino rocks; but with my plugin it can fly rocking the world ;-)
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

BrainBooster
I can't help you with this one.
Best regards
Jantje
Logged

Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Jantje thank you for your support anyway smiley
someone else speaking java?
anybody can help?
i've added this line to the previous file:

 if (Preferences.getBoolean("upload.zoombie")) commandDownloader.add("-R"); // enable resurrect mode

and recompiled the arduino suorces with no errors.
but if i add the line:

upload.zoombie=true

in the preferences file, it doesn't work , and when i reopen the preferences file, the line is disappeared!
why?
« Last Edit: March 22, 2012, 06:30:30 am by BrainBooster » Logged

Global Moderator
Netherlands
Online Online
Shannon Member
*****
Karma: 170
Posts: 12487
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
in the preferences file, it doesn't work , and when i reopen the preferences file, the line is disappeared!
why?

You cannot edit the preferences file while the IDE is open as the IDE seems to write the file when closing.
I might not know your flag so it is not written...
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

South Texas
Offline Offline
Edison Member
*
Karma: 8
Posts: 1023
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Can you edit the boards file and copy the appropriate board and change the name and the necessary info and the save the boards file and restart everything?
Logged

Global Moderator
Netherlands
Online Online
Shannon Member
*****
Karma: 170
Posts: 12487
In theory there is no difference between theory and practice, however in practice there are many...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Can you edit the boards file and copy the appropriate board and change the name and the necessary info and the save the boards file and restart everything?
AFAIK yes - but allways backup the original smiley-wink
Logged

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 7
Posts: 2961
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

all  the changes as been made with the ide closed.
@kf2qd , so do you think i have to change the file board.txt and not preference.txt?
edit:
tested changing the boards.txt file  by adding the line :
upload.zoombie=true
but it doesn't get passed to avrdude
« Last Edit: March 23, 2012, 03:22:25 am by BrainBooster » Logged

South Texas
Offline Offline
Edison Member
*
Karma: 8
Posts: 1023
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

What i would suggest is add a board to the file with the correct device signature.
Logged

Pages: [1] 2   Go Up
Jump to: