altosui/altoslib: Move more flashing code from altosui to altoslib
authorKeith Packard <keithp@keithp.com>
Sun, 24 Mar 2013 23:15:21 +0000 (16:15 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 8 May 2013 03:16:52 +0000 (20:16 -0700)
Required a bit of refactoring to eliminate swing types from the
flashing code, but nothing major.

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosFlash.java [new file with mode: 0644]
altoslib/AltosFlashListener.java [new file with mode: 0644]
altoslib/Makefile.am
altosui/AltosFlash.java [deleted file]
altosui/AltosFlashUI.java
altosui/Makefile.am

diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java
new file mode 100644 (file)
index 0000000..010274b
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * 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.
+ */
+
+package org.altusmetrum.altoslib_1;
+
+import java.io.*;
+
+public class AltosFlash {
+       File                    file;
+       FileInputStream         input;
+       AltosHexfile            image;
+       AltosLink               link;
+       AltosDebug              debug;
+       AltosRomconfig          rom_config;
+       boolean                 aborted;
+       AltosFlashListener      listener;
+
+       static final byte MOV_direct_data       = (byte) 0x75;
+       static final byte MOV_DPTR_data16       = (byte) 0x90;
+       static final byte MOV_A_data            = (byte) 0x74;
+       static final byte MOVX_atDPTR_A         = (byte) 0xf0;
+       static final byte MOVX_A_atDPTR         = (byte) 0xe0;
+       static final byte INC_DPTR              = (byte) 0xa3;
+       static final byte TRAP                  = (byte) 0xa5;
+
+       static final byte JB                    = (byte) 0x20;
+
+       static final byte MOV_A_direct          = (byte) 0xe5;
+       static final byte MOV_direct1_direct2   = (byte) 0x85;
+       static final byte MOV_direct_A          = (byte) 0xf5;
+       static final byte MOV_R0_data           = (byte) (0x78 | 0);
+       static final byte MOV_R1_data           = (byte) (0x78 | 1);
+       static final byte MOV_R2_data           = (byte) (0x78 | 2);
+       static final byte MOV_R3_data           = (byte) (0x78 | 3);
+       static final byte MOV_R4_data           = (byte) (0x78 | 4);
+       static final byte MOV_R5_data           = (byte) (0x78 | 5);
+       static final byte MOV_R6_data           = (byte) (0x78 | 6);
+       static final byte MOV_R7_data           = (byte) (0x78 | 7);
+       static final byte DJNZ_R0_rel           = (byte) (0xd8 | 0);
+       static final byte DJNZ_R1_rel           = (byte) (0xd8 | 1);
+       static final byte DJNZ_R2_rel           = (byte) (0xd8 | 2);
+       static final byte DJNZ_R3_rel           = (byte) (0xd8 | 3);
+       static final byte DJNZ_R4_rel           = (byte) (0xd8 | 4);
+       static final byte DJNZ_R5_rel           = (byte) (0xd8 | 5);
+       static final byte DJNZ_R6_rel           = (byte) (0xd8 | 6);
+       static final byte DJNZ_R7_rel           = (byte) (0xd8 | 7);
+
+       static final byte P1DIR                 = (byte) 0xFE;
+       static final byte P1                    = (byte) 0x90;
+
+       /* flash controller */
+       static final byte FWT                   = (byte) 0xAB;
+       static final byte FADDRL                = (byte) 0xAC;
+       static final byte FADDRH                = (byte) 0xAD;
+       static final byte FCTL                  = (byte) 0xAE;
+       static final byte FCTL_BUSY             = (byte) 0x80;
+       static final byte FCTL_BUSY_BIT         = (byte) 7;
+       static final byte FCTL_SWBSY            = (byte) 0x40;
+       static final byte FCTL_SWBSY_BIT        = (byte) 6;
+       static final byte FCTL_CONTRD           = (byte) 0x10;
+       static final byte FCTL_WRITE            = (byte) 0x02;
+       static final byte FCTL_ERASE            = (byte) 0x01;
+       static final byte FWDATA                = (byte) 0xAF;
+
+       static final byte ACC                   = (byte) 0xE0;
+
+       /* offsets within the flash_page program */
+       static final int FLASH_ADDR_HIGH        = 8;
+       static final int FLASH_ADDR_LOW         = 11;
+       static final int RAM_ADDR_HIGH          = 13;
+       static final int RAM_ADDR_LOW           = 14;
+       static final int FLASH_WORDS_HIGH       = 16;
+       static final int FLASH_WORDS_LOW        = 18;
+       static final int FLASH_TIMING           = 21;
+
+       /* sleep mode control */
+       static final int SLEEP                  = (byte) 0xbe;
+       static final int  SLEEP_USB_EN          = (byte) 0x80;
+       static final int  SLEEP_XOSC_STB        = (byte) 0x40;
+       static final int  SLEEP_HFRC_STB        = (byte) 0x20;
+       static final int  SLEEP_RST_MASK        = (byte) 0x18;
+       static final int   SLEEP_RST_POWERON    = (byte) 0x00;
+       static final int   SLEEP_RST_EXTERNAL   = (byte) 0x10;
+       static final int   SLEEP_RST_WATCHDOG   = (byte) 0x08;
+       static final int  SLEEP_OSC_PD          = (byte) 0x04;
+       static final int  SLEEP_MODE_MASK       = (byte) 0x03;
+       static final int   SLEEP_MODE_PM0       = (byte) 0x00;
+       static final int   SLEEP_MODE_PM1       = (byte) 0x01;
+       static final int   SLEEP_MODE_PM2       = (byte) 0x02;
+       static final int   SLEEP_MODE_PM3       = (byte) 0x03;
+
+       /* clock controller */
+       static final byte CLKCON                = (byte) 0xC6;
+       static final byte  CLKCON_OSC32K        = (byte) 0x80;
+       static final byte  CLKCON_OSC           = (byte) 0x40;
+       static final byte  CLKCON_TICKSPD       = (byte) 0x38;
+       static final byte  CLKCON_CLKSPD        = (byte) 0x07;
+
+       static final byte[] flash_page_proto = {
+
+               MOV_direct_data, P1DIR, (byte) 0x02,
+               MOV_direct_data, P1,    (byte) 0xFF,
+
+               MOV_direct_data, FADDRH, 0,     /* FLASH_ADDR_HIGH */
+
+               MOV_direct_data, FADDRL, 0,     /* FLASH_ADDR_LOW */
+
+               MOV_DPTR_data16, 0, 0,          /* RAM_ADDR_HIGH, RAM_ADDR_LOW */
+
+               MOV_R7_data, 0,                 /* FLASH_WORDS_HIGH */
+
+               MOV_R6_data, 0,                 /* FLASH_WORDS_LOW */
+
+
+               MOV_direct_data, FWT, 0x20,     /* FLASH_TIMING */
+
+               MOV_direct_data, FCTL, FCTL_ERASE,
+/* eraseWaitLoop: */
+               MOV_A_direct,           FCTL,
+               JB, ACC|FCTL_BUSY_BIT, (byte) 0xfb,
+
+               MOV_direct_data, P1, (byte) 0xfd,
+
+               MOV_direct_data, FCTL, FCTL_WRITE,
+/* writeLoop: */
+               MOV_R5_data, 2,
+/* writeWordLoop: */
+               MOVX_A_atDPTR,
+               INC_DPTR,
+               MOV_direct_A, FWDATA,
+               DJNZ_R5_rel, (byte) 0xfa,               /* writeWordLoop */
+/* writeWaitLoop: */
+               MOV_A_direct, FCTL,
+               JB, ACC|FCTL_SWBSY_BIT, (byte) 0xfb,    /* writeWaitLoop */
+               DJNZ_R6_rel, (byte) 0xf1,               /* writeLoop */
+               DJNZ_R7_rel, (byte) 0xef,                       /* writeLoop */
+
+               MOV_direct_data, P1DIR, (byte) 0x00,
+               MOV_direct_data, P1,    (byte) 0xFF,
+               TRAP,
+       };
+
+       public byte[] make_flash_page(int flash_addr, int ram_addr, int byte_count) {
+               int flash_word_addr = flash_addr >> 1;
+               int flash_word_count = ((byte_count + 1) >> 1);
+
+               byte[] flash_page = new byte[flash_page_proto.length];
+               for (int i = 0; i < flash_page.length; i++)
+                       flash_page[i] = flash_page_proto[i];
+
+               flash_page[FLASH_ADDR_HIGH]  = (byte) (flash_word_addr >> 8);
+               flash_page[FLASH_ADDR_LOW]   = (byte) (flash_word_addr);
+               flash_page[RAM_ADDR_HIGH]    = (byte) (ram_addr >> 8);
+               flash_page[RAM_ADDR_LOW]     = (byte) (ram_addr);
+
+               byte flash_words_low = (byte) (flash_word_count);
+               byte flash_words_high = (byte) (flash_word_count >> 8);
+               /* the flashing code has a minor 'bug' */
+               if (flash_words_low != 0)
+                       flash_words_high++;
+
+               flash_page[FLASH_WORDS_HIGH] = (byte) flash_words_high;
+               flash_page[FLASH_WORDS_LOW]  = (byte) flash_words_low;
+               return flash_page;
+       }
+
+       static byte[] set_clkcon_fast = {
+               MOV_direct_data, CLKCON, 0x00
+       };
+
+       static byte[] get_sleep = {
+               MOV_A_direct, SLEEP
+       };
+
+       public void clock_init() throws IOException, InterruptedException {
+               if (debug != null) {
+                       debug.debug_instr(set_clkcon_fast);
+
+                       byte    status;
+                       for (int times = 0; times < 20; times++) {
+                               Thread.sleep(1);
+                               status = debug.debug_instr(get_sleep);
+                               if ((status & SLEEP_XOSC_STB) != 0)
+                                       return;
+                       }
+                       throw new IOException("Failed to initialize target clock");
+               }
+       }
+
+       void action(String s, int percent) {
+               if (listener != null && !aborted)
+                       listener.position(s, percent);
+       }
+
+       void action(int part, int total) {
+               int percent = 100 * part / total;
+               action(String.format("%d/%d (%d%%)",
+                                    part, total, percent),
+                      percent);
+       }
+
+       void altos_run(int pc) throws IOException, InterruptedException {
+               debug.set_pc(pc);
+               int set_pc = debug.get_pc();
+               if (pc != set_pc)
+                       throw new IOException("Failed to set target program counter");
+               debug.resume();
+
+               for (int times = 0; times < 20; times++) {
+                       byte status = debug.read_status();
+                       if ((status & AltosDebug.STATUS_CPU_HALTED) != 0)
+                               return;
+               }
+
+               throw new IOException("Failed to execute program on target");
+       }
+
+       public void flash() {
+               try {
+                       if (!check_rom_config())
+                               throw new IOException("Invalid rom config settings");
+                       if (image.address + image.data.length > 0x8000)
+                               throw new IOException(String.format("Flash image too long %d",
+                                                                   image.address +
+                                                                   image.data.length));
+                       if ((image.address & 0x3ff) != 0)
+                               throw new IOException(String.format("Flash image must start on page boundary (is 0x%x)",
+                                                                   image.address));
+                       int ram_address = 0xf000;
+                       int flash_prog = 0xf400;
+
+                       /*
+                        * Store desired config values into image
+                        */
+                       rom_config.write(image);
+                       /*
+                        * Bring up the clock
+                        */
+                       clock_init();
+
+                       int remain = image.data.length;
+                       int flash_addr = image.address;
+                       int image_start = 0;
+
+                       action("start", 0);
+                       action(0, image.data.length);
+                       while (remain > 0 && !aborted) {
+                               int this_time = remain;
+                               if (this_time > 0x400)
+                                       this_time = 0x400;
+
+                               if (debug != null) {
+                                       /* write the data */
+                                       debug.write_memory(ram_address, image.data,
+                                                          image_start, this_time);
+
+                                       /* write the flash program */
+                                       byte[] flash_page = make_flash_page(flash_addr,
+                                                                           ram_address,
+                                                                           this_time);
+                                       debug.write_memory(flash_prog, flash_page);
+
+                                       altos_run(flash_prog);
+                                       byte[] check = debug.read_memory(flash_addr, this_time);
+                                       for (int i = 0; i < this_time; i++)
+                                               if (check[i] != image.data[image_start + i])
+                                                       throw new IOException(String.format("Flash write failed at 0x%x (%02x != %02x)",
+                                                                                           image.address + image_start + i,
+                                                                                           check[i], image.data[image_start + i]));
+                               } else {
+                                       Thread.sleep(100);
+                               }
+
+                               remain -= this_time;
+                               flash_addr += this_time;
+                               image_start += this_time;
+
+                               action(image.data.length - remain, image.data.length);
+                       }
+                       if (!aborted) {
+                               action("done", 100);
+                               if (debug != null) {
+                                       debug.set_pc(image.address);
+                                       debug.resume();
+                               }
+                       }
+                       if (debug != null)
+                               debug.close();
+               } catch (IOException ie) {
+                       action(ie.getMessage(), -1);
+                       abort();
+               } catch (InterruptedException ie) {
+                       abort();
+               }
+       }
+
+       public void close() {
+               if (debug != null)
+                       debug.close();
+       }
+
+       synchronized public void abort() {
+               aborted = true;
+               close();
+       }
+
+       public boolean check_rom_config() {
+               if (debug == null)
+                       return true;
+               if (rom_config == null)
+                       rom_config = debug.romconfig();
+               return rom_config != null && rom_config.valid();
+       }
+
+       public void set_romconfig (AltosRomconfig romconfig) {
+               rom_config = romconfig;
+       }
+
+       public AltosRomconfig romconfig() {
+               if (!check_rom_config())
+                       return null;
+               return rom_config;
+       }
+
+       public AltosFlash(File file, AltosLink link, AltosFlashListener listener)
+               throws IOException, FileNotFoundException, InterruptedException {
+               this.file = file;
+               this.link = link;
+               this.listener = listener;
+               if (link != null)
+                       debug = new AltosDebug(link);
+               input = new FileInputStream(file);
+               image = new AltosHexfile(input);
+               if (debug != null && !debug.check_connection()) {
+                       debug.close();
+                       throw new IOException("Debug port not connected");
+               }
+       }
+}
\ No newline at end of file
diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java
new file mode 100644 (file)
index 0000000..ab50b74
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * 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.
+ */
+
+package org.altusmetrum.altoslib_1;
+
+public interface AltosFlashListener {
+       public void position(String label, int percent);
+}
index db0236a11902f1eb95953a76bcc4ff39d05900cc..18b028d628776652ef2243e30ba8eb50ce22fc80 100644 (file)
@@ -25,6 +25,8 @@ altoslib_JAVA = \
        AltosEepromRecord.java \
        AltosEepromTeleScience.java \
        AltosFile.java \
        AltosEepromRecord.java \
        AltosEepromTeleScience.java \
        AltosFile.java \
+       AltosFlash.java \
+       AltosFlashListener.java \
        AltosFlightReader.java \
        AltosFrequency.java \
        AltosGPS.java \
        AltosFlightReader.java \
        AltosFrequency.java \
        AltosGPS.java \
diff --git a/altosui/AltosFlash.java b/altosui/AltosFlash.java
deleted file mode 100644 (file)
index b409a61..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright © 2010 Keith Packard <keithp@keithp.com>
- *
- * 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; version 2 of the License.
- *
- * 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.
- */
-
-package altosui;
-
-import java.awt.event.*;
-import javax.swing.*;
-import java.io.*;
-import org.altusmetrum.altoslib_1.*;
-import org.altusmetrum.altosuilib_1.*;
-
-public class AltosFlash {
-       File            file;
-       FileInputStream input;
-       AltosHexfile    image;
-       JFrame          frame;
-       AltosDevice     debug_dongle;
-       AltosDebug      debug;
-       AltosRomconfig  rom_config;
-       ActionListener  listener;
-       boolean         aborted;
-
-       static final byte MOV_direct_data       = (byte) 0x75;
-       static final byte MOV_DPTR_data16       = (byte) 0x90;
-       static final byte MOV_A_data            = (byte) 0x74;
-       static final byte MOVX_atDPTR_A         = (byte) 0xf0;
-       static final byte MOVX_A_atDPTR         = (byte) 0xe0;
-       static final byte INC_DPTR              = (byte) 0xa3;
-       static final byte TRAP                  = (byte) 0xa5;
-
-       static final byte JB                    = (byte) 0x20;
-
-       static final byte MOV_A_direct          = (byte) 0xe5;
-       static final byte MOV_direct1_direct2   = (byte) 0x85;
-       static final byte MOV_direct_A          = (byte) 0xf5;
-       static final byte MOV_R0_data           = (byte) (0x78 | 0);
-       static final byte MOV_R1_data           = (byte) (0x78 | 1);
-       static final byte MOV_R2_data           = (byte) (0x78 | 2);
-       static final byte MOV_R3_data           = (byte) (0x78 | 3);
-       static final byte MOV_R4_data           = (byte) (0x78 | 4);
-       static final byte MOV_R5_data           = (byte) (0x78 | 5);
-       static final byte MOV_R6_data           = (byte) (0x78 | 6);
-       static final byte MOV_R7_data           = (byte) (0x78 | 7);
-       static final byte DJNZ_R0_rel           = (byte) (0xd8 | 0);
-       static final byte DJNZ_R1_rel           = (byte) (0xd8 | 1);
-       static final byte DJNZ_R2_rel           = (byte) (0xd8 | 2);
-       static final byte DJNZ_R3_rel           = (byte) (0xd8 | 3);
-       static final byte DJNZ_R4_rel           = (byte) (0xd8 | 4);
-       static final byte DJNZ_R5_rel           = (byte) (0xd8 | 5);
-       static final byte DJNZ_R6_rel           = (byte) (0xd8 | 6);
-       static final byte DJNZ_R7_rel           = (byte) (0xd8 | 7);
-
-       static final byte P1DIR                 = (byte) 0xFE;
-       static final byte P1                    = (byte) 0x90;
-
-       /* flash controller */
-       static final byte FWT                   = (byte) 0xAB;
-       static final byte FADDRL                = (byte) 0xAC;
-       static final byte FADDRH                = (byte) 0xAD;
-       static final byte FCTL                  = (byte) 0xAE;
-       static final byte FCTL_BUSY             = (byte) 0x80;
-       static final byte FCTL_BUSY_BIT         = (byte) 7;
-       static final byte FCTL_SWBSY            = (byte) 0x40;
-       static final byte FCTL_SWBSY_BIT        = (byte) 6;
-       static final byte FCTL_CONTRD           = (byte) 0x10;
-       static final byte FCTL_WRITE            = (byte) 0x02;
-       static final byte FCTL_ERASE            = (byte) 0x01;
-       static final byte FWDATA                = (byte) 0xAF;
-
-       static final byte ACC                   = (byte) 0xE0;
-
-       /* offsets within the flash_page program */
-       static final int FLASH_ADDR_HIGH        = 8;
-       static final int FLASH_ADDR_LOW         = 11;
-       static final int RAM_ADDR_HIGH          = 13;
-       static final int RAM_ADDR_LOW           = 14;
-       static final int FLASH_WORDS_HIGH       = 16;
-       static final int FLASH_WORDS_LOW        = 18;
-       static final int FLASH_TIMING           = 21;
-
-       /* sleep mode control */
-       static final int SLEEP                  = (byte) 0xbe;
-       static final int  SLEEP_USB_EN          = (byte) 0x80;
-       static final int  SLEEP_XOSC_STB        = (byte) 0x40;
-       static final int  SLEEP_HFRC_STB        = (byte) 0x20;
-       static final int  SLEEP_RST_MASK        = (byte) 0x18;
-       static final int   SLEEP_RST_POWERON    = (byte) 0x00;
-       static final int   SLEEP_RST_EXTERNAL   = (byte) 0x10;
-       static final int   SLEEP_RST_WATCHDOG   = (byte) 0x08;
-       static final int  SLEEP_OSC_PD          = (byte) 0x04;
-       static final int  SLEEP_MODE_MASK       = (byte) 0x03;
-       static final int   SLEEP_MODE_PM0       = (byte) 0x00;
-       static final int   SLEEP_MODE_PM1       = (byte) 0x01;
-       static final int   SLEEP_MODE_PM2       = (byte) 0x02;
-       static final int   SLEEP_MODE_PM3       = (byte) 0x03;
-
-       /* clock controller */
-       static final byte CLKCON                = (byte) 0xC6;
-       static final byte  CLKCON_OSC32K        = (byte) 0x80;
-       static final byte  CLKCON_OSC           = (byte) 0x40;
-       static final byte  CLKCON_TICKSPD       = (byte) 0x38;
-       static final byte  CLKCON_CLKSPD        = (byte) 0x07;
-
-       static final byte[] flash_page_proto = {
-
-               MOV_direct_data, P1DIR, (byte) 0x02,
-               MOV_direct_data, P1,    (byte) 0xFF,
-
-               MOV_direct_data, FADDRH, 0,     /* FLASH_ADDR_HIGH */
-
-               MOV_direct_data, FADDRL, 0,     /* FLASH_ADDR_LOW */
-
-               MOV_DPTR_data16, 0, 0,          /* RAM_ADDR_HIGH, RAM_ADDR_LOW */
-
-               MOV_R7_data, 0,                 /* FLASH_WORDS_HIGH */
-
-               MOV_R6_data, 0,                 /* FLASH_WORDS_LOW */
-
-
-               MOV_direct_data, FWT, 0x20,     /* FLASH_TIMING */
-
-               MOV_direct_data, FCTL, FCTL_ERASE,
-/* eraseWaitLoop: */
-               MOV_A_direct,           FCTL,
-               JB, ACC|FCTL_BUSY_BIT, (byte) 0xfb,
-
-               MOV_direct_data, P1, (byte) 0xfd,
-
-               MOV_direct_data, FCTL, FCTL_WRITE,
-/* writeLoop: */
-               MOV_R5_data, 2,
-/* writeWordLoop: */
-               MOVX_A_atDPTR,
-               INC_DPTR,
-               MOV_direct_A, FWDATA,
-               DJNZ_R5_rel, (byte) 0xfa,               /* writeWordLoop */
-/* writeWaitLoop: */
-               MOV_A_direct, FCTL,
-               JB, ACC|FCTL_SWBSY_BIT, (byte) 0xfb,    /* writeWaitLoop */
-               DJNZ_R6_rel, (byte) 0xf1,               /* writeLoop */
-               DJNZ_R7_rel, (byte) 0xef,                       /* writeLoop */
-
-               MOV_direct_data, P1DIR, (byte) 0x00,
-               MOV_direct_data, P1,    (byte) 0xFF,
-               TRAP,
-       };
-
-       public byte[] make_flash_page(int flash_addr, int ram_addr, int byte_count) {
-               int flash_word_addr = flash_addr >> 1;
-               int flash_word_count = ((byte_count + 1) >> 1);
-
-               byte[] flash_page = new byte[flash_page_proto.length];
-               for (int i = 0; i < flash_page.length; i++)
-                       flash_page[i] = flash_page_proto[i];
-
-               flash_page[FLASH_ADDR_HIGH]  = (byte) (flash_word_addr >> 8);
-               flash_page[FLASH_ADDR_LOW]   = (byte) (flash_word_addr);
-               flash_page[RAM_ADDR_HIGH]    = (byte) (ram_addr >> 8);
-               flash_page[RAM_ADDR_LOW]     = (byte) (ram_addr);
-
-               byte flash_words_low = (byte) (flash_word_count);
-               byte flash_words_high = (byte) (flash_word_count >> 8);
-               /* the flashing code has a minor 'bug' */
-               if (flash_words_low != 0)
-                       flash_words_high++;
-
-               flash_page[FLASH_WORDS_HIGH] = (byte) flash_words_high;
-               flash_page[FLASH_WORDS_LOW]  = (byte) flash_words_low;
-               return flash_page;
-       }
-
-       static byte[] set_clkcon_fast = {
-               MOV_direct_data, CLKCON, 0x00
-       };
-
-       static byte[] get_sleep = {
-               MOV_A_direct, SLEEP
-       };
-
-       public void clock_init() throws IOException, InterruptedException {
-               if (debug != null) {
-                       debug.debug_instr(set_clkcon_fast);
-
-                       byte    status;
-                       for (int times = 0; times < 20; times++) {
-                               Thread.sleep(1);
-                               status = debug.debug_instr(get_sleep);
-                               if ((status & SLEEP_XOSC_STB) != 0)
-                                       return;
-                       }
-                       throw new IOException("Failed to initialize target clock");
-               }
-       }
-
-       void action(String in_s, int in_percent) {
-               final String s = in_s;
-               final int percent = in_percent;
-               if (listener != null && !aborted) {
-                       Runnable r = new Runnable() {
-                                       public void run() {
-                                               try {
-                                                       listener.actionPerformed(new ActionEvent(this,
-                                                                                                percent,
-                                                                                                s));
-                                               } catch (Exception ex) {
-                                               }
-                                       }
-                               };
-                       SwingUtilities.invokeLater(r);
-               }
-       }
-
-       void action(int part, int total) {
-               int percent = 100 * part / total;
-               action(String.format("%d/%d (%d%%)",
-                                    part, total, percent),
-                      percent);
-       }
-
-       void altos_run(int pc) throws IOException, InterruptedException {
-               debug.set_pc(pc);
-               int set_pc = debug.get_pc();
-               if (pc != set_pc)
-                       throw new IOException("Failed to set target program counter");
-               debug.resume();
-
-               for (int times = 0; times < 20; times++) {
-                       byte status = debug.read_status();
-                       if ((status & AltosDebug.STATUS_CPU_HALTED) != 0)
-                               return;
-               }
-
-               throw new IOException("Failed to execute program on target");
-       }
-
-       public void flash() {
-               try {
-                       if (!check_rom_config())
-                               throw new IOException("Invalid rom config settings");
-                       if (image.address + image.data.length > 0x8000)
-                               throw new IOException(String.format("Flash image too long %d",
-                                                                   image.address +
-                                                                   image.data.length));
-                       if ((image.address & 0x3ff) != 0)
-                               throw new IOException(String.format("Flash image must start on page boundary (is 0x%x)",
-                                                                   image.address));
-                       int ram_address = 0xf000;
-                       int flash_prog = 0xf400;
-
-                       /*
-                        * Store desired config values into image
-                        */
-                       rom_config.write(image);
-                       /*
-                        * Bring up the clock
-                        */
-                       clock_init();
-
-                       int remain = image.data.length;
-                       int flash_addr = image.address;
-                       int image_start = 0;
-
-                       action("start", 0);
-                       action(0, image.data.length);
-                       while (remain > 0 && !aborted) {
-                               int this_time = remain;
-                               if (this_time > 0x400)
-                                       this_time = 0x400;
-
-                               if (debug != null) {
-                                       /* write the data */
-                                       debug.write_memory(ram_address, image.data,
-                                                          image_start, this_time);
-
-                                       /* write the flash program */
-                                       byte[] flash_page = make_flash_page(flash_addr,
-                                                                           ram_address,
-                                                                           this_time);
-                                       debug.write_memory(flash_prog, flash_page);
-
-                                       altos_run(flash_prog);
-                                       byte[] check = debug.read_memory(flash_addr, this_time);
-                                       for (int i = 0; i < this_time; i++)
-                                               if (check[i] != image.data[image_start + i])
-                                                       throw new IOException(String.format("Flash write failed at 0x%x (%02x != %02x)",
-                                                                                           image.address + image_start + i,
-                                                                                           check[i], image.data[image_start + i]));
-                               } else {
-                                       Thread.sleep(100);
-                               }
-
-                               remain -= this_time;
-                               flash_addr += this_time;
-                               image_start += this_time;
-
-                               action(image.data.length - remain, image.data.length);
-                       }
-                       if (!aborted) {
-                               action("done", 100);
-                               if (debug != null) {
-                                       debug.set_pc(image.address);
-                                       debug.resume();
-                               }
-                       }
-                       if (debug != null)
-                               debug.close();
-               } catch (IOException ie) {
-                       action(ie.getMessage(), -1);
-                       abort();
-               } catch (InterruptedException ie) {
-                       abort();
-               }
-       }
-
-       public void close() {
-               if (debug != null)
-                       debug.close();
-       }
-
-       synchronized public void abort() {
-               aborted = true;
-               close();
-       }
-
-       public void addActionListener(ActionListener l) {
-               listener = l;
-       }
-
-       public boolean check_rom_config() {
-               if (debug == null)
-                       return true;
-               if (rom_config == null)
-                       rom_config = debug.romconfig();
-               return rom_config != null && rom_config.valid();
-       }
-
-       public void set_romconfig (AltosRomconfig romconfig) {
-               rom_config = romconfig;
-       }
-
-       public AltosRomconfig romconfig() {
-               if (!check_rom_config())
-                       return null;
-               return rom_config;
-       }
-
-       public AltosFlash(File in_file, AltosDevice in_debug_dongle)
-               throws IOException, FileNotFoundException, AltosSerialInUseException, InterruptedException {
-               file = in_file;
-               debug_dongle = in_debug_dongle;
-               if (debug_dongle != null)
-                       debug = new AltosDebug(new AltosSerial(in_debug_dongle));
-               input = new FileInputStream(file);
-               image = new AltosHexfile(input);
-               if (debug != null && !debug.check_connection()) {
-                       debug.close();
-                       throw new IOException("Debug port not connected");
-               }
-       }
-}
\ No newline at end of file
index e517627818097e5d5e755f789f90623aae65526a..f4e522181b8f95419d0094f0881cb84a72b22f02 100644 (file)
@@ -215,15 +215,30 @@ public class AltosFlashUI
                }
        }
 
                }
        }
 
-       class flash_task implements Runnable {
+       class flash_task implements Runnable, AltosFlashListener {
                AltosFlashUI    ui;
                Thread          t;
                AltosFlash      flash;
 
                AltosFlashUI    ui;
                Thread          t;
                AltosFlash      flash;
 
+               public void position(String in_s, int in_percent) {
+                       final String s = in_s;
+                       final int percent = in_percent;
+                       Runnable r = new Runnable() {
+                                       public void run() {
+                                               try {
+                                                       ui.actionPerformed(new ActionEvent(this,
+                                                                                          percent,
+                                                                                          s));
+                                               } catch (Exception ex) {
+                                               }
+                                       }
+                               };
+                       SwingUtilities.invokeLater(r);
+               }
+
                public void run () {
                        try {
                public void run () {
                        try {
-                               flash = new AltosFlash(ui.file, ui.debug_dongle);
-                               flash.addActionListener(ui);
+                               flash = new AltosFlash(ui.file, new AltosSerial(ui.debug_dongle), this);
 
                                final AltosRomconfig    current_config = flash.romconfig();
 
 
                                final AltosRomconfig    current_config = flash.romconfig();
 
index 56554697196ab925fccb18fa8ce33b95274ee646..d59e308248000cf98c3c16d358f7770337710463 100644 (file)
@@ -39,7 +39,6 @@ altosui_JAVA = \
        AltosEepromManage.java \
        AltosEepromMonitor.java \
        AltosEepromSelect.java \
        AltosEepromManage.java \
        AltosEepromMonitor.java \
        AltosEepromSelect.java \
-       AltosFlash.java \
        AltosFlashUI.java \
        AltosFlightDisplay.java \
        AltosFlightInfoTableModel.java \
        AltosFlashUI.java \
        AltosFlightDisplay.java \
        AltosFlightInfoTableModel.java \