}
}
+ static void put_string(String value, byte[] bytes, int start) {
+ for (int i = 0; i < value.length(); i++)
+ bytes[start + i] = (byte) value.charAt(i);
+ }
+
+ static final int AO_USB_DESC_STRING = 3;
+
+ static void put_usb_serial(int value, byte[] bytes, int start) {
+ int offset = start + 0xa;
+ int string_num = 0;
+ System.out.printf("Put usb serial %d\n", value);
+
+ while (offset < bytes.length && bytes[offset] != 0) {
+ if (bytes[offset + 1] == AO_USB_DESC_STRING) {
+ ++string_num;
+ if (string_num == 4)
+ break;
+ }
+ offset += ((int) bytes[offset]) & 0xff;
+ }
+ System.out.printf("offset %d content %d\n",
+ offset, bytes[offset]);
+ if (offset >= bytes.length || bytes[offset] == 0)
+ return;
+ int len = ((((int) bytes[offset]) & 0xff) - 2) / 2;
+ String fmt = String.format("%%0%dd", len);
+ System.out.printf("existing serial length %d format %s\n", len, fmt);
+
+ String s = String.format(fmt, value);
+ if (s.length() != len) {
+ System.out.printf("weird usb length issue %s isn't %d\n",
+ s, len);
+ return;
+ }
+ for (int i = 0; i < len; i++) {
+ bytes[offset + 2 + i*2] = (byte) s.charAt(i);
+ bytes[offset + 2 + i*2+1] = 0;
+ }
+ }
+
public AltosRomconfig(byte[] bytes, int offset) {
version = get_int(bytes, offset + 0, 2);
check = get_int(bytes, offset + 2, 2);
+ System.out.printf("version %d check %d\n", version, check);
if (check == (~version & 0xffff)) {
switch (version) {
+ case 2:
case 1:
serial_number = get_int(bytes, offset + 4, 2);
radio_calibration = get_int(bytes, offset + 6, 4);
+ System.out.printf("serial %d cal %d\n", serial_number, radio_calibration);
valid = true;
break;
}
throw new IOException("image does not contain existing rom config");
switch (existing.version) {
+ case 2:
+ put_usb_serial(serial_number, bytes, offset);
case 1:
put_int(serial_number, bytes, offset + 4, 2);
put_int(radio_calibration, bytes, offset + 6, 4);
public void write (AltosHexfile hexfile) throws IOException {
write(hexfile.data, 0xa0 - hexfile.address);
- new AltosRomconfig(hexfile);
+ AltosRomconfig check = new AltosRomconfig(hexfile);
+ if (!check.valid())
+ throw new IOException("writing new rom config failed\n");
}
public AltosRomconfig(int in_serial_number, int in_radio_calibration) {
return Integer.parseInt(serial_value.getText());
}
+ void set_serial(int serial) {
+ serial_value.setText(String.format("%d", serial));
+ }
+
int radio_calibration() {
return Integer.parseInt(radio_calibration_value.getText());
}
+ void set_radio_calibration(int calibration) {
+ radio_calibration_value.setText(String.format("%d", calibration));
+ }
+
+ public void set(AltosRomconfig config) {
+ if (config != null && config.valid()) {
+ set_serial(config.serial_number);
+ set_radio_calibration(config.radio_calibration);
+ }
+ }
+
public AltosRomconfig romconfig() {
- return new AltosRomconfig(serial(), radio_calibration());
+ try {
+ return new AltosRomconfig(serial(), radio_calibration());
+ } catch (NumberFormatException ne) {
+ return null;
+ }
}
public AltosRomconfig showDialog() {
* ao_romconfig.c
*/
-#define AO_ROMCONFIG_VERSION 1
+#define AO_ROMCONFIG_VERSION 2
extern __code __at (0x00a0) uint16_t ao_romconfig_version;
extern __code __at (0x00a2) uint16_t ao_romconfig_check;
extern __code __at (0x00a4) uint16_t ao_serial_number;
extern __code __at (0x00a6) uint32_t ao_radio_cal;
+extern __code __at (0x00aa) uint8_t ao_usb_descriptors [];
/*
* ao_usb.c
* each instance of a product
*/
-extern const uint8_t ao_usb_descriptors [];
+extern __code __at(0x00aa) uint8_t ao_usb_descriptors [];
extern const char ao_version[];
extern const char ao_manufacturer[];
extern const char ao_product[];