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 <ew...@sysmocom.de>

Reply via email to