first cut at turnon scripts for EasyTimer v2
[fw/altos] / altoslib / AltosHexfile.java
index f2ab4bead5c3883dd8cd1e16d5020b8cf63eb484..718826001755a0dedf1a1b9725b94a30e3fcf7f4 100644 (file)
@@ -16,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_12;
+package org.altusmetrum.altoslib_14;
 
 import java.io.*;
 import java.util.LinkedList;
@@ -287,6 +287,8 @@ public class AltosHexfile {
                return null;
        }
 
+       private static final int look_around[] = { 0, -2, 2, -4, 4 };
+
        private long find_usb_descriptors() {
                AltosHexsym     usb_descriptors = lookup_symbol("ao_usb_descriptors");
                long            a;
@@ -294,19 +296,22 @@ public class AltosHexfile {
                if (usb_descriptors == null)
                        return -1;
 
-               try {
-                       /* Walk the descriptors looking for the device */
-                       a = usb_descriptors.address;
-                       while (get_u8(a+1) != AO_USB_DESC_DEVICE) {
-                               int delta = get_u8(a);
-                               a += delta;
-                               if (delta == 0 || a >= max_address)
-                                       return -1;
+               /* The address of this has moved depending on padding
+                * in the linker script and romconfig symbols. Look
+                * forward and backwards two and four bytes to see if
+                * we can find it
+                */
+               a = usb_descriptors.address;
+
+               for (int look : look_around) {
+                       try {
+                               if (get_u8(a + look) == 0x12 && get_u8(a + look + 1) == AO_USB_DESC_DEVICE)
+                                       return a;
+                       } catch (ArrayIndexOutOfBoundsException ae) {
+                               continue;
                        }
-                       return a;
-               } catch (ArrayIndexOutOfBoundsException ae) {
-                       return -1;
                }
+               return -1;
        }
 
        public AltosUsbId find_usb_id() {
@@ -354,11 +359,6 @@ public class AltosHexfile {
 
                int product_len = get_u8(a);
 
-               System.out.printf("Product is at %x length %d\n", a, product_len);
-
-               for (int i = 0; i < product_len; i++)
-                       System.out.printf(" %2d: %02x\n", i, get_u8(a+i));
-
                if (product_len <= 0)
                        return null;
 
@@ -367,12 +367,11 @@ public class AltosHexfile {
                for (int i = 0; i < product_len - 2; i += 2) {
                        int     c = get_u16(a + 2 + i);
 
-                       System.out.printf("character %x\n", c);
-
                        product += Character.toString((char) c);
                }
 
-               System.out.printf("product %s\n", product);
+               if (AltosLink.debug)
+                       System.out.printf("product %s\n", product);
 
                return product;
        }