altosui: Abort flashing if debug port isn't working
authorKeith Packard <keithp@keithp.com>
Thu, 2 Sep 2010 05:43:22 +0000 (22:43 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 3 Sep 2010 14:04:28 +0000 (07:04 -0700)
Check each command going over the debug port and make sure it works as
expected. This commit adds checks for initializing the clock,
selecting the desired program counter and running the flash
program.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/altosui/AltosFlash.java

index b70185558f974a6fe9fb94b7ebf10db4c1dd5258..a3e431cdf7dd9c60bde16953d40f116236420b0b 100644 (file)
@@ -202,9 +202,13 @@ public class AltosFlash {
                debug.debug_instr(set_clkcon_fast);
 
                byte    status;
-               do {
+               for (int times = 0; times < 20; times++) {
+                       Thread.sleep(1);
                        status = debug.debug_instr(get_sleep);
-               } while ((status & SLEEP_XOSC_STB) == 0);
+                       if ((status & SLEEP_XOSC_STB) != 0)
+                               return;
+               }
+               throw new IOException("Failed to initialize target clock");
        }
 
        void action(String s, int percent) {
@@ -221,6 +225,22 @@ public class AltosFlash {
                       percent);
        }
 
+       void 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() throws IOException, FileNotFoundException, InterruptedException {
                if (!check_rom_config())
                        throw new IOException("Invalid rom config settings");
@@ -264,16 +284,7 @@ public class AltosFlash {
                                                            this_time);
                        debug.write_memory(flash_prog, flash_page);
 
-                       debug.set_pc(flash_prog);
-                       int pc = debug.get_pc();
-                       debug.resume();
-                       Thread.sleep(100);
-                       for (int times = 0; times < 10; times++) {
-                               byte status = debug.read_status();
-                               if ((status & AltosDebug.STATUS_CPU_HALTED) != 0)
-                                       break;
-                               Thread.sleep(100);
-                       }
+                       run(flash_prog);
 
                        byte[] check = debug.read_memory(flash_addr, this_time);
                        for (int i = 0; i < this_time; i++)