diff --git a/.github/actions/pio-build/entrypoint.sh b/.github/actions/pio-build/entrypoint.sh
index b51c1ba630..4406d23853 100755
--- a/.github/actions/pio-build/entrypoint.sh
+++ b/.github/actions/pio-build/entrypoint.sh
@@ -8,7 +8,7 @@ platformio platform install "https://github.com/platformio/platform-ststm32.git"
   exit 1
 }
 # Prepare framework for CI
-python3 -c "import json; import os; fp=open(os.path.expanduser('~/.platformio/platforms/ststm32/platform.json'), 'r+'); data=json.load(fp); data['packages']['framework-arduinoststm32']['version'] = '*'; fp.seek(0); fp.truncate(); json.dump(data, fp); fp.close()" || {
+python3 -c "import json; import os; fp=open(os.path.expanduser('~/.platformio/platforms/ststm32/platform.json'), 'r+'); data=json.load(fp); data['packages']['framework-arduinoststm32']['version'] = '*'; del data['packages']['framework-arduinoststm32']['owner']; fp.seek(0); fp.truncate(); json.dump(data, fp); fp.close()" || {
   exit 1
 }
 ln --symbolic "$GITHUB_WORKSPACE" "$HOME/.platformio/packages/framework-arduinoststm32" || {
diff --git a/tools/platformio-build.py b/tools/platformio-build.py
index 68b0dfc01c..c9102f2290 100644
--- a/tools/platformio-build.py
+++ b/tools/platformio-build.py
@@ -32,7 +32,7 @@
 board = env.BoardConfig()
 
 FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32")
-CMSIS_DIR = join(platform.get_package_dir("framework-arduinoststm32"), "CMSIS", "CMSIS")
+CMSIS_DIR = join(platform.get_package_dir("framework-cmsis"), "CMSIS")
 assert isdir(FRAMEWORK_DIR)
 assert isdir(CMSIS_DIR)
 
@@ -86,6 +86,22 @@ def process_usb_configuration(cpp_defines):
     elif "PIO_FRAMEWORK_ARDUINO_ENABLE_HID" in cpp_defines:
         env.Append(CPPDEFINES=["USBD_USE_HID_COMPOSITE"])
 
+    if any(
+        d in cpp_defines
+        for d in (
+            "PIO_FRAMEWORK_ARDUINO_ENABLE_CDC",
+            "PIO_FRAMEWORK_ARDUINO_ENABLE_CDC_WITHOUT_SERIAL",
+            "PIO_FRAMEWORK_ARDUINO_ENABLE_HID",
+        )
+    ):
+        env.Append(
+            CPPDEFINES=[
+                "USBCON",
+                ("USB_VID", board.get("build.hwids", [[0, 0]])[0][0]),
+                ("USB_PID", board.get("build.hwids", [[0, 0]])[0][1]),
+            ]
+        )
+
     if any(f in env["CPPDEFINES"] for f in ("USBD_USE_CDC", "USBD_USE_HID_COMPOSITE")):
         env.Append(CPPDEFINES=["HAL_PCD_MODULE_ENABLED"])
 
@@ -168,6 +184,7 @@ def configure_application_offset(mcu, upload_protocol):
         join(FRAMEWORK_DIR, "cores", "arduino", "stm32"),
         join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "LL"),
         join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb"),
+        join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "OpenAMP"),
         join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb", "hid"),
         join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb", "cdc"),
         join(FRAMEWORK_DIR, "system", "Drivers", series + "_HAL_Driver", "Inc"),
@@ -191,6 +208,37 @@ def configure_application_offset(mcu, upload_protocol):
             "Core",
             "Src",
         ),
+        join(
+            FRAMEWORK_DIR,
+            "system",
+            "Middlewares",
+            "OpenAMP"
+        ),
+        join(
+            FRAMEWORK_DIR,
+            "system",
+            "Middlewares",
+            "OpenAMP",
+            "open-amp",
+            "lib",
+            "include",
+        ),
+        join(
+            FRAMEWORK_DIR,
+            "system",
+            "Middlewares",
+            "OpenAMP",
+            "libmetal",
+            "lib",
+            "include",
+        ),
+        join(
+            FRAMEWORK_DIR,
+            "system",
+            "Middlewares",
+            "OpenAMP",
+            "virtual_driver"
+        ),
         join(CMSIS_DIR, "Core", "Include"),
         join(
             FRAMEWORK_DIR,
@@ -202,7 +250,6 @@ def configure_application_offset(mcu, upload_protocol):
             series,
             "Include",
         ),
-        join(CMSIS_DIR, "DSP", "Include"),
         join(
             FRAMEWORK_DIR,
             "system",
@@ -215,6 +262,7 @@ def configure_application_offset(mcu, upload_protocol):
             "Templates",
             "gcc",
         ),
+        join(CMSIS_DIR, "DSP", "Include"),
         join(FRAMEWORK_DIR, "cores", "arduino"),
         variant_dir,
     ],
@@ -250,9 +298,10 @@ def configure_application_offset(mcu, upload_protocol):
 #
 
 if not board.get("build.ldscript", ""):
+    env.Replace(LDSCRIPT_PATH=join(FRAMEWORK_DIR, "system", "ldscript.ld"))
     if not isfile(join(env.subst(variant_dir), "ldscript.ld")):
         print("Warning! Cannot find linker script for the current target!\n")
-    env.Replace(LDSCRIPT_PATH=join(variant_dir, "ldscript.ld"))
+    env.Append(LINKFLAGS=[("-Wl,--default-script", join(variant_dir, "ldscript.ld"))])
 
 #
 # Process configuration flags