Issue ST12_PRTPWR_OVERRIDE before putting hub in reset

When we reset the hub, the hub will actively drvie the PRTPWR signal of
the SITMRACE12 low, resulting in the SAM3 being shut off.  If we want to
"survive" this, we need to set the OVERRIDE before we go into reset.

Right now, we never release the signal again, keeping ST12 enabled
permanently, which is of course not what we want in general.
diff --git a/firmware/include_board/qmod/board.h b/firmware/include_board/qmod/board.h
index c8af22c..1360202 100644
--- a/firmware/include_board/qmod/board.h
+++ b/firmware/include_board/qmod/board.h
@@ -41,7 +41,7 @@
 
 #define PINS_CARDSIM		{ PIN_SET_USIM1_PRES, PIN_SET_USIM2_PRES }
 
-#define PIN_PRTPWR_OVERRIDE	{PIO_PA8, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}
+#define PIN_PRTPWR_OVERRIDE	{PIO_PA8, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
 
 #define SIMTRACE_VENDOR_ID          0x1d50
 #define SIMTRACE_PRODUCT_ID         0x60e3	/* FIXME */
diff --git a/firmware/src_simtrace/main.c b/firmware/src_simtrace/main.c
index 1637a7c..a7fa616 100644
--- a/firmware/src_simtrace/main.c
+++ b/firmware/src_simtrace/main.c
@@ -98,6 +98,78 @@
 }
 
 #include "i2c.h"
+
+static int write_hub_eeprom(void)
+{
+	const unsigned char __eeprom_bin[] = {
+  0x23, 0x42, 0x17, 0x25, 0x00, 0x00, 0x9b, 0x20, 0x01, 0xa0, 0x00, 0x5e,
+  0x01, 0x32, 0x01, 0x32, 0x32, 0x04, 0x09, 0x18, 0x0d, 0x00, 0x73, 0x00,
+  0x79, 0x00, 0x73, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x6f, 0x00,
+  0x6d, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x73, 0x00, 0x2e, 0x00,
+  0x66, 0x00, 0x2e, 0x00, 0x6d, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x2e, 0x00,
+  0x20, 0x00, 0x47, 0x00, 0x6d, 0x00, 0x62, 0x00, 0x48, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x71, 0x00, 0x75, 0x00, 0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6d, 0x00,
+  0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x76, 0x00,
+  0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00,
+  0x00, 0x00, 0x00, 0x00
+	};
+	const unsigned int __eeprom_bin_len = 256;
+
+	const Pin pin_hubpwr_override = PIN_PRTPWR_OVERRIDE;
+	const Pin pin_hub_rst = {PIO_PA13, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT};
+	int i;
+
+	/* set PIN_PRTPWR_OVERRIDE to output-low to avoid the internal
+	 * pull-up on the input to keep SIMTRACE12 alive */
+	PIO_Configure(&pin_hubpwr_override, 1);
+
+	PIO_Configure(&pin_hub_rst, 1);
+	i2c_pin_init();
+
+	/* wait */
+	volatile int v;
+	/* 440ns per cycle here */
+	for (i = 0; i < 1000000; i++) {
+		v = 0;
+	}
+
+	/* write the EEPROM once */
+	for (i = 0; i < 256; i++) {
+		int rc = eeprom_write_byte(0x50, i, __eeprom_bin[i]);
+		/* if the result was negative, repeat that write */
+		if (rc < 0)
+			i--;
+	}
+
+	/* then pursue re-reading it again and again */
+	for (i = 0; i < 256; i++) {
+		int byte = eeprom_read_byte(0x50, i);
+		TRACE_INFO("0x%02x: %02x\r\n", i, byte);
+		if (byte != __eeprom_bin[i])
+			TRACE_ERROR("Byte %u is wrong, expected 0x%02x, found 0x%02x\r\n",
+					i, __eeprom_bin[i], byte);
+	}
+	PIO_Clear(&pin_hub_rst);
+
+	/* FIXME: Release PIN_PRTPWR_OVERRIDE after we know the hub is
+	 * again powering us up */
+
+	return 0;
+}
+
+
 /*------------------------------------------------------------------------------
  *        Main
  *------------------------------------------------------------------------------*/
@@ -132,68 +204,7 @@
 		   g_unique_id[0], g_unique_id[1],
 		   g_unique_id[2], g_unique_id[3]);
 
-#if 1
-
-static const unsigned char __eeprom_bin[] = {
-  0x23, 0x42, 0x17, 0x25, 0x00, 0x00, 0x9b, 0x20, 0x01, 0xa0, 0x00, 0x5e,
-  0x01, 0x32, 0x01, 0x32, 0x32, 0x04, 0x09, 0x18, 0x0d, 0x00, 0x73, 0x00,
-  0x79, 0x00, 0x73, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x6f, 0x00,
-  0x6d, 0x00, 0x20, 0x00, 0x2d, 0x00, 0x20, 0x00, 0x73, 0x00, 0x2e, 0x00,
-  0x66, 0x00, 0x2e, 0x00, 0x6d, 0x00, 0x2e, 0x00, 0x63, 0x00, 0x2e, 0x00,
-  0x20, 0x00, 0x47, 0x00, 0x6d, 0x00, 0x62, 0x00, 0x48, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x71, 0x00, 0x75, 0x00, 0x61, 0x00, 0x64, 0x00, 0x20, 0x00, 0x6d, 0x00,
-  0x6f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x76, 0x00,
-  0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00,
-  0x00, 0x00, 0x00, 0x00
-};
-static const unsigned int __eeprom_bin_len = 256;
-
-	static const Pin pin_hub_rst = {PIO_PA13, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT};
-	PIO_Configure(&pin_hub_rst, 1);
-	i2c_pin_init();
-
-	/* set PIN_PRTPWR_OVERRIDE to output-low to avoid the internal
-	 * pull-up on the input to keep SIMTRACE12 alive */
-	static const Pin pin_hubpwr_override = PIN_PRTPWR_OVERRIDE;
-	PIO_Configure(&pin_hubpwr_override, 1);
-
-	/* wait */
-	volatile int v;
-	/* 440ns per cycle here */
-	for (i = 0; i < 1000000; i++) {
-		v = 0;
-	}
-
-	/* write the EEPROM once */
-	for (i = 0; i < 256; i++) {
-		int rc = eeprom_write_byte(0x50, i, __eeprom_bin[i]);
-		/* if the result was negative, repeat that write */
-		if (rc < 0)
-			i--;
-	}
-
-	/* then pursue re-reading it again and again */
-	for (i = 0; i < 256; i++) {
-		int byte = eeprom_read_byte(0x50, i);
-		TRACE_INFO("0x%02x: %02x\r\n", i, byte);
-		if (byte != __eeprom_bin[i])
-			TRACE_ERROR("Byte %u is wrong, expected 0x%02x, found 0x%02x\r\n",
-					i, __eeprom_bin[i], byte);
-	}
-	PIO_Clear(&pin_hub_rst);
-#endif
+	write_hub_eeprom();
 
 	TRACE_INFO("USB init...\r\n");
 	while (USBD_GetState() < USBD_STATE_CONFIGURED) {