mirror of https://gerrit.osmocom.org/simtrace2
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.
This commit is contained in:
parent
15e026ec34
commit
e974fbb9e5
|
@ -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 */
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue