Hoernchen has uploaded this change for review. (
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, 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
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: newchange
Gerrit-Project: osmo-ccid-firmware
Gerrit-Branch: master
Gerrit-Change-Id: I0939930a42f3009abf7e670561a123963bbd3845
Gerrit-Change-Number: 39445
Gerrit-PatchSet: 1
Gerrit-Owner: Hoernchen <ewild(a)sysmocom.de>