diff --git a/firmware/include_board/qmod/board.h b/firmware/include_board/qmod/board.h index c8af22c9..13602024 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 1637a7cb..a7fa6164 100644 --- a/firmware/src_simtrace/main.c +++ b/firmware/src_simtrace/main.c @@ -98,6 +98,78 @@ void USART0_IrqHandler(void) } #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 @@ extern int main(void) 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) {