From d0c55e79c7b18c458a5d6c0f1fbf08e3e25b3bbe Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Wed, 18 Jul 2007 22:17:35 +0000 Subject: [PATCH] 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. --- app/AvrdudeUploader.java | 68 ++++++++++++------------ app/Editor.java | 109 ++++++++++++++++++++++++++++----------- app/UispUploader.java | 4 +- app/Uploader.java | 4 +- 4 files changed, 118 insertions(+), 67 deletions(-) diff --git a/app/AvrdudeUploader.java b/app/AvrdudeUploader.java index 15677672e..d67c27a13 100755 --- a/app/AvrdudeUploader.java +++ b/app/AvrdudeUploader.java @@ -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( - "-dserial=" + (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("-c" + + Preferences.get("bootloader." + target + ".programmer")); + + if (Preferences.get("bootloader." + target + ".communication").equals("usb")) { + commandDownloader.add("-Pusb"); + } else { + commandDownloader.add( + "-P" + (Base.isWindows() ? + "/dev/" + Preferences.get("serial.port").toLowerCase() : + Preferences.get("serial.port"))); + } + 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 { diff --git a/app/Editor.java b/app/Editor.java index ad9ad9716..3002813ee 100644 --- a/app/Editor.java +++ b/app/Editor.java @@ -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); + menu.add(burnBootloader8Item); - if (!Preferences.get("build.mcu").equals("atmega8")) - burnBootloaderItem.setEnabled(false); - 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) {} @@ -801,6 +840,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() {} @@ -813,13 +868,9 @@ public class Editor extends JFrame ((JCheckBoxMenuItem) actionevent.getSource()).setState(true); 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(); libraryManager.rebuildAllBuilt(); @@ -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."); diff --git a/app/UispUploader.java b/app/UispUploader.java index 55fec638c..d26064715 100755 --- a/app/UispUploader.java +++ b/app/UispUploader.java @@ -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")); diff --git a/app/Uploader.java b/app/Uploader.java index f9ac7867f..de47c102a 100755 --- a/app/Uploader.java +++ b/app/Uploader.java @@ -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