Modified bootloader burning: AvrdudeUploader now can burn bootloader with avrispmkii (but not parallel port), and the bootloader burning commands take a target. And the menu items are there, but wrong.

This commit is contained in:
David A. Mellis 2007-07-18 22:17:35 +00:00
parent f64b201e73
commit d0c55e79c7
4 changed files with 118 additions and 67 deletions

View File

@ -39,15 +39,16 @@ public class AvrdudeUploader extends Uploader {
public boolean uploadUsingPreferences(String buildPath, String className)
throws RunnerException {
List commandDownloader = new ArrayList();
// avrdude doesn't want to read device signatures (it always gets
// 0x000000); force it to continue uploading anyway
commandDownloader.add("-F");
String programmer = Preferences.get("upload.programmer");
// avrdude wants "stk500v1" to distinguish it from stk500v2
if (programmer.equals("stk500"))
programmer = "stk500v1";
// avrdude doesn't want to read device signatures (it always gets
// 0x000000); force it to continue uploading anyway
commandDownloader.add("-F");
commandDownloader.add("-c" + programmer);
if (Preferences.get("upload.programmer").equals("dapa")) {
// avrdude doesn't need to be told the address of the parallel port
@ -70,45 +71,48 @@ public class AvrdudeUploader extends Uploader {
return uisp(commandDownloader);
}
public boolean burnBootloaderAVRISP() throws RunnerException {
public boolean burnBootloaderAVRISP(String target) throws RunnerException {
List commandDownloader = new ArrayList();
commandDownloader.add("-dprog=" + Preferences.get("bootloader.programmer"));
commandDownloader.add("-c" +
Preferences.get("bootloader." + target + ".programmer"));
if (Preferences.get("bootloader." + target + ".communication").equals("usb")) {
commandDownloader.add("-Pusb");
} else {
commandDownloader.add(
"-dserial=" + (Base.isWindows() ?
"-P" + (Base.isWindows() ?
"/dev/" + Preferences.get("serial.port").toLowerCase() :
Preferences.get("serial.port")));
commandDownloader.add("-dspeed=" + Preferences.get("serial.burn_rate"));
return burnBootloader(commandDownloader);
}
commandDownloader.add("-b" + Preferences.get("serial.burn_rate"));
return burnBootloader(target, commandDownloader);
}
public boolean burnBootloaderParallel() throws RunnerException {
public boolean burnBootloaderParallel(String target) throws RunnerException {
List commandDownloader = new ArrayList();
commandDownloader.add("-dprog=dapa");
commandDownloader.add("-dlpt=" + Preferences.get("parallel.port"));
return burnBootloader(commandDownloader);
return burnBootloader(target, commandDownloader);
}
protected boolean burnBootloader(Collection params) throws RunnerException {
// I know this is ugly; apologies - that's what happens when you try to
// write Lisp-style code in Java.
protected boolean burnBootloader(String target, Collection params)
throws RunnerException
{
return
// unlock bootloader segment of flash memory
// unlock bootloader segment of flash memory and write fuses
uisp(params, Arrays.asList(new String[] {
"--wr_lock=" + Preferences.get("bootloader.unlock_bits") })) &&
// write fuses:
// bootloader size of 512 words; from 0xE00-0xFFF
// clock speed of 16 MHz, external quartz
"-e",
"-Ulock:w:" + Preferences.get("bootloader." + target + ".unlock_bits") + ":m",
"-Uefuse:w:" + Preferences.get("bootloader." + target + ".extended_fuses") + ":m",
"-Uhfuse:w:" + Preferences.get("bootloader." + target + ".high_fuses") + ":m",
"-Ulfuse:w:" + Preferences.get("bootloader." + target + ".low_fuses") + ":m",
})) &&
// upload bootloader and lock bootloader segment
uisp(params, Arrays.asList(new String[] {
"--wr_fuse_l=" + Preferences.get("bootloader.low_fuses"),
"--wr_fuse_h=" + Preferences.get("bootloader.high_fuses") })) &&
// upload bootloader
uisp(params, Arrays.asList(new String[] {
"--erase", "--upload", "--verify",
"if=" + Preferences.get("bootloader.path") + File.separator +
Preferences.get("bootloader.file") })) &&
// lock bootloader segment
uisp(params, Arrays.asList(new String[] {
"--wr_lock=" + Preferences.get("bootloader.lock_bits") }));
"-Uflash:w:" + Preferences.get("bootloader." + target + ".path") +
File.separator + Preferences.get("bootloader." + target + ".file") + ":i",
"-Ulock:w:" + Preferences.get("bootloader." + target + ".lock_bits") + ":m"
}));
}
public boolean uisp(Collection p1, Collection p2) throws RunnerException {

View File

@ -104,8 +104,13 @@ public class Editor extends JFrame
//Runner runtime;
JMenuItem burnBootloaderItem = null;
JMenuItem burnBootloaderParallelItem = null;
JMenuItem burnBootloader8Item = null;
JMenuItem burnBootloader8ParallelItem = null;
JMenuItem burnBootloader168DiecimilaItem = null;
JMenuItem burnBootloader168DiecimilaParallelItem = null;
JMenuItem burnBootloader168NGItem = null;
JMenuItem burnBootloader168NGParallelItem = null;
JMenuItem exportAppItem;
JMenuItem saveMenuItem;
JMenuItem saveAsMenuItem;
@ -732,31 +737,65 @@ public class Editor extends JFrame
menu.addSeparator();
burnBootloaderItem = new JMenuItem("Burn Bootloader");
burnBootloaderItem.addActionListener(new ActionListener() {
burnBootloader8Item = new JMenuItem("Burn Bootloader");
burnBootloader8Item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader(false);
handleBurnBootloader("atmega8", false);
}
});
menu.add(burnBootloaderItem);
if (!Preferences.get("build.mcu").equals("atmega8"))
burnBootloaderItem.setEnabled(false);
menu.add(burnBootloader8Item);
if (!Base.isMacOS()) {
burnBootloaderParallelItem =
burnBootloader8ParallelItem =
new JMenuItem("Burn Bootloader (parallel port)");
burnBootloaderParallelItem.addActionListener(new ActionListener() {
burnBootloader8ParallelItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader(true);
handleBurnBootloader("atmega8", true);
}
});
menu.add(burnBootloaderParallelItem);
if (!Preferences.get("build.mcu").equals("atmega8"))
burnBootloaderParallelItem.setEnabled(false);
menu.add(burnBootloader8ParallelItem);
}
burnBootloader168DiecimilaItem = new JMenuItem("Burn Diecimila Bootloader");
burnBootloader168DiecimilaItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader("atmega168-diecimila", false);
}
});
menu.add(burnBootloader168DiecimilaItem);
if (!Base.isMacOS()) {
burnBootloader168DiecimilaParallelItem =
new JMenuItem("Burn Diecimila Bootloader (parallel port)");
burnBootloader168DiecimilaParallelItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader("atmega168-diecimila", true);
}
});
menu.add(burnBootloader168DiecimilaParallelItem);
}
burnBootloader168NGItem = new JMenuItem("Burn NG/Mini Bootloader");
burnBootloader168NGItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader("atmega168-ng", false);
}
});
menu.add(burnBootloader168NGItem);
if (!Base.isMacOS()) {
burnBootloader168NGParallelItem =
new JMenuItem("Burn NG/Mini Bootloader (parallel port)");
burnBootloader168NGParallelItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
handleBurnBootloader("atmega168-ng", true);
}
});
menu.add(burnBootloader168NGParallelItem);
}
showBootloaderMenuItemsForCurrentMCU();
menu.addMenuListener(new MenuListener() {
public void menuCanceled(MenuEvent e) {}
public void menuDeselected(MenuEvent e) {}
@ -802,6 +841,22 @@ public class Editor extends JFrame
*/
}
protected void showBootloaderMenuItemsForCurrentMCU() {
boolean onATmega8 =
Preferences.get("build.mcu").equals("atmega8");
burnBootloader8Item.setEnabled(onATmega8);
if (burnBootloader8ParallelItem != null)
burnBootloader8ParallelItem.setEnabled(onATmega8);
burnBootloader168DiecimilaItem.setEnabled(!onATmega8);
if (burnBootloader168DiecimilaParallelItem != null)
burnBootloader168DiecimilaParallelItem.setEnabled(!onATmega8);
burnBootloader168NGItem.setEnabled(!onATmega8);
if (burnBootloader168NGParallelItem != null)
burnBootloader168NGParallelItem.setEnabled(!onATmega8);
}
class McuMenuListener implements ActionListener {
McuMenuListener() {}
@ -814,11 +869,7 @@ public class Editor extends JFrame
Preferences.set("build.mcu",
((JCheckBoxMenuItem) actionevent.getSource()).getLabel());
boolean bootloadingEnabled =
Preferences.get("build.mcu").equals("atmega8");
burnBootloaderItem.setEnabled(bootloadingEnabled);
if (burnBootloaderParallelItem != null)
burnBootloaderParallelItem.setEnabled(bootloadingEnabled);
showBootloaderMenuItemsForCurrentMCU();
try {
LibraryManager libraryManager = new LibraryManager();
@ -1997,14 +2048,10 @@ public class Editor extends JFrame
System.exit(0);
}
protected void handleBurnBootloader(final boolean parallel) {
protected void handleBurnBootloader(final String target, final boolean parallel) {
if(debugging)
doStop();
console.clear();
if (!Preferences.get("build.mcu").equals("atmega8")) {
error("Burn bootloader only works on ATmega8s. See the Arduino FAQ for more info.");
return;
}
//String what = sketch.isLibrary() ? "Applet" : "Library";
//message("Exporting " + what + "...");
message("Burning bootloader to I/O Board (this may take a minute)...");
@ -2013,10 +2060,10 @@ public class Editor extends JFrame
try {
//boolean success = sketch.isLibrary() ?
//sketch.exportLibrary() : sketch.exportApplet();
Uploader uploader = new UispUploader();
Uploader uploader = new AvrdudeUploader();
boolean success = parallel ?
uploader.burnBootloaderParallel() :
uploader.burnBootloaderAVRISP();
uploader.burnBootloaderParallel(target) :
uploader.burnBootloaderAVRISP(target);
if (success) {
message("Done burning bootloader.");

View File

@ -72,7 +72,7 @@ public class UispUploader extends Uploader {
return uisp(commandDownloader);
}
public boolean burnBootloaderAVRISP() throws RunnerException {
public boolean burnBootloaderAVRISP(String target) throws RunnerException {
List commandDownloader = new ArrayList();
commandDownloader.add("-dprog=" + Preferences.get("bootloader.programmer"));
commandDownloader.add(
@ -83,7 +83,7 @@ public class UispUploader extends Uploader {
return burnBootloader(commandDownloader);
}
public boolean burnBootloaderParallel() throws RunnerException {
public boolean burnBootloaderParallel(String target) throws RunnerException {
List commandDownloader = new ArrayList();
commandDownloader.add("-dprog=dapa");
commandDownloader.add("-dlpt=" + Preferences.get("parallel.port"));

View File

@ -58,9 +58,9 @@ public abstract class Uploader implements MessageConsumer {
public abstract boolean uploadUsingPreferences(String buildPath, String className)
throws RunnerException;
public abstract boolean burnBootloaderAVRISP() throws RunnerException;
public abstract boolean burnBootloaderAVRISP(String target) throws RunnerException;
public abstract boolean burnBootloaderParallel() throws RunnerException;
public abstract boolean burnBootloaderParallel(String target) throws RunnerException;
protected void flushSerialBuffer() {
// Cleanup the serial buffer