From 82c7b1b1d5c8ce0467bd580a86d20c645cec17df Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Sat, 12 Apr 2014 18:50:20 +0100
Subject: [PATCH] stmhal: Put a USB structure in ROM; GC doesn't scan the data
 segment.

---
 stmhal/gccollect.c         | 7 +++----
 stmhal/usb.c               | 2 +-
 stmhal/usbd_desc.h         | 3 +--
 stmhal/usbd_desc_cdc_msc.c | 2 +-
 4 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/stmhal/gccollect.c b/stmhal/gccollect.c
index e20e92de1..d40460d70 100644
--- a/stmhal/gccollect.c
+++ b/stmhal/gccollect.c
@@ -21,10 +21,9 @@ void gc_collect(void) {
     // start the GC
     gc_collect_start();
 
-    // scan everything in RAM before the heap
-    // this includes the data and bss segments
-    // TODO possibly don't need to scan data, since all pointers should start out NULL and be in bss
-    gc_collect_root((void**)&_ram_start, ((uint32_t)&_ebss - (uint32_t)&_ram_start) / sizeof(uint32_t));
+    // We need to scan everything in RAM that can hold a pointer.
+    // The data segment is used, but should not contain pointers, so we just scan the bss.
+    gc_collect_root((void**)&_sbss, ((uint32_t)&_ebss - (uint32_t)&_sbss) / sizeof(uint32_t));
 
     // get the registers and the sp
     machine_uint_t regs[10];
diff --git a/stmhal/usb.c b/stmhal/usb.c
index 97ea2e1b4..1c80b4bd7 100644
--- a/stmhal/usb.c
+++ b/stmhal/usb.c
@@ -28,7 +28,7 @@ void pyb_usb_dev_init(usb_device_mode_t mode, usb_storage_medium_t medium) {
         } else {
             USBD_SelectMode(USBD_MODE_CDC_HID);
         }
-        USBD_Init(&hUSBDDevice, &VCP_Desc, 0);
+        USBD_Init(&hUSBDDevice, (USBD_DescriptorsTypeDef*)&VCP_Desc, 0);
         USBD_RegisterClass(&hUSBDDevice, &USBD_CDC_MSC_HID);
         USBD_CDC_RegisterInterface(&hUSBDDevice, (USBD_CDC_ItfTypeDef*)&USBD_CDC_fops);
 #if MICROPY_HW_HAS_SDCARD
diff --git a/stmhal/usbd_desc.h b/stmhal/usbd_desc.h
index a54e427e3..348bbd45a 100644
--- a/stmhal/usbd_desc.h
+++ b/stmhal/usbd_desc.h
@@ -1,2 +1 @@
-extern USBD_DescriptorsTypeDef VCP_Desc;
-extern USBD_DescriptorsTypeDef MSC_Desc;
+extern const USBD_DescriptorsTypeDef VCP_Desc;
diff --git a/stmhal/usbd_desc_cdc_msc.c b/stmhal/usbd_desc_cdc_msc.c
index edcb4b343..137e0bed9 100644
--- a/stmhal/usbd_desc_cdc_msc.c
+++ b/stmhal/usbd_desc_cdc_msc.c
@@ -59,7 +59,7 @@ uint8_t *USBD_VCP_USRStringDesc (USBD_SpeedTypeDef speed, uint8_t idx, uint16_t
 #endif /* USB_SUPPORT_USER_STRING_DESC */  
 
 /* Private variables ---------------------------------------------------------*/
-USBD_DescriptorsTypeDef VCP_Desc = {
+const USBD_DescriptorsTypeDef VCP_Desc = {
   USBD_VCP_DeviceDescriptor,
   USBD_VCP_LangIDStrDescriptor, 
   USBD_VCP_ManufacturerStrDescriptor,
-- 
GitLab