From e974fbb9e5b1fd3bc431f4c0fb3f6772e1df81d7 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Wed, 19 Oct 2016 19:36:07 +0200 Subject: [PATCH] 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. --- firmware/include_board/qmod/board.h | 2 +- firmware/src_simtrace/main.c | 135 +++++++++++++++------------- 2 files changed, 74 insertions(+), 63 deletions(-) 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) {