laforge has submitted this change. (
https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/39445?usp=email )
Change subject: fix usb usb reset handling by delayed soft reset
......................................................................
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, 34 insertions(+), 22 deletions(-)
Approvals:
laforge: Looks good to me, approved
Jenkins Builder: Verified
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..4121053 100644
--- a/sysmoOCTSIM/hpl/core/hpl_init.c
+++ b/sysmoOCTSIM/hpl/core/hpl_init.c
@@ -53,14 +53,15 @@
void _init_chip(void)
{
hri_nvmctrl_set_CTRLA_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE);
-
+#if 0
_osc32kctrl_init_sources();
_oscctrl_init_sources();
_mclk_init();
-#if _GCLK_INIT_1ST
+ #if _GCLK_INIT_1ST
_gclk_init_generators_by_fref(_GCLK_INIT_1ST);
-#endif
+ #endif
_oscctrl_init_referenced_generators();
+#endif
_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..c7e2d33 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
@@ -980,14 +981,9 @@
_usb_d_dev_reset_epts();
- if(address_was_set == true) {
- _usb_d_dev_detach();
+ if (address_was_set == true) {
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 d1524c5..afb70e9 100644
--- a/sysmoOCTSIM/main.c
+++ b/sysmoOCTSIM/main.c
@@ -65,8 +65,6 @@
/* increase drive strength of 20Mhz SIM clock output to 8mA
* (there are 8 inputs + traces to drive!) */
hri_port_set_PINCFG_DRVSTR_bit(PORT, 0, 11);
-
- ccid_app_init();
}
/***********************************************************************
@@ -467,6 +465,17 @@
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
https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/39445?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: osmo-ccid-firmware
Gerrit-Branch: master
Gerrit-Change-Id: I0939930a42f3009abf7e670561a123963bbd3845
Gerrit-Change-Number: 39445
Gerrit-PatchSet: 7
Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>