diff --git a/.github/workflows/build_arm.yml b/.github/workflows/build_arm.yml
index 6e4702735..27cb9f1f7 100644
--- a/.github/workflows/build_arm.yml
+++ b/.github/workflows/build_arm.yml
@@ -65,7 +65,7 @@ jobs:
         - 'xmc4000'
     steps:
     - name: Setup Python
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v3
 
     - name: Checkout TinyUSB
       uses: actions/checkout@v3
@@ -79,32 +79,17 @@ jobs:
          repository: hathach/linkermap
          path: linkermap
 
-    - name: Checkout pico-sdk
+    - name: Checkout pico-sdk for rp2040
       if: matrix.family == 'rp2040'
       run: |
         git clone --depth 1 -b develop https://github.com/raspberrypi/pico-sdk ~/pico-sdk
         echo >> $GITHUB_ENV PICO_SDK_PATH=~/pico-sdk
         git submodule update --init hw/mcu/raspberry_pi/Pico-PIO-USB
 
-    - name: Set Toolchain URL
-      run: echo >> $GITHUB_ENV TOOLCHAIN_URL=https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v10.2.1-1.1/xpack-arm-none-eabi-gcc-10.2.1-1.1-linux-x64.tar.gz
-
-    - name: Cache Toolchain
-      uses: actions/cache@v2
-      id: cache-toolchain
+    - name: Install ARM GCC
+      uses: carlosperate/arm-none-eabi-gcc-action@v1
       with:
-        path: ~/cache/
-        key: ${{ runner.os }}-21-03-04-${{ env.TOOLCHAIN_URL }}
-
-    - name: Install Toolchain
-      if: steps.cache-toolchain.outputs.cache-hit != 'true'
-      run: |
-        mkdir -p ~/cache/toolchain
-        wget --progress=dot:mega $TOOLCHAIN_URL -O toolchain.tar.gz
-        tar -C ~/cache/toolchain -xaf toolchain.tar.gz
-
-    - name: Set Toolchain Path
-      run: echo >> $GITHUB_PATH `echo ~/cache/toolchain/*/bin`
+        release: '11.2-2022.02'
 
     - name: Build
       run: python3 tools/build_family.py ${{ matrix.family }}
@@ -135,7 +120,7 @@ jobs:
 
     steps:
     - name: Setup Python
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v3
 
     - name: Checkout TinyUSB
       uses: actions/checkout@v3
@@ -143,25 +128,10 @@ jobs:
     - name: Checkout common submodules in lib
       run: git submodule update --init lib/FreeRTOS-Kernel lib/lwip
 
-    - name: Set Toolchain URL
-      run: echo >> $GITHUB_ENV TOOLCHAIN_URL=https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v10.2.1-1.1/xpack-arm-none-eabi-gcc-10.2.1-1.1-linux-x64.tar.gz
-
-    - name: Cache Toolchain
-      uses: actions/cache@v2
-      id: cache-toolchain
+    - name: Install ARM GCC
+      uses: carlosperate/arm-none-eabi-gcc-action@v1
       with:
-        path: ~/cache/
-        key: ${{ runner.os }}-21-03-04-${{ env.TOOLCHAIN_URL }}
-
-    - name: Install Toolchain
-      if: steps.cache-toolchain.outputs.cache-hit != 'true'
-      run: |
-        mkdir -p ~/cache/toolchain
-        wget --progress=dot:mega $TOOLCHAIN_URL -O toolchain.tar.gz
-        tar -C ~/cache/toolchain -xaf toolchain.tar.gz
-
-    - name: Set Toolchain Path
-      run: echo >> $GITHUB_PATH `echo ~/cache/toolchain/*/bin`
+        release: '11.2-2022.02'
 
     - name: Build
       run: python3 tools/build_board.py ${{ matrix.example }}
diff --git a/examples/device/cdc_msc_freertos/.skip.MCU_F1C100S b/examples/device/cdc_msc_freertos/.skip.MCU_F1C100S
deleted file mode 100644
index e69de29bb..000000000
diff --git a/examples/device/cdc_msc_freertos/skip.txt b/examples/device/cdc_msc_freertos/skip.txt
index 7137b78af..1ee51a9d4 100644
--- a/examples/device/cdc_msc_freertos/skip.txt
+++ b/examples/device/cdc_msc_freertos/skip.txt
@@ -1,10 +1,11 @@
 mcu:CXD56
-mcu:MSP430x5xx
-mcu:SAMD11
-mcu:VALENTYUSB_EPTRI
-mcu:MKL25ZXX
-mcu:RP2040
-mcu:SAMX7X
+mcu:F1C100S
 mcu:GD32VF103
-family:broadcom_64bit
-family:broadcom_32bit
\ No newline at end of file
+mcu:MKL25ZXX
+mcu:MSP430x5xx
+mcu:RP2040
+mcu:SAMD11
+mcu:SAMX7X
+mcu:VALENTYUSB_EPTRI
+family:broadcom_32bit
+family:broadcom_64bit
\ No newline at end of file
diff --git a/examples/device/hid_composite_freertos/.skip.MCU_F1C100S b/examples/device/hid_composite_freertos/.skip.MCU_F1C100S
deleted file mode 100644
index e69de29bb..000000000
diff --git a/examples/device/hid_composite_freertos/skip.txt b/examples/device/hid_composite_freertos/skip.txt
index e64187fd4..1ee51a9d4 100644
--- a/examples/device/hid_composite_freertos/skip.txt
+++ b/examples/device/hid_composite_freertos/skip.txt
@@ -1,9 +1,11 @@
 mcu:CXD56
-mcu:MSP430x5xx
-mcu:SAMD11
-mcu:VALENTYUSB_EPTRI
-mcu:RP2040
-mcu:SAMX7X
+mcu:F1C100S
 mcu:GD32VF103
-family:broadcom_64bit
-family:broadcom_32bit
\ No newline at end of file
+mcu:MKL25ZXX
+mcu:MSP430x5xx
+mcu:RP2040
+mcu:SAMD11
+mcu:SAMX7X
+mcu:VALENTYUSB_EPTRI
+family:broadcom_32bit
+family:broadcom_64bit
\ No newline at end of file
diff --git a/examples/device/video_capture/skip.txt b/examples/device/video_capture/skip.txt
index 892a8c6a7..5898664a2 100644
--- a/examples/device/video_capture/skip.txt
+++ b/examples/device/video_capture/skip.txt
@@ -1,2 +1,3 @@
 mcu:MSP430x5xx
-mcu:SAMD11
\ No newline at end of file
+mcu:NUC121
+mcu:SAMD11
diff --git a/hw/bsp/d5035_01/same51j19a_flash.ld b/hw/bsp/d5035_01/same51j19a_flash.ld
index 328d1c72f..a8dd44336 100644
--- a/hw/bsp/d5035_01/same51j19a_flash.ld
+++ b/hw/bsp/d5035_01/same51j19a_flash.ld
@@ -160,4 +160,5 @@ SECTIONS
 
     . = ALIGN(4);
     _end = . ;
+    end = .;
 }
diff --git a/hw/bsp/ea4088qs/ea4088qs.c b/hw/bsp/ea4088qs/ea4088qs.c
index fa905b2f9..7150ed393 100644
--- a/hw/bsp/ea4088qs/ea4088qs.c
+++ b/hw/bsp/ea4088qs/ea4088qs.c
@@ -33,11 +33,11 @@
 void USB_IRQHandler(void)
 {
   #if CFG_TUD_ENABLED
-    tuh_int_handler(0);
+    tud_int_handler(0);
   #endif
 
   #if CFG_TUH_ENABLED
-    tud_int_handler(0);
+    tuh_int_handler(0);
   #endif
 }
 
diff --git a/hw/bsp/frdm_k32l2b/board.mk b/hw/bsp/frdm_k32l2b/board.mk
index 56df553da..a737eb360 100644
--- a/hw/bsp/frdm_k32l2b/board.mk
+++ b/hw/bsp/frdm_k32l2b/board.mk
@@ -9,7 +9,7 @@ CFLAGS += \
   -DCFG_TUSB_MCU=OPT_MCU_K32L2BXX
 
 # mcu driver cause following warnings
-CFLAGS += -Wno-error=unused-parameter
+CFLAGS += -Wno-error=unused-parameter -Wno-error=redundant-decls
 
 MCU_DIR = $(SDK_DIR)/devices/K32L2B31A
 
diff --git a/hw/bsp/frdm_kl25z/board.mk b/hw/bsp/frdm_kl25z/board.mk
index 3585b8b03..6a72d516b 100644
--- a/hw/bsp/frdm_kl25z/board.mk
+++ b/hw/bsp/frdm_kl25z/board.mk
@@ -14,7 +14,7 @@ LDFLAGS += \
   -Wl,--defsym,__heap_size__=0
 
 # mcu driver cause following warnings
-CFLAGS += -Wno-error=unused-parameter -Wno-error=format
+CFLAGS += -Wno-error=unused-parameter -Wno-error=format -Wno-error=redundant-decls
 
 MCU_DIR = $(SDK_DIR)/devices/MKL25Z4
 
diff --git a/hw/bsp/kuiic/kuiic.c b/hw/bsp/kuiic/kuiic.c
index 737ef3f5c..7aaa9e03c 100644
--- a/hw/bsp/kuiic/kuiic.c
+++ b/hw/bsp/kuiic/kuiic.c
@@ -45,7 +45,7 @@
  * Variables
  ******************************************************************************/
 /* System clock frequency. */
-extern uint32_t SystemCoreClock;
+// extern uint32_t SystemCoreClock;
 
 /*******************************************************************************
  * Variables for BOARD_BootClockRUN configuration
diff --git a/hw/bsp/lpcxpresso11u37/board.mk b/hw/bsp/lpcxpresso11u37/board.mk
index b736eebe1..be6d2ed52 100644
--- a/hw/bsp/lpcxpresso11u37/board.mk
+++ b/hw/bsp/lpcxpresso11u37/board.mk
@@ -15,7 +15,7 @@ CFLAGS += \
   -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' 
 
 # mcu driver cause following warnings
-CFLAGS += -Wno-error=strict-prototypes -Wno-error=unused-parameter
+CFLAGS += -Wno-error=strict-prototypes -Wno-error=unused-parameter -Wno-error=redundant-decls
 
 MCU_DIR = hw/mcu/nxp/lpcopen/lpc11uxx/lpc_chip_11uxx
 
diff --git a/hw/bsp/lpcxpresso1347/board.mk b/hw/bsp/lpcxpresso1347/board.mk
index 62135c274..bf9c97c82 100644
--- a/hw/bsp/lpcxpresso1347/board.mk
+++ b/hw/bsp/lpcxpresso1347/board.mk
@@ -15,7 +15,7 @@ CFLAGS += \
   -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' 
 
 # startup.c and lpc_types.h cause following errors
-CFLAGS += -Wno-error=strict-prototypes
+CFLAGS += -Wno-error=strict-prototypes -Wno-error=redundant-decls
 
 MCU_DIR = hw/mcu/nxp/lpcopen/lpc13xx/lpc_chip_13xx
 
diff --git a/hw/bsp/nutiny_nuc121s/board.mk b/hw/bsp/nutiny_nuc121s/board.mk
index ff1d5aa3a..ad2ee1ea0 100644
--- a/hw/bsp/nutiny_nuc121s/board.mk
+++ b/hw/bsp/nutiny_nuc121s/board.mk
@@ -10,6 +10,9 @@ CFLAGS += \
   -DCFG_EXAMPLE_MSC_READONLY \
   -DCFG_TUSB_MCU=OPT_MCU_NUC121
 
+# mcu driver cause following warnings
+CFLAGS += -Wno-error=redundant-decls
+
 # All source paths should be relative to the top level.
 LD_FILE = hw/bsp/$(BOARD)/nuc121_flash.ld
 
diff --git a/hw/bsp/nutiny_nuc125s/board.mk b/hw/bsp/nutiny_nuc125s/board.mk
index bb56e42ab..000c8cd95 100644
--- a/hw/bsp/nutiny_nuc125s/board.mk
+++ b/hw/bsp/nutiny_nuc125s/board.mk
@@ -10,6 +10,9 @@ CFLAGS += \
   -DCFG_EXAMPLE_MSC_READONLY \
   -DCFG_TUSB_MCU=OPT_MCU_NUC121
 
+# mcu driver cause following warnings
+CFLAGS += -Wno-error=redundant-decls
+
 # All source paths should be relative to the top level.
 LD_FILE = hw/bsp/$(BOARD)/nuc125_flash.ld
 
diff --git a/hw/bsp/nutiny_nuc126v/board.mk b/hw/bsp/nutiny_nuc126v/board.mk
index 4f0ebf201..0dcd897cb 100644
--- a/hw/bsp/nutiny_nuc126v/board.mk
+++ b/hw/bsp/nutiny_nuc126v/board.mk
@@ -11,6 +11,9 @@ CFLAGS += \
   -D__CORTEX_SC=0 \
   -DCFG_TUSB_MCU=OPT_MCU_NUC126
 
+# mcu driver cause following warnings
+CFLAGS += -Wno-error=redundant-decls
+
 # All source paths should be relative to the top level.
 LD_FILE = hw/bsp/$(BOARD)/nuc126_flash.ld
 
diff --git a/hw/bsp/nutiny_sdk_nuc505/board.mk b/hw/bsp/nutiny_sdk_nuc505/board.mk
index e8514347e..f27577e36 100644
--- a/hw/bsp/nutiny_sdk_nuc505/board.mk
+++ b/hw/bsp/nutiny_sdk_nuc505/board.mk
@@ -9,6 +9,9 @@ CFLAGS += \
   -mfpu=fpv4-sp-d16 \
   -DCFG_TUSB_MCU=OPT_MCU_NUC505
 
+# mcu driver cause following warnings
+CFLAGS += -Wno-error=redundant-decls
+
 # All source paths should be relative to the top level.
 LD_FILE = hw/bsp/$(BOARD)/nuc505_flashtoram.ld
 
diff --git a/hw/bsp/rp2040/boards/adafruit_feather_rp2040/board.cmake b/hw/bsp/rp2040/boards/adafruit_feather_rp2040/board.cmake
deleted file mode 100644
index e527a8ce3..000000000
--- a/hw/bsp/rp2040/boards/adafruit_feather_rp2040/board.cmake
+++ /dev/null
@@ -1 +0,0 @@
-set(PICO_BOARD adafruit_feather_rp2040)
\ No newline at end of file
diff --git a/hw/bsp/rp2040/boards/adafruit_itsybitsy_rp2040/board.cmake b/hw/bsp/rp2040/boards/adafruit_itsybitsy_rp2040/board.cmake
deleted file mode 100644
index 3fd2dd06b..000000000
--- a/hw/bsp/rp2040/boards/adafruit_itsybitsy_rp2040/board.cmake
+++ /dev/null
@@ -1 +0,0 @@
-set(PICO_BOARD adafruit_itsybitsy_rp2040)
\ No newline at end of file
diff --git a/hw/bsp/rp2040/boards/adafruit_qtpy_rp2040/board.cmake b/hw/bsp/rp2040/boards/adafruit_qtpy_rp2040/board.cmake
deleted file mode 100644
index 469929c51..000000000
--- a/hw/bsp/rp2040/boards/adafruit_qtpy_rp2040/board.cmake
+++ /dev/null
@@ -1 +0,0 @@
-set(PICO_BOARD adafruit_qtpy_rp2040)
\ No newline at end of file
diff --git a/hw/bsp/same70_qmtech/board.mk b/hw/bsp/same70_qmtech/board.mk
index ba7088e44..2aa09f5dd 100644
--- a/hw/bsp/same70_qmtech/board.mk
+++ b/hw/bsp/same70_qmtech/board.mk
@@ -11,7 +11,7 @@ CFLAGS += \
   -DCFG_TUSB_MCU=OPT_MCU_SAMX7X
 
 # suppress following warnings from mcu driver
-CFLAGS += -Wno-error=unused-parameter -Wno-error=cast-align -Wno-error=cast-qual
+CFLAGS += -Wno-error=unused-parameter -Wno-error=cast-align -Wno-error=cast-qual -Wno-error=redundant-decls
 
 ASF_DIR = hw/mcu/microchip/same70
 
diff --git a/hw/bsp/same70_xplained/board.mk b/hw/bsp/same70_xplained/board.mk
index cb2decf50..cbc51e6b0 100644
--- a/hw/bsp/same70_xplained/board.mk
+++ b/hw/bsp/same70_xplained/board.mk
@@ -11,7 +11,7 @@ CFLAGS += \
   -DCFG_TUSB_MCU=OPT_MCU_SAMX7X
 
 # suppress following warnings from mcu driver
-CFLAGS += -Wno-error=unused-parameter -Wno-error=cast-align -Wno-error=cast-qual
+CFLAGS += -Wno-error=unused-parameter -Wno-error=cast-align -Wno-error=cast-qual -Wno-error=redundant-decls
 
 ASF_DIR = hw/mcu/microchip/same70
 
diff --git a/hw/bsp/samg55xplained/board.mk b/hw/bsp/samg55xplained/board.mk
index deff6944c..d0d0ade01 100644
--- a/hw/bsp/samg55xplained/board.mk
+++ b/hw/bsp/samg55xplained/board.mk
@@ -12,7 +12,7 @@ CFLAGS += \
   -DCFG_TUSB_MCU=OPT_MCU_SAMG
 
 # suppress following warnings from mcu driver
-CFLAGS += -Wno-error=undef -Wno-error=cast-qual -Wno-error=null-dereference
+CFLAGS += -Wno-error=undef -Wno-error=cast-qual -Wno-error=null-dereference -Wno-error=redundant-decls
 
 ASF_DIR = hw/mcu/microchip/samg55
 
diff --git a/hw/bsp/spresense/board.mk b/hw/bsp/spresense/board.mk
index ba291e817..78d7f6a66 100644
--- a/hw/bsp/spresense/board.mk
+++ b/hw/bsp/spresense/board.mk
@@ -34,8 +34,9 @@ CFLAGS += \
 	-Wno-error=unused-parameter \
 	-DCFG_TUSB_MCU=OPT_MCU_CXD56 \
 
+# suppress following warnings from mcu driver
 # lwip/src/core/raw.c:334:43: error: declaration of 'recv' shadows a global declaration
-CFLAGS += -Wno-error=shadow
+CFLAGS += -Wno-error=shadow  -Wno-error=redundant-decls
 
 SPRESENSE_SDK = $(TOP)/hw/mcu/sony/cxd56/spresense-exported-sdk
 
diff --git a/hw/bsp/stm32l0538disco/board.mk b/hw/bsp/stm32l0538disco/board.mk
index e19101d64..69f09075a 100644
--- a/hw/bsp/stm32l0538disco/board.mk
+++ b/hw/bsp/stm32l0538disco/board.mk
@@ -17,7 +17,7 @@ CFLAGS += \
   -DCFG_TUSB_MCU=OPT_MCU_STM32L0
 
 # mcu driver cause following warnings
-CFLAGS += -Wno-error=unused-parameter -Wno-error=maybe-uninitialized
+CFLAGS += -Wno-error=unused-parameter -Wno-error=maybe-uninitialized -Wno-error=redundant-decls
 
 # All source paths should be relative to the top level.
 LD_FILE = hw/bsp/$(BOARD)/STM32L053C8Tx_FLASH.ld
diff --git a/hw/bsp/xmc4000/boards/xmc4500_relax/board.mk b/hw/bsp/xmc4000/boards/xmc4500_relax/board.mk
index a2c2c5aaf..371adff91 100644
--- a/hw/bsp/xmc4000/boards/xmc4500_relax/board.mk
+++ b/hw/bsp/xmc4000/boards/xmc4500_relax/board.mk
@@ -2,6 +2,9 @@ MCU_VARIANT = XMC4500
 CFLAGS += \
   -DXMC4500_F100x1024 \
 
+# mcu driver cause following warnings
+CFLAGS += -Wno-error=stringop-overread
+
 LD_FILE = $(MCU_DIR)/CMSIS/Infineon/COMPONENT_$(MCU_VARIANT)/Source/TOOLCHAIN_GCC_ARM/XMC4500x1024.ld
 
 JLINK_DEVICE = XMC4500-1024
diff --git a/hw/mcu/microchip b/hw/mcu/microchip
index 58eb37632..9e8b37e30 160000
--- a/hw/mcu/microchip
+++ b/hw/mcu/microchip
@@ -1 +1 @@
-Subproject commit 58eb3763200ff51a998be5f537acf67299add227
+Subproject commit 9e8b37e307d8404033bb881623a113931e1edf27
diff --git a/src/portable/synopsys/dwc2/dwc2_stm32.h b/src/portable/synopsys/dwc2/dwc2_stm32.h
index 1d849541e..1187e0d6e 100644
--- a/src/portable/synopsys/dwc2/dwc2_stm32.h
+++ b/src/portable/synopsys/dwc2/dwc2_stm32.h
@@ -43,6 +43,9 @@
   #define EP_MAX_FS       USB_OTG_FS_MAX_IN_ENDPOINTS
   #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE
 
+  #define EP_MAX_HS       USB_OTG_HS_MAX_IN_ENDPOINTS
+  #define EP_FIFO_SIZE_HS USB_OTG_HS_TOTAL_FIFO_SIZE
+
 #elif CFG_TUSB_MCU == OPT_MCU_STM32F4
   #include "stm32f4xx.h"
   #define EP_MAX_FS       USB_OTG_FS_MAX_IN_ENDPOINTS
diff --git a/tools/build_family.py b/tools/build_family.py
index 095ca4ff7..680411eab 100644
--- a/tools/build_family.py
+++ b/tools/build_family.py
@@ -48,7 +48,7 @@ all_families.sort()
 def build_family(example, family):
     all_boards = []
     for entry in os.scandir("hw/bsp/{}/boards".format(family)):
-        if entry.is_dir():
+        if entry.is_dir() and entry.name != 'pico_sdk':
             all_boards.append(entry.name)
     filter_with_input(all_boards)
     all_boards.sort()
diff --git a/tools/build_utils.py b/tools/build_utils.py
index 299fffa4d..d570d20e3 100644
--- a/tools/build_utils.py
+++ b/tools/build_utils.py
@@ -3,27 +3,34 @@ import pathlib
 def skip_example(example, board):
     ex_dir = pathlib.Path('examples/') / example
     bsp = pathlib.Path("hw/bsp")
-
-    board_dir = list(bsp.glob("*/boards/" + board))
-    if not board_dir:
-        # Skip unknown boards
-        return True
-
-    board_dir = list(board_dir)[0]
     
-    family_dir = board_dir.parent.parent
-    family = family_dir.name
+    if (bsp / board / "board.mk").exists():
+        # board without family
+        board_dir = bsp / board
+        family = ""
+        mk_contents = ""
+    else:
+        # board within family
+        board_dir = list(bsp.glob("*/boards/" + board))
+        if not board_dir:
+            # Skip unknown boards
+            return True
+    
+        board_dir = list(board_dir)[0]
+    
+        family_dir = board_dir.parent.parent
+        family = family_dir.name
+    
+        # family CMake
+        family_mk = family_dir / "family.cmake"
+    
+        # family.mk
+        if not family_mk.exists():
+            family_mk = family_dir / "family.mk"
+    
+        mk_contents = family_mk.read_text()
 
-    # family CMake
-    family_mk = family_dir / "family.cmake"
-
-    # family.mk
-    if not family_mk.exists():
-        family_mk = family_dir / "family.mk"
-
-    mk_contents = family_mk.read_text()
-
-    # Find the mcu
+    # Find the mcu, first in family mk then board mk
     if "CFG_TUSB_MCU=OPT_MCU_" not in mk_contents:
         board_mk = board_dir / "board.cmake"
         if not board_mk.exists():