Hoernchen has uploaded this change for review.

View Change

fix usb usb reset handling by delayed soft reset

Requires BL clock init, not compatible with old bootloaders!

Will always reboot to DFU mode with old bootloader/wrong clocks.

Change-Id: I0939930a42f3009abf7e670561a123963bbd3845
---
M sysmoOCTSIM/atmel_start.c
M sysmoOCTSIM/hpl/core/hpl_init.c
M sysmoOCTSIM/hpl/usb/hpl_usb.c
M sysmoOCTSIM/main.c
M sysmoOCTSIM/usb_start.c
5 files changed, 35 insertions(+), 24 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/45/39445/1
diff --git a/sysmoOCTSIM/atmel_start.c b/sysmoOCTSIM/atmel_start.c
index d6304fa..4d52d0d 100644
--- a/sysmoOCTSIM/atmel_start.c
+++ b/sysmoOCTSIM/atmel_start.c
@@ -9,5 +9,4 @@
#ifdef ENABLE_DBG_UART7
stdio_redirect_init();
#endif
- usb_init();
}
diff --git a/sysmoOCTSIM/hpl/core/hpl_init.c b/sysmoOCTSIM/hpl/core/hpl_init.c
index be0db93..e6997a3 100644
--- a/sysmoOCTSIM/hpl/core/hpl_init.c
+++ b/sysmoOCTSIM/hpl/core/hpl_init.c
@@ -54,13 +54,13 @@
{
hri_nvmctrl_set_CTRLA_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE);

- _osc32kctrl_init_sources();
- _oscctrl_init_sources();
- _mclk_init();
-#if _GCLK_INIT_1ST
- _gclk_init_generators_by_fref(_GCLK_INIT_1ST);
-#endif
- _oscctrl_init_referenced_generators();
+ // _osc32kctrl_init_sources();
+ // _oscctrl_init_sources();
+ // _mclk_init();
+// #if _GCLK_INIT_1ST
+// _gclk_init_generators_by_fref(_GCLK_INIT_1ST);
+// #endif
+// _oscctrl_init_referenced_generators();
_gclk_init_generators_by_fref(_GCLK_INIT_LAST);

#if CONF_DMAC_ENABLE
diff --git a/sysmoOCTSIM/hpl/usb/hpl_usb.c b/sysmoOCTSIM/hpl/usb/hpl_usb.c
index 99e4606..8508842 100644
--- a/sysmoOCTSIM/hpl/usb/hpl_usb.c
+++ b/sysmoOCTSIM/hpl/usb/hpl_usb.c
@@ -44,6 +44,7 @@
/* save previous setup state to allow device reset when receving usb reset after the device
* was previously properly configured, i.e. when powered externally and usb is disconnected and reconnected */
volatile bool address_was_set = false;
+volatile bool delayed_usb_reset = false;

/**
* \brief Dummy callback function
@@ -981,13 +982,8 @@
_usb_d_dev_reset_epts();

if(address_was_set == true) {
- _usb_d_dev_detach();
address_was_set = 0;
- delay_ms(100);
- __disable_irq();
- __DMB();
- __DSB();
- NVIC_SystemReset();
+ delayed_usb_reset = true;
}

dev_inst.callbacks.event(USB_EV_RESET, 0);
diff --git a/sysmoOCTSIM/main.c b/sysmoOCTSIM/main.c
index 2dfc255..191d4ae 100644
--- a/sysmoOCTSIM/main.c
+++ b/sysmoOCTSIM/main.c
@@ -66,7 +66,6 @@
* (there are 8 inputs + traces to drive!) */
hri_port_set_PINCFG_DRVSTR_bit(PORT, 0, 11);

- ccid_app_init();
}

/***********************************************************************
@@ -467,6 +466,16 @@

char rstcause_buf[RSTCAUSE_STR_SIZE];

+void do_usb_res(void){
+ hri_usbdevice_set_CTRLA_SWRST_bit(USB);
+ uint32_t* application_start_address = (uint32_t*)(16384);
+ __set_MSP(*application_start_address);
+ __DSB();
+ __ISB();
+ asm("bx %0"::"r"(*(application_start_address + 1)));
+}
+
+extern volatile bool delayed_usb_reset;

int main(void)
{
@@ -494,18 +503,23 @@

#endif

- atmel_start_init();
+ // return to dfu on mismatched old BL with improper clock config.
+ if(hri_gclk_read_GENCTRL_SRC_bf(GCLK, 0) == GCLK_GENCTRL_SRC_XOSC1_Val){
+ *(uint32_t*)HSRAM_ADDR = 0x44465521;
+ NVIC_SystemReset();
+ }
+
get_chip_unique_serial_str(sernr_buf, sizeof(sernr_buf));
str_to_usb_desc(sernr_buf, sizeof(sernr_buf), sernr_buf_descr, sizeof(sernr_buf_descr));

str_to_usb_desc(product_buf, sizeof(product_buf)-1, product_buf_descr, sizeof(product_buf_descr));
get_rstcause_str(rstcause_buf);

-
-
- usb_start();
-
+ atmel_start_init();
board_init();
+ usb_init();
+ usb_start();
+ ccid_app_init();

#ifdef WITH_DEBUG_CDC
command_init("sysmoOCTSIM> ");
@@ -562,6 +576,8 @@

// command_print_prompt();
while (true) { // main loop
+ if(delayed_usb_reset)
+ do_usb_res();
command_try_recv();
poll_card_detect();
submit_next_irq();
diff --git a/sysmoOCTSIM/usb_start.c b/sysmoOCTSIM/usb_start.c
index d4057be..6946126 100644
--- a/sysmoOCTSIM/usb_start.c
+++ b/sysmoOCTSIM/usb_start.c
@@ -10,13 +10,13 @@
#include "usb_descriptors.h"

#define CDCD_ECHO_BUF_SIZ CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ
-
+#ifdef WITH_DEBUG_CDC
/** Buffers to receive and echo the communication bytes. */
static uint32_t usbd_cdc_buffer[CDCD_ECHO_BUF_SIZ / 4];
-
+#endif
/** Ctrl endpoint buffer */
static uint8_t ctrl_buffer[64];
-
+#ifdef WITH_DEBUG_CDC
/**
* \brief Callback invoked when bulk OUT data received
*/
@@ -56,7 +56,7 @@
/* No error. */
return false;
}
-
+#endif
extern const struct usbd_descriptors usb_descs[];

/* transmit given string descriptor */

To view, visit change 39445. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-ccid-firmware
Gerrit-Branch: master
Gerrit-Change-Id: I0939930a42f3009abf7e670561a123963bbd3845
Gerrit-Change-Number: 39445
Gerrit-PatchSet: 1
Gerrit-Owner: Hoernchen <ewild@sysmocom.de>