changeset 3139:76d47f11c8a3

Add STM32 F2 / F4 processor support, contributed by eCosCentric.
author jlarmour
date Sun, 01 Apr 2012 01:59:38 +0000
parents 9dd3ea41e5b6
children 53660cdf5b22
files packages/hal/cortexm/stm32/var/current/ChangeLog packages/hal/cortexm/stm32/var/current/cdl/hal_cortexm_stm32.cdl packages/hal/cortexm/stm32/var/current/include/var_dma.h packages/hal/cortexm/stm32/var/current/include/var_intr.h packages/hal/cortexm/stm32/var/current/include/var_io.h packages/hal/cortexm/stm32/var/current/include/var_io_eth.h packages/hal/cortexm/stm32/var/current/include/var_io_pins.h packages/hal/cortexm/stm32/var/current/include/var_io_usart.h packages/hal/cortexm/stm32/var/current/src/hal_diag.c packages/hal/cortexm/stm32/var/current/src/stm32_dma.c packages/hal/cortexm/stm32/var/current/src/stm32_misc.c packages/hal/cortexm/stm32/var/current/tests/timers.c
diffstat 12 files changed, 3637 insertions(+), 446 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/cortexm/stm32/var/current/ChangeLog
+++ b/packages/hal/cortexm/stm32/var/current/ChangeLog
@@ -1,3 +1,194 @@
+2012-03-27  James Smith  <jsmith@ecoscentric.com>
+
+	* tests/timers.c (TIMER_PRI): Add macro and manifests to allow
+	easy manipulation of the base and delta between the timer
+	priorities being tested.
+
+2012-03-23  James Smith  <jsmith@ecoscentric.com>
+
+	* include/var_io_usart.h: Provide common/shared UART pin
+	definitions for F1, F2 and F4 devices using the new PIN wrapper
+	macros. The RTS pin definitions for all STM32F families now use
+	GPIO output since the driver uses software controlled
+	RTS. Previously the F2/F4 defined the RTS pins as ALTFN.
+
+	* include/var_io.h: Provide common/shared ADC pin definitions for
+	F1, F2 and F4 devices using the new PIN_ANALOG() wrapper macro.
+
+	* include/var_io_eth.h: Provide common MII pin definitions using
+	the new PIN wrapper macros. Also remove MII_REMAP which was
+	incorrectly using the wrong manifests (STM3210C-EVAL networking
+	would not work) since decision taken that "plf_io.h" should
+	contain board specific I/O pin mapping.
+
+	* cdl/hal_cortexm_stm32.cdl: Remove CYGPKG_HAL_STM32_ETH and
+	sub-option CYGHWR_HAL_STM32_ETH_MII_REMAP since ethernet pin
+	mapping now present in platform specific "plf_io.h" header.
+
+2012-03-22  James Smith  <jsmith@ecoscentric.com>
+
+	* include/var_io_pins.h: Provide "common" wrapper macros
+	CYGHWR_HAL_STM32_PIN_OUT, CYGHWR_HAL_STM32_PIN_ALTFN_OUT,
+	CYGHWR_HAL_STM32_PIN_IN, CYGHWR_HAL_STM32_PIN_ALTFN_IN and
+	CYGHWR_HAL_STM32_PIN_ANALOG for defining I/O pins to allow the
+	same (where applicable) source calls to be used regardless of
+	whether the target is F1 or HIPERFORMANCE (F2/F4).
+
+	* cdl/hal_cortexm_stm32.cdl: Remove CYGPKG_HAL_STM32_ETH and
+	sub-option CYGHWR_HAL_STM32_ETH_MII_REMAP since ethernet pin
+	mapping now present in platform specific "plf_io.h" header.
+
+2012-03-21  James Smith  <jsmith@ecoscentric.com>
+
+	* include/var_io_pins.h: Provide similar support for F1 family
+	devices as available for F2/F4 family devices by adding AT_LEAST
+	and AT_MOST macros for specifying OUTPUT pin speed limits, and
+	providing generic LOW, MED and FAST manifests to hide the actual
+	device speed.
+
+	* src/stm32_misc.c (hal_stm32_gpio_set): Use
+	CYGHWR_HAL_STM32_GPIO_CNFMODE_SET macro instead of explicit
+	bitmask manipulation for seeting F1 CRL/CRH.
+
+2012-03-15  James Smith  <jsmith@ecoscentric.com>
+
+	* src/stm32_misc.c:
+	* src/stm32_dma.c:
+	* src/hal_diag.c:
+	* include/var_io_usart.h:
+	* include/var_io_pins.h:
+	* include/var_io_eth.h:
+	* include/var_io.h:
+	* include/var_intr.h:
+	* include/var_dma.h: Use HIPERFORMANCE manifest to add support for
+	F4 devices.
+
+	* cdl/hal_cortexm_stm32.cdl: Many minor changes to support
+	Cortex-M4 and STM32F4 devices.
+
+	* tests/timers.c (timers): Add TIM8_UP_TIM13 to the set of timers
+	tested for those platforms where it is defined.
+
+2012-03-13  James Smith  <jsmith@ecoscentric.com>
+
+	* include/var_io.h (HAL_AARDVARK_CHECK_I2C): Macro for specific
+	STM32 F1 devices that suffer from an I2C/FSMC errata to allow the
+	Aardvark test cases to operate. Added STM32F4 RTC manifests.
+
+2012-02-28  James Smith  <jsmith@ecoscentric.com>
+
+	* src/stm32_dma.c (hal_stm32_dma_disable): Add new function to
+	allow temporary disable of DMA stream for circular mode
+	configurations.
+
+	* include/var_dma.h: Added prototype for newly added
+	hal_stm32_dma_disable() function.
+
+2012-02-28  James Smith  <jsmith@ecoscentric.com>
+
+	* src/stm32_dma.c (hal_stm32_dma_isr): Do not disable the stream
+	when configured for circular mode.
+
+2012-02-24  James Smith  <jsmith@ecoscentric.com>
+
+	* include/var_io.h: Provide manifests covering STM32F2 ADC
+	support.
+
+	* include/var_intr.h: Provide explicit DMA2 CH4 and CH5 manifests
+	for non-connectivity devices (e.g. STM3210E-EVAL target).
+
+	* include/var_dma.h:
+	* src/stm32_dma.c (hal_stm32_dma_configure_circular): Provide
+	function to enable/disable DMA circular mode, and provide
+	prototype in header and documentation.
+
+2012-02-17  James Smith  <jsmith@ecoscentric.com>
+
+	* include/var_io_pins.h: Fix F2 MODE_SET and OSPEED_SET macros to
+	correctly mask register field bits.
+
+2012-01-20  Nick Garnett  <nickg@ecoscentric.com>
+
+	* include/var_intr.h (CYGNUM_HAL_VSR_MAX): Reverse an earlier
+	change to this value.
+
+2012-01-13  Nick Garnett  <nickg@ecoscentric.com>
+
+	* include/var_io.h: Add shifts for RTC TR and DR register fields.
+
+2012-01-12  Nick Garnett  <nickg@ecoscentric.com>
+
+	* include/var_intr.h: Reorganize vectors 43-49 so they are defined
+	correctly for F2 devices.
+
+	* include/var_io.h: Tidy up DMA defines. Move I2C and SPI pin and
+	DMA channel definitions out to platform HALs.
+
+	* include/var_io_pins.h (CYGHWR_HAL_STM32_GPIO_PUPD_SET): Fix
+	buglet in register clear code.
+
+	* cdl/hal_cortexm_stm32.cdl:
+	* include/var_dma.h:
+	* src/stm32_dma.c: Add DMA API.
+
+2011-12-15  Jonathan Larmour  <jifl@eCosCentric.com>
+
+	* cdl/hal_cortexm_stm32.cdl (CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY):
+	Rather than list every F2 part, just say all F2 since we don't yet know
+	of F2 parts that don't have connectivity.
+	(CYGHWR_HAL_STM32_ETH_MII_REMAP): Allow pin remapping to be configurable
+	as a standard setting, alternate mapping, or provided by the platform.
+	* include/var_io.h: Add MCO1_MASK/MCO2_MASK and
+	MCO1PRE_MASK/MCO2PRE_MASK defns. Add CYGHWR_HAL_STM32_FLASH_CR_PSIZE()
+	to make flash parallelism easier to set.
+	* include/var_io_eth.h: Fix MACMIIAR_CR_MASK define.
+	Allow specification (and checking) of MACMIIAR_CR to set MDC clock
+	according to defined MHz ranges - this allows it to vary between
+	processors.
+	Support above CYGHWR_HAL_STM32_ETH_MII_REMAP changes.
+	Add alternate mappings for F2 eth pins (although it's a different
+	subset to F1.
+
+2011-12-12  Jonathan Larmour  <jifl@eCosCentric.com>
+
+	* src/stm32_misc.c (hal_start_clocks): Remove unnecessary fiddling
+	after RCC reset. Avoid overflow from PLL multiplier. Handle PLLQ
+	and RTCPRE on F2.
+
+	* include/var_io.h (CYGHWR_HAL_STM32_RCC_CFGR_RTCPRE): Add set macro
+	separate from mask.
+
+	* cdl/hal_cortexm_stm32.cdl: Improve clock option descriptions. Add
+	CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV.
+
+2011-12-08  Jonathan Larmour  <jifl@eCosCentric.com>
+
+	* cdl/hal_cortexm_stm32.cdl: Add selections for processors in F2
+	family, and allow discrimination between those and F1.
+	* include/var_intr.h: Modify and add to interrupt list for F2.
+	(HAL_VAR_INTERRUPT_{MASK,UNMASK,ACKNOWLEDGE,CONFIGURE ): Update
+	EXTI interrupts that need special mapping for F2.
+	* include/var_io.h: Many additions and changes for F2. To avoid
+	an unmanageable size, split out GPIO/pin config, USART and ETH
+	peripheral definitions into new files.
+	* include/var_io_pins.h: New file for GPIO and pin configuration.
+	* include/var_io_usart.h: New file for USART definitions.
+	* include/var_io_eth.h: New file for Ethernet peripheral definitions.
+	* src/hal_diag.c: Allow for new style pin remapping used by F2
+	while still allowing F1 to work.
+	Support USART6 (which we call UART5).
+	(hal_stm32_serial_init_channel): Only use AFIO on F1.
+	* src/stm32_misc.c (hal_stm32_gpio_{set,out,in}): Support new GPIO
+	pin setting.
+	(hal_stm32_uart_setbaud): Support UART6 (called UART5 in CDL).
+	(hal_enable_profile_timer): Ensure timer peripheral (defaulting to TIM6)
+	has its clock enabled.
+
+2011-10-07  Nick Garnett  <nickg@ecoscentric.com>
+
+	* include/var_io.h: Separate FSMC and ETH register definitions,
+	which seem to have got a little mixed together at some point.
+
 2011-02-03  Alan Bowman  <alan.bowman@datong.co.uk>
 
 	* include/var_io.h: Fix CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_*
@@ -23,16 +214,57 @@ 2009-10-26  Ross Younger  <wry@ecoscentr
 
 	* include/var_io.h: Minor corrections to the FSMC register defs.
 
+2009-10-22  Nick Garnett  <nickg@ecoscentric.com>
+
+	* cdl/hal_cortexm_stm32.cdl:
+	* include/var_io.h: Add remap configuration for SPI busses.
+
 2009-08-10  Simon Kallweit  <simon.kallweit@intefo.ch>
 
 	* include/var_io.h: Added more register definitions for FSMC
 
+2009-07-02  Nick Garnett  <nickg@ecoscentric.com>
+
+	* cdl/hal_cortexm_stm32.cdl: Add remap configuration for UARTS.
+
+	* include/var_io.h (CYGHWR_HAL_STM32_AFIO_CLOCK): Add AFIO clock control.
+	(CYGHWR_HAL_STM32_UART*_REMAP_CONFIG): Add remap support for UARTS.
+
+	* src/hal_diag.c (channel_data_t, hal_stm32_serial_init_channel):
+	Add support for UART remapping.
+
+2009-06-29  Nick Garnett  <nickg@ecoscentric.com>
+
+	* include/var_io.h (CYGHWR_HAL_STM32_ETH): Add support for
+	ethernet device on connectivity line devices.
+	Add device clock control support.
+
+	* include/var_intr.h:
+	* cdl/hal_cortexm_stm32.cdl: Add support for connectivity line
+	devices.
+
+	* src/stm32_misc.c (hal_variant_init): Remove default enable of
+	all device clocks.
+	(hal_stm32_clock_enable, hal_stm32_clock_disable): Add routines to
+	enable individual device clocks.
+
+	* src/hal_diag.c (stm32_ser_channels)
+	(hal_stm32_serial_init_channel): Add clock enable support.
+
 2009-04-17  Simon Kallweit  <simon.kallweit@intefo.ch>
 
 	* src/hal_diag.c (hal_stm32_serial_getc_timeout): Fix for higher
 	baudrates. The original version lost bytes due to the long
 	timeout.
 
+2009-03-23  Nick Garnett  <nickg@ecoscentric.com>
+
+	* src/stm32_misc.c (hal_variant_init): Add write to AHBENR
+	register to enable all AHB based devices.
+
+	* include/var_io.h (CYGHWR_HAL_STM32_IWDG_*): Add defines for
+	independent watchdog.
+
 2009-02-27  Simon Kallweit  <simon.kallweit@intefo.ch>
 
 	* include/var_io.h:
--- a/packages/hal/cortexm/stm32/var/current/cdl/hal_cortexm_stm32.cdl
+++ b/packages/hal/cortexm/stm32/var/current/cdl/hal_cortexm_stm32.cdl
@@ -48,7 +48,7 @@
 ##==========================================================================
 
 cdl_package CYGPKG_HAL_CORTEXM_STM32 {
-    display       "Cortex-M3 STM32 Variant"
+    display       "Cortex-M3/-M4 STM32 Variant"
     parent        CYGPKG_HAL_CORTEXM
     hardware
     include_dir   cyg/hal
@@ -58,7 +58,7 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
         microcontroller family.
         It is also necessary to select a variant and platform HAL package."
 
-    compile       hal_diag.c stm32_misc.c
+    compile       hal_diag.c stm32_misc.c stm32_dma.c
 
     implements    CYGINT_HAL_DEBUG_GDB_STUBS
     implements    CYGINT_HAL_DEBUG_GDB_STUBS_BREAK
@@ -66,15 +66,24 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
     implements    CYGINT_HAL_VIRTUAL_VECTOR_COMM_BAUD_SUPPORT
     implements    CYGINT_PROFILE_HAL_TIMER
 
-    requires      { CYGHWR_HAL_CORTEXM == "M3" }
+    requires      { (CYGHWR_HAL_CORTEXM == "M3") || (CYGHWR_HAL_CORTEXM == "M4") }
+
+    cdl_component CYGHWR_HAL_CORTEXM_STM32_SELECTION {
+        display          "STM32 processor selection"
+        no_define
+        flavor           none
+        description      "
+            The options within this component allow you to select which STM32
+            processor is in use."
+
 
     cdl_option CYGHWR_HAL_CORTEXM_STM32 {
-        display          "STM32 variant in use"
+            display          "STM32 processor variant in use"
         flavor           data
-        default_value    {"F103ZE"}
-        legal_values     {"F103RC" "F103VC" "F103ZC"
-                          "F103RD" "F103VD" "F103ZD"
-                          "F103RE" "F103VE" "F103ZE" }
+            default_value    { (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1") ? CYGHWR_HAL_CORTEXM_STM32_F1 : \
+                               (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") ? CYGHWR_HAL_CORTEXM_STM32_F2 : \
+			       CYGHWR_HAL_CORTEXM_STM32_F4 }
+            # At some point we'll add the L1, etc. here.
         description      "The STM32 has several variants, the main differences
                           being in the size of on-chip FLASH and SRAM
                           and numbers of some peripherals. This option
@@ -82,6 +91,103 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
                           microcontroller fitted."
     }
                           
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_FAMILY {
+            display          "Processor family in use"
+            flavor           data
+            default_value    { "F1" }
+            legal_values     { "F1" "F2" "F4" }
+	    # NOTE: F1/F2 imply CYGHWR_HAL_CORTEXM_M3 and F4 implies CYGHWR_HAL_CORTEXM_M4
+            description      "
+                Which family of STM32 processors is in use. This will
+                usually be the leading part of the processor model name."
+        }
+
+	# NOTE: This allows later L1 support to still select "FAMILY_HIPERFORMANCE" if the I/O is the same:
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE {
+            display     "Part belongs to ST Hi-Performance family"
+	    active_if   { (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") }
+	    calculated  { (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4") }
+            description "
+	        Indicates that this part conforms to the I/O
+		definitions for the Hi-Performance family of
+		devices. Currently this includes the STM32 F2 and F4
+		devices."
+        }
+
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_F1 {
+            display          "F1 processor family selection"
+            flavor           data
+            active_if        { CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1" }
+            default_value    {"F103ZE"}
+            legal_values     {"F103RC" "F103VC" "F103ZC"
+                              "F103RD" "F103VD" "F103ZD"
+                              "F103RE" "F103VE" "F103ZE"
+                              "F105R8" "F105V8"
+                              "F105RB" "F105VB"
+                              "F105RC" "F105VC"
+                              "F107RB" "F107VB"
+                              "F107RC" "F107VC"
+                             }
+            requires         { CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F1 }
+            description "
+                This option specifies which member of the STM32F1 family is
+                in use."
+        }
+
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_F2 {
+            display          "F2 processor family selection"
+            flavor           data
+            active_if        { CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2" }
+            default_value    {"F207IG"}
+            legal_values     {"F205RB" "F205RC" "F205RE" "F205RF" "F205RG"
+                              "F205VB" "F205VC" "F205VE" "F205VF" "F205VG"
+                              "F205ZB" "F205ZC" "F205ZE" "F205ZF" "F205ZG"
+                              "F207VB" "F207VC" "F207VE" "F207VF" "F207VG"
+                              "F207ZB" "F207ZC" "F207ZE" "F207ZF" "F207ZG"
+                              "F207IB" "F207IC" "F207IE" "F207IF" "F207IG"
+                             }
+            requires         { CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F2 }
+            description "
+                This option specifies which member of the STM32F2 family is
+                in use."
+        }
+
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_F4 {
+            display          "F4 processor family selection"
+            flavor           data
+            active_if        { CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4" }
+            default_value    {"F407IG"}
+            # NOTEs: The "F4xxxE" parts have 512MB on-chip flash and
+            # the "F4xxxG" parts have 1MB on-chip flash. The "F41xxx"
+            # parts have CRYPTO support.
+            legal_values     {"F405RG" "F405VG" "F405ZG"
+                              "F415RG" "F415VG" "F415ZG"
+                              "F407IG" "F407VG" "F407ZG"
+                              "F407IE" "F407VE" "F407ZE"
+                              "F417IG" "F417VG" "F417ZG"
+                              "F417IE" "F417VE" "F417ZE"
+                             }
+            requires         { CYGHWR_HAL_CORTEXM_STM32 == CYGHWR_HAL_CORTEXM_STM32_F4 }
+            description "
+                This option specifies which member of the STM32F4 family is
+                in use."
+        }
+    }
+
+    cdl_option CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY {
+        display         "Part belongs to connectivity family"
+        default_value   { (CYGHWR_HAL_CORTEXM_STM32 == "F105R8") || (CYGHWR_HAL_CORTEXM_STM32 == "F105V8") ||
+                          (CYGHWR_HAL_CORTEXM_STM32 == "F105RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VB") ||
+                          (CYGHWR_HAL_CORTEXM_STM32 == "F105RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F105VC") ||
+                          (CYGHWR_HAL_CORTEXM_STM32 == "F107RB") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VB") ||
+                          (CYGHWR_HAL_CORTEXM_STM32 == "F107RC") || (CYGHWR_HAL_CORTEXM_STM32 == "F107VC") ||
+                          (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F4")
+                        }
+        description     "Indicates that this part belongs to the connectivity
+                         family of devices. These have slightly different interrupt
+                         and GPIO layouts to the original STM32 F103 devices."
+    }
+    
     cdl_option CYGNUM_HAL_CORTEXM_PRIORITY_LEVEL_BITS {
         display         "CPU priority levels"
         flavor          data
@@ -95,20 +201,62 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
    
     cdl_component CYGHWR_HAL_CORTEXM_STM32_CLOCK {
         display         "Clock setup calculations"
-        default_value   1
+        flavor          none
+        no_define
         
         cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE {
             display         "PLL input source"
             flavor          data
             default_value   { "HSE" }
-            legal_values    { "HSI_HALF" "HSE" "HSE_HALF" }
+            legal_values    { "HSI" "HSE" }
+            description     "
+                This sets whether the PLL will be driven by the external
+                high-speed clock (HSE), or internal high-speed clock (HSI)."
         }
 
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV {
+            display         "PLL pre-divider"
+            flavor          data
+            default_value   1
+            legal_values    1 to 63
+            requires        { !CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 2) }
+            requires        { (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV <= 16) }
+            requires        { ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") && (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE == "HSI")) implies \
+                                  (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 2) }
+            requires        { ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV >= 2) }
+            description     "
+               This option corresponds to the divider used before input to the PLL.
+               On non-connectivity parts, you can only divide by 2 or 1. On other
+               F1 parts, if using HSI as the clock source, then that is automatically
+               divided by 2. If using HSE as the clock source, then this value corresponds
+               to the PREDIV1 field of register RCC_CFGR2. On F2 and F4 parts, this value
+               corresponds to the PLLM field of RCC_PLLCFGR."
+        }
+
+
         cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL {
             display         "PLL multiplier"
             flavor          data
             default_value   9
-            legal_values    2 to 16
+            legal_values    2 to 432
+            requires        { (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F1") implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 16) }
+            requires        { ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) implies (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL <= 432) }
+            description     "
+                This value is used to multiply up the PLL input. On the F1 it corresponds
+                to the PLLMUL field of RCC_CFGR. On the F2 and F4 it corresponds to the PLLN
+                field of RCC_PLLCFGR."
+        }
+
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV {
+            display         "SYSCLK divider"
+            flavor          data
+            active_if       { ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) }
+            default_value   4
+            legal_values    { 2 4 6 8 }
+            description     "
+                This value is used to divide down the PLL output for use as
+                the SYSCLK clock. This corresponds to the PLLP field of
+                RCC_PLLCFGR"
         }
 
         cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV {
@@ -116,6 +264,7 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
             flavor          data
             default_value   1
             legal_values    { 1 2 4 8 16 64 128 256 512 }
+            description     "Divider for AHB"
         }
         
         cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV {
@@ -123,6 +272,7 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
             flavor          data
             default_value   2
             legal_values    { 1 2 4 8 16 }
+            description     "Divider for APB1"
         }
 
         cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV {
@@ -130,6 +280,20 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
             flavor          data
             default_value   1
             legal_values    { 1 2 4 8 16 }
+            description     "Divider for APB2"
+        }
+
+        cdl_option CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV {
+            display         "PLLQ divider"
+            flavor          data
+            active_if       { ((CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F2") || (CYGHWR_HAL_CORTEXM_STM32_FAMILY=="F4")) }
+            default_value   10
+            legal_values    4 to 15
+            description     "
+               This PLL divider is used in the F2 and F4 families to divide down the
+               PLL output clock (VCO clock) for use by the USB OTG FS, SDIO
+               and RNG peripherals. USB OTG FS requires a 48MHz clock and
+               other peripherals require a clock no greater than 48MHz."
         }
     }
 
@@ -191,6 +355,71 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
         description "The platform has a socket on UART4."
     }
     
+    cdl_interface CYGINT_HAL_STM32_UART5 {
+        display     "Platform has UART5 serial port"
+        description "The platform has a socket on UART5."
+    }
+
+    cdl_option CYGHWR_HAL_STM32_UART0_REMAP {
+        display       "Remap UART0 (USART1) pins"
+        default_value 0
+
+        description   "Remap UART0 (USART1) to alternate set of pins.
+                       This will usually be set by the platform
+                       HAL to reflect the configuration of the hardware."
+    }
+
+    cdl_option CYGHWR_HAL_STM32_UART1_REMAP {
+        display       "Remap UART1 (USART2) pins"
+        default_value 0
+
+        description   "Remap UART1 (USART2) to alternate set of pins.
+                       This will usually be set by the platform
+                       HAL to reflect the configuration of the hardware."
+    }
+
+    cdl_option CYGHWR_HAL_STM32_UART2_REMAP {
+        display       "Remap UART2 (USART3) pins"
+        flavor        data
+        default_value { "NONE" }
+        legal_values  { "NONE" "PARTIAL" "FULL" }
+
+        description   "Remap UART2 (USART3) to alternate set of pins.
+                       This will usually be set by the platform
+                       HAL to reflect the configuration of the hardware."
+    }
+
+    cdl_option CYGHWR_HAL_STM32_I2C1_REMAP {
+        display       "Remap I2C bus 1 pins"
+        default_value 0
+
+        description   "Remap I2C bus 1 to alternate set of pins.
+                       This will usually be set by the platform
+                       HAL to reflect the configuration of the hardware."
+    }
+
+    cdl_option CYGHWR_HAL_STM32_SPI1_REMAP {
+        display       "Remap SPI bus 1 pins"
+        active_if     CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+        default_value 0
+
+        description   "Remap SPI bus 1 to alternate set of pins.
+                       This will usually be set by the platform
+                       HAL to reflect the configuration of the hardware."
+    }
+
+    cdl_option CYGHWR_HAL_STM32_SPI3_REMAP {
+        display       "Remap SPI bus 3 pins"
+        active_if     CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+        default_value 0
+
+        description   "Remap SPI bus 3 to alternate set of pins.
+                       This will usually be set by the platform
+                       HAL to reflect the configuration of the hardware.
+                       This option is only available on connectivity line
+                       devices."
+    }
+
     cdl_option CYGFUN_HAL_CORTEXM_STM32_PROFILE_TIMER {
         display       "Use TIM2 for gprof profiling"
         active_if     CYGPKG_PROFILE_GPROF
@@ -247,3 +476,5 @@ cdl_package CYGPKG_HAL_CORTEXM_STM32 {
     }
     
 }
+
+# EOF hal_cortexm_stm32.cdl
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/stm32/var/current/include/var_dma.h
@@ -0,0 +1,146 @@
+#ifndef CYGONCE_HAL_VAR_DMA_H
+#define CYGONCE_HAL_VAR_DMA_H
+//=============================================================================
+//
+//      var_dma.h
+//
+//      STM32 DMA support
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.                        
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT      
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   nickg
+// Date:        2011-12-07
+// Purpose:     STM32 DMA support
+// Description: 
+// Usage:       #include <cyg/hal/var_dma.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#include <pkgconf/hal_cortexm_stm32.h>
+
+#include <cyg/hal/drv_api.h>
+
+//=============================================================================
+// DMA stream descriptors
+
+#define CYGHWR_HAL_STM32_DMA_MODE_P2M           0
+#define CYGHWR_HAL_STM32_DMA_MODE_M2P           1
+#define CYGHWR_HAL_STM32_DMA_MODE_M2M           2
+
+
+// DMA descriptor. Packs interrupt vector, controller, stream and
+// channel IDs together with the mode into a 32 bit descriptor.
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_DMA( __ctlr, __stream, __chan, __mode )        \
+    (((CYGNUM_HAL_INTERRUPT_DMA##__ctlr##_CH##__stream)<<16) |         \
+     ((CYGHWR_HAL_STM32_DMA_MODE_##__mode)<<12) |                       \
+     ((__chan)<<8) | ((__stream)<<4) | ((__ctlr)<<0))
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_DMA( __ctlr, __stream, __chan, __mode )        \
+    (((CYGNUM_HAL_INTERRUPT_DMA##__ctlr##_STR##__stream)<<16) |         \
+     ((CYGHWR_HAL_STM32_DMA_MODE_##__mode)<<12) |                       \
+     ((__chan)<<8) | ((__stream)<<4) | ((__ctlr)<<0))
+#else
+#error "Undefined STM32 family"
+#endif
+
+#define CYGHWR_HAL_STM32_DMA_INTERRUPT( __desc )  (((__desc)>>16)&0xFFFF)
+#define CYGHWR_HAL_STM32_DMA_MODE( __desc )       (((__desc)>>12)&0xF)
+#define CYGHWR_HAL_STM32_DMA_CHANNEL( __desc )    (((__desc)>>8)&0xF)
+#define CYGHWR_HAL_STM32_DMA_STREAM( __desc )     (((__desc)>>4)&0xF)
+#define CYGHWR_HAL_STM32_DMA_CONTROLLER( __desc ) (((__desc)>>0)&0xF)
+
+//=============================================================================
+// API
+
+#ifndef __ASSEMBLER__
+
+typedef struct hal_stm32_dma_stream hal_stm32_dma_stream;
+
+typedef void hal_stm32_dma_callback( hal_stm32_dma_stream *stream, cyg_uint32 count, CYG_ADDRWORD data );
+
+struct hal_stm32_dma_stream
+{
+    // These fields need to be initialized before calling
+    // hal_stm32_dma_init(). This can usually be done statically, when
+    // defining an containing data structure.
+    
+    cyg_uint32                  desc;           // stream descriptor
+    hal_stm32_dma_callback      *callback;      // Callback function
+    CYG_ADDRWORD                data;           // Client private data
+
+    
+    // Runtime data
+    
+    CYG_ADDRWORD                ctlr;           // Controller base address
+    CYG_ADDRWORD                stream;         // Stream/channel index
+
+    cyg_uint32                  ccr;            // Channel control register value
+    cyg_bool                    active;         // Channel active
+    cyg_uint32                  count;          // Bytes left to transfer
+    
+    cyg_interrupt               interrupt;      // DMA interrupt object
+    cyg_handle_t                handle;         // Interrupt handle
+};
+
+
+__externC void hal_stm32_dma_init( hal_stm32_dma_stream *stream, int pri );
+
+__externC void hal_stm32_dma_delete( hal_stm32_dma_stream *stream );
+
+__externC void hal_stm32_dma_disable( hal_stm32_dma_stream *stream );
+
+__externC void hal_stm32_dma_poll( hal_stm32_dma_stream *stream );
+
+__externC void hal_stm32_dma_configure( hal_stm32_dma_stream *stream, int tfr_size,
+                                        cyg_bool no_minc, cyg_bool polled  );
+
+__externC void hal_stm32_dma_configure_circular( hal_stm32_dma_stream *stream,
+                                                 cyg_bool enable);
+
+__externC void hal_stm32_dma_start( hal_stm32_dma_stream *stream, void *memory,
+                                    CYG_ADDRESS peripheral, cyg_uint32 size );
+
+__externC void hal_stm32_dma_show( hal_stm32_dma_stream *stream );
+
+#endif // __ASSEMBLER__
+
+#endif // CYGONCE_HAL_VAR_DMA_H
+//-----------------------------------------------------------------------------
+// end of var_dma.h
--- a/packages/hal/cortexm/stm32/var/current/include/var_intr.h
+++ b/packages/hal/cortexm/stm32/var/current/include/var_intr.h
@@ -4,7 +4,7 @@
 //
 //      var_intr.h
 //
-//      HAL Interrupt and clock assignments for STR7XX variants
+//      HAL Interrupt and clock assignments for STM32 variants
 //
 //==========================================================================
 // ####ECOSGPLCOPYRIGHTBEGIN####                                            
@@ -42,9 +42,9 @@
 //#####DESCRIPTIONBEGIN####
 //
 // Author(s):    nickg
-// Date:         2008-07-30
+// Date:         2008-10-06
 // Purpose:      Define Interrupt support
-// Description:  The interrupt specifics for ST STR7XX variants are
+// Description:  The interrupt specifics for ST STM32 variants are
 //               defined here.
 //              
 // Usage:        #include <cyg/hal/var_intr.h>
@@ -63,7 +63,12 @@
 #define CYGNUM_HAL_INTERRUPT_WWDG               ( 0+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_PVD                ( 1+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TAMPER             ( 2+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TAMP_STAMP         ( 2+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name - also timestamps
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGNUM_HAL_INTERRUPT_RTC_GLOBAL         ( 3+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGNUM_HAL_INTERRUPT_RTC_WKUP           ( 3+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#endif
 #define CYGNUM_HAL_INTERRUPT_FLASH              ( 4+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_RCC                ( 5+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_EXTI0              ( 6+CYGNUM_HAL_INTERRUPT_EXTERNAL)
@@ -72,25 +77,41 @@
 #define CYGNUM_HAL_INTERRUPT_EXTI3              ( 9+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 
 #define CYGNUM_HAL_INTERRUPT_EXTI4              (10+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH1           (11+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH2           (12+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH3           (13+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH4           (14+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH5           (15+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH6           (16+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA1_CH7           (17+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_ADC1_2             (18+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH1           (11+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR0          (11+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH2           (12+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR1          (12+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH3           (13+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR2          (13+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH4           (14+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR3          (14+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH5           (15+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR4          (15+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH6           (16+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR5          (16+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA1_CH7           (17+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR6          (17+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_ADC1_2             (18+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 only has ADC1+2
+#define CYGNUM_HAL_INTERRUPT_ADC1_2_3           (18+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has ADC1+2+3
+#define CYGNUM_HAL_INTERRUPT_ADC                (18+CYGNUM_HAL_INTERRUPT_EXTERNAL) // More generic name
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGNUM_HAL_INTERRUPT_USB_HP             (19+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_CAN_TX             (19+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#endif
+#define CYGNUM_HAL_INTERRUPT_CAN1_TX            (19+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGNUM_HAL_INTERRUPT_USB_LP             (20+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_CAN_RX0            (20+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_CAN_RX1            (21+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_CAN_SCE            (22+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#endif
+#define CYGNUM_HAL_INTERRUPT_CAN1_RX0           (20+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CAN1_RX1           (21+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CAN1_SCE           (22+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_EXTI9_5            (23+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM1_BRK           (24+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TIM1_BRK_TIM9      (24+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because is also TIM9
 #define CYGNUM_HAL_INTERRUPT_TIM1_UP            (25+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TIM1_UP_TIM10      (25+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because is also TIM10
 #define CYGNUM_HAL_INTERRUPT_TIM1_TRG           (26+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TIM1_TRG_COM_TIM11 (26+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because is also TIM11
 #define CYGNUM_HAL_INTERRUPT_TIM1_CC            (27+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM2               (28+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM3               (29+CYGNUM_HAL_INTERRUPT_EXTERNAL)
@@ -108,28 +129,105 @@
 
 #define CYGNUM_HAL_INTERRUPT_EXTI15_10          (40+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_RTC_ALARM          (41+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGNUM_HAL_INTERRUPT_USB_WAKEUP         (42+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGNUM_HAL_INTERRUPT_OTG_FS_WKUP        (42+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#endif
+#ifndef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
 #define CYGNUM_HAL_INTERRUPT_TIM8_BRK           (43+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM8_UP            (44+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM8_TRG           (45+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM8_CC            (46+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGNUM_HAL_INTERRUPT_ADC3               (47+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#endif
 #define CYGNUM_HAL_INTERRUPT_FSMC               (48+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_SDIO               (49+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#else
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGNUM_HAL_INTERRUPT_TIM8_BRK_TIM12     (43+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because is also TIM12
+#define CYGNUM_HAL_INTERRUPT_TIM8_UP_TIM13      (44+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because is also TIM13
+#define CYGNUM_HAL_INTERRUPT_TIM8_TRG_COM_TIM14 (45+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because is also TIM13
+#define CYGNUM_HAL_INTERRUPT_TIM8_CC            (46+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA1_STR7          (47+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_FSMC               (48+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_SDIO               (49+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#endif
+#endif
 
 #define CYGNUM_HAL_INTERRUPT_TIM5               (50+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_SPI3               (51+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_UART4              (52+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_UART5              (53+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 #define CYGNUM_HAL_INTERRUPT_TIM6               (54+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_TIM6_DAC           (54+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 name because also DAC1+2 underrun
 #define CYGNUM_HAL_INTERRUPT_TIM7               (55+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA2_CH1           (56+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA2_CH2           (57+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA2_CH3           (58+CYGNUM_HAL_INTERRUPT_EXTERNAL)
-#define CYGNUM_HAL_INTERRUPT_DMA2_CH4_5         (59+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH1           (56+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR0          (56+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH2           (57+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR1          (57+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH3           (58+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR2          (58+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+
+#ifndef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+# error Support does not yet exist for F2 or F4 without connectivity
+#endif
+
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH4           (59+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH5           (CYGNUM_HAL_INTERRUPT_DMA2_CH4) // As per RM0008 datasheet 3.3.6 note
 
 #define CYGNUM_HAL_INTERRUPT_NVIC_MAX           (59+CYGNUM_HAL_INTERRUPT_EXTERNAL)
 
+#else
+
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH4           (59+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR3          (59+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+
+#define CYGNUM_HAL_INTERRUPT_DMA2_CH5           (60+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F1 has channels
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR4          (60+CYGNUM_HAL_INTERRUPT_EXTERNAL) // F2/F4 has streams
+#define CYGNUM_HAL_INTERRUPT_ETH                (61+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_ETH_WAKEUP         (62+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CAN2_TX            (63+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CAN2_RX0           (64+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CAN2_RX1           (65+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CAN2_SCE           (66+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGNUM_HAL_INTERRUPT_USB_FS             (67+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_NVIC_MAX           (67+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGNUM_HAL_INTERRUPT_OTG_FS             (67+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR5          (68+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR6          (69+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DMA2_STR7          (70+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_UART6              (71+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C3_EV            (72+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_I2C3_ER            (73+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_OTG_HS_EP1_OUT     (74+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_OTG_HS_EP1_IN      (75+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_OTG_HS_WKUP        (76+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_OTG_HS             (77+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_DCMI               (78+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_CRYP               (79+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#define CYGNUM_HAL_INTERRUPT_HASH_RNG           (80+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+# define CYGNUM_HAL_INTERRUPT_HASH_FPU          (81+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+
+# define CYGNUM_HAL_INTERRUPT_NVIC_MAX          (81+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F2)
+# define CYGNUM_HAL_INTERRUPT_NVIC_MAX          (80+CYGNUM_HAL_INTERRUPT_EXTERNAL)
+#else
+# error "Support does not yet exist for this FAMILY_HIPERFORMANCE configuration"
+#endif
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#endif // ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+
 #define CYGNUM_HAL_INTERRUPT_EXTI5              ( 1+CYGNUM_HAL_INTERRUPT_NVIC_MAX)
 #define CYGNUM_HAL_INTERRUPT_EXTI6              ( 2+CYGNUM_HAL_INTERRUPT_NVIC_MAX)
 #define CYGNUM_HAL_INTERRUPT_EXTI7              ( 3+CYGNUM_HAL_INTERRUPT_NVIC_MAX)
@@ -155,6 +253,45 @@
 //==========================================================================
 // Interrupt mask and config for variant-specific devices
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define HAL_VAR_PERIPH_EXTI_MAP_FAMILY                                  \
+    case CYGNUM_HAL_INTERRUPT_PVD:                                      \
+        __v =  16;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_RTC_ALARM:                                \
+        __v =  17;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_USB_WAKEUP:                               \
+        __v =  18;                                                      \
+        break;
+
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define HAL_VAR_PERIPH_EXTI_MAP_FAMILY                                  \
+    case CYGNUM_HAL_INTERRUPT_PVD:                                      \
+        __v =  16;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_RTC_ALARM:                                \
+        __v =  17;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_OTG_FS_WKUP:                              \
+        __v =  18;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_ETH_WAKEUP:                               \
+        __v =  19;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_OTG_HS_WKUP:                              \
+        __v =  20;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_TAMP_STAMP:                               \
+        __v =  21;                                                      \
+        break;                                                          \
+    case CYGNUM_HAL_INTERRUPT_RTC_WKUP:                                 \
+        __v =  22;                                                      \
+        break;
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
 #define HAL_VAR_INTERRUPT_MASK( __vector )                              \
 {                                                                       \
     cyg_int32 __v = -1;                                                 \
@@ -173,17 +310,7 @@
         __v =  __vector - CYGNUM_HAL_INTERRUPT_EXTI5 + 5;               \
         break;                                                          \
                                                                         \
-    case CYGNUM_HAL_INTERRUPT_PVD:                                      \
-        __v =  16;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_RTC_ALARM:                                \
-        __v =  17;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_USB_WAKEUP:                               \
-        __v =  18;                                                      \
-        break;                                                          \
+    HAL_VAR_PERIPH_EXTI_MAP_FAMILY                                      \
     }                                                                   \
                                                                         \
     if( __v >= 0 )                                                      \
@@ -217,17 +344,7 @@
                           CYGARC_REG_NVIC_IBIT(CYGNUM_HAL_INTERRUPT_EXTI15_10-CYGNUM_HAL_INTERRUPT_EXTERNAL) ); \
         break;                                                          \
                                                                         \
-    case CYGNUM_HAL_INTERRUPT_PVD:                                      \
-        __v =  16;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_RTC_ALARM:                                \
-        __v =  17;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_USB_WAKEUP:                               \
-        __v =  18;                                                      \
-        break;                                                          \
+    HAL_VAR_PERIPH_EXTI_MAP_FAMILY                                      \
     }                                                                   \
                                                                         \
     if( __v >= 0 )                                                      \
@@ -259,17 +376,7 @@
         __v =  __vector - CYGNUM_HAL_INTERRUPT_EXTI5 + 5;               \
         break;                                                          \
                                                                         \
-    case CYGNUM_HAL_INTERRUPT_PVD:                                      \
-        __v =  16;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_RTC_ALARM:                                \
-        __v =  17;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_USB_WAKEUP:                               \
-        __v =  18;                                                      \
-        break;                                                          \
+    HAL_VAR_PERIPH_EXTI_MAP_FAMILY                                      \
     }                                                                   \
                                                                         \
     if( __v >= 0 )                                                      \
@@ -297,17 +404,7 @@
         __v =  __vector - CYGNUM_HAL_INTERRUPT_EXTI5 + 5;               \
         break;                                                          \
                                                                         \
-    case CYGNUM_HAL_INTERRUPT_PVD:                                      \
-        __v =  16;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_RTC_ALARM:                                \
-        __v =  17;                                                      \
-        break;                                                          \
-                                                                        \
-    case CYGNUM_HAL_INTERRUPT_USB_WAKEUP:                               \
-        __v =  18;                                                      \
-        break;                                                          \
+    HAL_VAR_PERIPH_EXTI_MAP_FAMILY                                      \
     }                                                                   \
                                                                         \
     if(( __v >= 0 ) && !(__level) )                                     \
--- a/packages/hal/cortexm/stm32/var/current/include/var_io.h
+++ b/packages/hal/cortexm/stm32/var/current/include/var_io.h
@@ -64,6 +64,11 @@
 #define CYGHWR_HAL_STM32_TIM5           0x40000C00
 #define CYGHWR_HAL_STM32_TIM6           0x40001000
 #define CYGHWR_HAL_STM32_TIM7           0x40001400
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_TIM12          0x40001800
+#define CYGHWR_HAL_STM32_TIM13          0x40001C00
+#define CYGHWR_HAL_STM32_TIM14          0x40002000
+#endif
 #define CYGHWR_HAL_STM32_RTC            0x40002800
 #define CYGHWR_HAL_STM32_WWDG           0x40002C00
 #define CYGHWR_HAL_STM32_IWDG           0x40003000
@@ -75,12 +80,22 @@
 #define CYGHWR_HAL_STM32_UART5          0x40005000
 #define CYGHWR_HAL_STM32_I2C1           0x40005400
 #define CYGHWR_HAL_STM32_I2C2           0x40005800
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_USB            0x40005C00
 #define CYGHWR_HAL_STM32_USB_CAN_SRAM   0x40006000
-#define CYGHWR_HAL_STM32_BXCAN          0x40006400
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_I2C3           0x40005C00
+#endif
+#define CYGHWR_HAL_STM32_BXCAN1         0x40006400
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_BXCAN2         0x40006800
+#endif
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_BKP            0x40006C00
+#endif
 #define CYGHWR_HAL_STM32_PWR            0x40007000
 #define CYGHWR_HAL_STM32_DAC            0x40007400
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_AFIO           0x40010000
 #define CYGHWR_HAL_STM32_EXTI           0x40010400
 #define CYGHWR_HAL_STM32_GPIOA          0x40010800
@@ -93,7 +108,21 @@
 #define CYGHWR_HAL_STM32_ADC1           0x40012400
 #define CYGHWR_HAL_STM32_ADC2           0x40012800
 #define CYGHWR_HAL_STM32_TIM1           0x40012C00
+#elif defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_TIM1           0x40010000
+#define CYGHWR_HAL_STM32_PWM1           0x40010000
+#define CYGHWR_HAL_STM32_TIM8           0x40010400
+#define CYGHWR_HAL_STM32_PWM2           0x40010400
+#define CYGHWR_HAL_STM32_UART1          0x40011000
+#define CYGHWR_HAL_STM32_UART6          0x40014000
+#define CYGHWR_HAL_STM32_ADC1           0x40012000
+#define CYGHWR_HAL_STM32_ADC2           CYGHWR_HAL_STM32_ADC1 + 0x0100
+#define CYGHWR_HAL_STM32_ADC3           CYGHWR_HAL_STM32_ADC1 + 0x0200
+#define CYGHWR_HAL_STM32_ADC_COMMON     CYGHWR_HAL_STM32_ADC1 + 0x0300
+#define CYGHWR_HAL_STM32_SDIO           0x40012C00
+#endif
 #define CYGHWR_HAL_STM32_SPI1           0x40013000
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_TIM8           0x40013400
 #define CYGHWR_HAL_STM32_UART1          0x40013800
 #define CYGHWR_HAL_STM32_ADC3           0x40013C00
@@ -102,8 +131,42 @@
 #define CYGHWR_HAL_STM32_DMA2           0x40020400
 #define CYGHWR_HAL_STM32_RCC            0x40021000
 #define CYGHWR_HAL_STM32_FLASH          0x40022000
+#elif defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_SYSCFG         0x40013800
+#define CYGHWR_HAL_STM32_EXTI           0x40013C00
+#define CYGHWR_HAL_STM32_TIM9           0x40014000
+#define CYGHWR_HAL_STM32_TIM10          0x40014400
+#define CYGHWR_HAL_STM32_TIM11          0x40014800
+#define CYGHWR_HAL_STM32_GPIOA          0x40020000
+#define CYGHWR_HAL_STM32_GPIOB          0x40020400
+#define CYGHWR_HAL_STM32_GPIOC          0x40020800
+#define CYGHWR_HAL_STM32_GPIOD          0x40020C00
+#define CYGHWR_HAL_STM32_GPIOE          0x40021000
+#define CYGHWR_HAL_STM32_GPIOF          0x40021400
+#define CYGHWR_HAL_STM32_GPIOG          0x40021800
+#define CYGHWR_HAL_STM32_GPIOH          0x40021C00
+#define CYGHWR_HAL_STM32_GPIOI          0x40022000
+#endif
 #define CYGHWR_HAL_STM32_CRC            0x40023000
-
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_RCC            0x40023800
+#define CYGHWR_HAL_STM32_FLASH          0x40023C00
+#define CYGHWR_HAL_STM32_BKPSRAM        0x40024000
+#define CYGHWR_HAL_STM32_DMA1           0x40026000
+#define CYGHWR_HAL_STM32_DMA2           0x40026400
+#endif
+#define CYGHWR_HAL_STM32_ETH            0x40028000
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_USB_OTG_HS     0x40040000
+#endif
+#define CYGHWR_HAL_STM32_USB_OTG_FS     0x50000000
+#define CYGHWR_HAL_STM32_OTG            CYGHWR_HAL_STM32_USB_OTG_FS // compatibility define. Deprecated.
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_DCMI           0x50050000
+#define CYGHWR_HAL_STM32_CRYP           0x50060000
+#define CYGHWR_HAL_STM32_HASH           0x50060400
+#define CYGHWR_HAL_STM32_RNG            0x50060800
+#endif
 #define CYGHWR_HAL_STM32_FSMC           0xA0000000
 
 //=============================================================================
@@ -125,6 +188,7 @@
 // Not all registers are described here
 
 #define CYGHWR_HAL_STM32_RCC_CR                 0x00
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_RCC_CFGR               0x04
 #define CYGHWR_HAL_STM32_RCC_CIR                0x08
 #define CYGHWR_HAL_STM32_RCC_APB2RSTR           0x0C
@@ -134,6 +198,32 @@
 #define CYGHWR_HAL_STM32_RCC_APB1ENR            0x1C
 #define CYGHWR_HAL_STM32_RCC_BDCR               0x20
 #define CYGHWR_HAL_STM32_RCC_CSR                0x24
+# ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_RCC_AHBRSTR            0x28
+#define CYGHWR_HAL_STM32_RCC_CFGR2              0x2C
+# endif
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR            0x04
+#define CYGHWR_HAL_STM32_RCC_CFGR               0x08
+#define CYGHWR_HAL_STM32_RCC_CIR                0x0C
+#define CYGHWR_HAL_STM32_RCC_AHB1RSTR           0x10
+#define CYGHWR_HAL_STM32_RCC_AHB2RSTR           0x14
+#define CYGHWR_HAL_STM32_RCC_AHB3RSTR           0x18
+#define CYGHWR_HAL_STM32_RCC_APB1RSTR           0x20
+#define CYGHWR_HAL_STM32_RCC_APB2RSTR           0x24
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR            0x30
+#define CYGHWR_HAL_STM32_RCC_AHB2ENR            0x34
+#define CYGHWR_HAL_STM32_RCC_AHB3ENR            0x38
+#define CYGHWR_HAL_STM32_RCC_APB1ENR            0x40
+#define CYGHWR_HAL_STM32_RCC_APB2ENR            0x44
+#define CYGHWR_HAL_STM32_RCC_AHB1LPENR          0x50
+#define CYGHWR_HAL_STM32_RCC_AHB2LPENR          0x54
+#define CYGHWR_HAL_STM32_RCC_AHB3LPENR          0x58
+#define CYGHWR_HAL_STM32_RCC_APB1LPENR          0x60
+#define CYGHWR_HAL_STM32_RCC_APB2LPENR          0x64
+#define CYGHWR_HAL_STM32_RCC_BDCR               0x70
+#define CYGHWR_HAL_STM32_RCC_CSR                0x74
+#endif
 
 #define CYGHWR_HAL_STM32_RCC_CR_HSION           BIT_(0)
 #define CYGHWR_HAL_STM32_RCC_CR_HSIRDY          BIT_(1)
@@ -145,6 +235,26 @@
 #define CYGHWR_HAL_STM32_RCC_CR_CSSON           BIT_(19)
 #define CYGHWR_HAL_STM32_RCC_CR_PLLON           BIT_(24)
 #define CYGHWR_HAL_STM32_RCC_CR_PLLRDY          BIT_(25)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_RCC_CR_PLLI2SON        BIT_(26)
+#define CYGHWR_HAL_STM32_RCC_CR_PLLI2SRDY       BIT_(27)
+#endif
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLM(__m)  VALUE_(0,__m)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLM_MASK  MASK_(0,6)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLN(__n)  VALUE_(6,__n)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLN_MASK  MASK_(6,9)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLP(__p)  VALUE_(16,((__p)>>1)-1 )
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLP_2     VALUE_(16,0)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLP_4     VALUE_(16,1)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLP_6     VALUE_(16,2)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLP_8     VALUE_(16,3)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLSRC_HSI VALUE_(22,0)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLSRC_HSE VALUE_(22,1)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLQ(__q)  VALUE_(24,__q)
+#define CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLQ_MASK  MASK_(24,4)
+#endif
 
 #define CYGHWR_HAL_STM32_RCC_CFGR_SW_HSI        VALUE_(0,0)
 #define CYGHWR_HAL_STM32_RCC_CFGR_SW_HSE        VALUE_(0,1)
@@ -163,6 +273,7 @@
 #define CYGHWR_HAL_STM32_RCC_CFGR_HPRE_128      VALUE_(4,13)
 #define CYGHWR_HAL_STM32_RCC_CFGR_HPRE_256      VALUE_(4,14)
 #define CYGHWR_HAL_STM32_RCC_CFGR_HPRE_512      VALUE_(4,15)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_1       VALUE_(8,0)
 #define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_2       VALUE_(8,4)
 #define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_4       VALUE_(8,5)
@@ -188,63 +299,219 @@
 #define CYGHWR_HAL_STM32_RCC_CFGR_MCO_HSI       VALUE_(24,5)
 #define CYGHWR_HAL_STM32_RCC_CFGR_MCO_HSE       VALUE_(24,6)
 #define CYGHWR_HAL_STM32_RCC_CFGR_MCO_PLL       VALUE_(24,7)
-
-
-#define CYGHWR_HAL_STM32_RCC_AHBENR_DMA1        BIT_(0)
-#define CYGHWR_HAL_STM32_RCC_AHBENR_DMA2        BIT_(1)
-#define CYGHWR_HAL_STM32_RCC_AHBENR_SRAM        BIT_(2)
-#define CYGHWR_HAL_STM32_RCC_AHBENR_FLITF       BIT_(4)
-#define CYGHWR_HAL_STM32_RCC_AHBENR_CRC         BIT_(6)
-#define CYGHWR_HAL_STM32_RCC_AHBENR_FSMC        BIT_(8)
-#define CYGHWR_HAL_STM32_RCC_AHBENR_SDIO        BIT_(10)
+# ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO_PLL2      VALUE_(24,8)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO_PLL3_HALF VALUE_(24,9)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO_XT1       VALUE_(24,10)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO_PLL3      VALUE_(24,11)
+# endif
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_1       VALUE_(10,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_2       VALUE_(10,4)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_4       VALUE_(10,5)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_8       VALUE_(10,6)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE1_16      VALUE_(10,7)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_1       VALUE_(13,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_2       VALUE_(13,4)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_4       VALUE_(13,5)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_8       VALUE_(13,6)
+#define CYGHWR_HAL_STM32_RCC_CFGR_PPRE2_16      VALUE_(13,7)
+#define CYGHWR_HAL_STM32_RCC_CFGR_RTCPRE(__x)   VALUE_(16,__x)
+#define CYGHWR_HAL_STM32_RCC_CFGR_RTCPRE_MASK   MASK_(16,5)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1_MASK     MASK_(21,2)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1_HSI      VALUE_(21,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1_LSE      VALUE_(21,1)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1_HSE      VALUE_(21,2)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1_PLL      VALUE_(21,3)
+#define CYGHWR_HAL_STM32_RCC_CFGR_I2SSRC_PLLI2S VALUE_(23,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_I2SSRC_EXT    VALUE_(23,1)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1PRE_MASK  MASK_(24,3)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1PRE_1     VALUE_(24,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1PRE_2     VALUE_(24,4)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1PRE_3     VALUE_(24,5)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1PRE_4     VALUE_(24,6)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO1PRE_5     VALUE_(24,7)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2PRE_MASK  MASK_(27,3)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2PRE_1     VALUE_(27,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2PRE_2     VALUE_(27,4)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2PRE_3     VALUE_(27,5)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2PRE_4     VALUE_(27,6)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2PRE_5     VALUE_(27,7)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2_MASK     MASK_(30,2)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2_SYSCLK   VALUE_(30,0)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2_PLLI2S   VALUE_(30,1)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2_HSE      VALUE_(30,2)
+#define CYGHWR_HAL_STM32_RCC_CFGR_MCO2_PLL      VALUE_(30,3)
+#endif
 
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_AFIO       BIT_(0)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPA       BIT_(2)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPB       BIT_(3)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPC       BIT_(4)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPD       BIT_(5)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPE       BIT_(6)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPF       BIT_(7)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPG       BIT_(8)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC1       BIT_(9)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC2       BIT_(10)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM1       BIT_(11)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_SPI1       BIT_(12)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM8       BIT_(13)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_UART1      BIT_(14)
-#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC3       BIT_(15)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_DMA1        (0)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_DMA2        (1)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_SRAM        (2)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_FLITF       (4)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_CRC         (6)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_FSMC        (8)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_SDIO        (10)
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_RCC_AHBENR_OTGFS       (12)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_ETHMAC      (14)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_ETHMACTX    (15)
+#define CYGHWR_HAL_STM32_RCC_AHBENR_ETHMACRX    (16)
+#endif
+
+// Note that the following are bit numbers, not masks. They should
+// either be used with the CYGHWR_HAL_STM32_CLOCK() macro or used to
+// shift a 1, perhaps using the BIT_() macro.
+//
+// Note that in the F2/F4 families, the bit positions in the LP registers are
+// the same.
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_AFIO       (0)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPA       (2)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPB       (3)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPC       (4)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPD       (5)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPE       (6)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPF       (7)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_IOPG       (8)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC1       (9)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC2       (10)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM1       (11)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_SPI1       (12)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM8       (13)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_UART1      (14)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC3       (15)
 
 
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM2       BIT_(0)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM3       BIT_(1)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM4       BIT_(2)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM5       BIT_(3)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM6       BIT_(4)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM7       BIT_(5)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_WWDG       BIT_(11)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_SPI2       BIT_(14)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_SPI3       BIT_(15)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART2      BIT_(17)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART3      BIT_(18)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART4      BIT_(19)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART5      BIT_(20)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C1       BIT_(21)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C2       BIT_(22)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_USB        BIT_(23)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_CAN        BIT_(25)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_BKP        BIT_(27)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_PWR        BIT_(28)
-#define CYGHWR_HAL_STM32_RCC_APB1ENR_DAC        BIT_(29)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM2       (0)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM3       (1)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM4       (2)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM5       (3)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM6       (4)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM7       (5)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_WWDG       (11)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_SPI2       (14)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_SPI3       (15)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART2      (17)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART3      (18)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART4      (19)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART5      (20)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C1       (21)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C2       (22)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_USB        (23)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_CAN1       (25)
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_CAN2       (26)
+#endif
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_BKP        (27)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_PWR        (28)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_DAC        (29)
+
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_RCC_CFGR2_PREDIV1(__x)     VALUE_(0,__x)
+#define CYGHWR_HAL_STM32_RCC_CFGR2_PREDIV2(__x)     VALUE_(4,__x)
+#define CYGHWR_HAL_STM32_RCC_CFGR2_PLL2MUL(__x)     VALUE_(8,__x)
+#define CYGHWR_HAL_STM32_RCC_CFGR2_PLL3MUL(__x)     VALUE_(12,__x)
+#define CYGHWR_HAL_STM32_RCC_CFGR2_PREDIV1SRC_HSE   0
+#define CYGHWR_HAL_STM32_RCC_CFGR2_PREDIV1SRC_PLL2  BIT_(16)
+#define CYGHWR_HAL_STM32_RCC_CFGR2_I2S2SRC_SYSCLK   0
+#define CYGHWR_HAL_STM32_RCC_CFGR2_I2S2SRC_PLL3     BIT_(17)
+#define CYGHWR_HAL_STM32_RCC_CFGR2_I2S3SRC_SYSCLK   0
+#define CYGHWR_HAL_STM32_RCC_CFGR2_I2S3SRC_PLL3     BIT_(18)
+#endif
+
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOA       (0)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOB       (1)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOC       (2)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOD       (3)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOE       (4)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOF       (5)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOG       (6)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOH       (7)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_GPIOI       (8)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_CRC        (12)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_BKPSRAM    (18)
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_CCMDATARAMEN (20)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_DMA1       (21)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_DMA2       (22)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_ETHMAC     (25)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_ETHMACTX   (26)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_ETHMACRX   (27)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_ETHMACPTP  (28)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_OTGHS      (29)
+#define CYGHWR_HAL_STM32_RCC_AHB1ENR_OTGHSULPI  (30)
 
-#define CYGHWR_HAL_STM32_RCC_CSR_LSION          BIT_(0)
-#define CYGHWR_HAL_STM32_RCC_CSR_LSIRDY         BIT_(1)
-#define CYGHWR_HAL_STM32_RCC_CSR_RMVF           BIT_(24)
-#define CYGHWR_HAL_STM32_RCC_CSR_PINRSTF        BIT_(26)
-#define CYGHWR_HAL_STM32_RCC_CSR_PORRSTF        BIT_(27)
-#define CYGHWR_HAL_STM32_RCC_CSR_SFTRSTF        BIT_(28)
-#define CYGHWR_HAL_STM32_RCC_CSR_IWDGRSTF       BIT_(29)
-#define CYGHWR_HAL_STM32_RCC_CSR_WWDGRSTF       BIT_(30)
-#define CYGHWR_HAL_STM32_RCC_CSR_LPWRRSTF       BIT_(31)
+#define CYGHWR_HAL_STM32_RCC_AHB2ENR_DCMI        (0)
+#define CYGHWR_HAL_STM32_RCC_AHB2ENR_CRYP        (4)
+#define CYGHWR_HAL_STM32_RCC_AHB2ENR_HASH        (5)
+#define CYGHWR_HAL_STM32_RCC_AHB2ENR_RNG         (6)
+#define CYGHWR_HAL_STM32_RCC_AHB2ENR_OTGFS       (7)
+
+#define CYGHWR_HAL_STM32_RCC_AHB3ENR_FSMC        (0)
+
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM2        (0)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM3        (1)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM4        (2)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM5        (3)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM6        (4)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM7        (5)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM12       (6)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM13       (7)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_TIM14       (8)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_WWDG       (11)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_SPI2       (14)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_SPI3       (15)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART2      (17)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART3      (18)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART4      (19)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_UART5      (20)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C1       (21)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C2       (22)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_I2C3       (23)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_CAN1       (25)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_CAN2       (26)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_PWR        (28)
+#define CYGHWR_HAL_STM32_RCC_APB1ENR_DAC        (29)
+
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM1        (0)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM8        (1)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_UART1       (4)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_UART6       (5)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC1        (8)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC2        (9)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_ADC3       (10)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_SDIO       (11)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_SPI1       (12)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_SYSCFG     (14)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM9       (16)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM10      (17)
+#define CYGHWR_HAL_STM32_RCC_APB2ENR_TIM11      (18)
+
+#endif
+
+// The following encodes the control register and clock bit number
+// into a 32 bit descriptor.
+#define CYGHWR_HAL_STM32_CLOCK( __reg, __pin )                  \
+            ((CYGHWR_HAL_STM32_RCC_##__reg##ENR) |              \
+             ((CYGHWR_HAL_STM32_RCC_##__reg##ENR_##__pin)<<16))
+
+// Macros to extract encoded values.
+#define CYGHWR_HAL_STM32_CLOCK_REG( __desc ) ((__desc)&0xFF)
+#define CYGHWR_HAL_STM32_CLOCK_PIN( __desc ) (((__desc)>>16)&0xFF)
+
+// Functions and macros to enable/disable clocks.
+
+__externC void hal_stm32_clock_enable( cyg_uint32 desc );
+__externC void hal_stm32_clock_disable( cyg_uint32 desc );
+
+#define CYGHWR_HAL_STM32_CLOCK_ENABLE( __desc ) hal_stm32_clock_enable( __desc )
+#define CYGHWR_HAL_STM32_CLOCK_DISABLE( __desc ) hal_stm32_clock_disable( __desc )
+
 
 #define CYGHWR_HAL_STM32_RCC_BDCR_LSEON         BIT_(0)
 #define CYGHWR_HAL_STM32_RCC_BDCR_LSERDY        BIT_(1)
@@ -257,9 +524,32 @@
 #define CYGHWR_HAL_STM32_RCC_BDCR_RTCEN         BIT_(15)
 #define CYGHWR_HAL_STM32_RCC_BDCR_BDRST         BIT_(16)
 
+#define CYGHWR_HAL_STM32_RCC_CSR_LSION          BIT_(0)
+#define CYGHWR_HAL_STM32_RCC_CSR_LSIRDY         BIT_(1)
+#define CYGHWR_HAL_STM32_RCC_CSR_RMVF           BIT_(24)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_RCC_CSR_BORRSTF        BIT_(25)
+#endif
+#define CYGHWR_HAL_STM32_RCC_CSR_PINRSTF        BIT_(26)
+#define CYGHWR_HAL_STM32_RCC_CSR_PORRSTF        BIT_(27)
+#define CYGHWR_HAL_STM32_RCC_CSR_SFTRSTF        BIT_(28)
+#define CYGHWR_HAL_STM32_RCC_CSR_IWDGRSTF       BIT_(29)
+#define CYGHWR_HAL_STM32_RCC_CSR_WWDGRSTF       BIT_(30)
+#define CYGHWR_HAL_STM32_RCC_CSR_LPWRRSTF       BIT_(31)
+
+
+// Miscellaneous clock control bits
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_CLOCK_BKP              CYGHWR_HAL_STM32_CLOCK( APB1, BKP )
+#endif
+
+#define CYGHWR_HAL_STM32_CLOCK_PWR              CYGHWR_HAL_STM32_CLOCK( APB1, PWR )
+
 //=============================================================================
 // Realtime Clock
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_RTC_CRH                0x00
 #define CYGHWR_HAL_STM32_RTC_CRL                0x04
 #define CYGHWR_HAL_STM32_RTC_PRLH               0x08
@@ -286,6 +576,190 @@
 #define CYGHWR_HAL_STM32_RTC_CRL_CNF            BIT_(4)
 #define CYGHWR_HAL_STM32_RTC_CRL_RTOFF          BIT_(5)
 
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_RTC_TR                 0x00
+#define CYGHWR_HAL_STM32_RTC_DR                 0x04
+#define CYGHWR_HAL_STM32_RTC_CR                 0x08
+#define CYGHWR_HAL_STM32_RTC_ISR                0x0C
+#define CYGHWR_HAL_STM32_RTC_PRER               0x10
+#define CYGHWR_HAL_STM32_RTC_WUTR               0x14
+#define CYGHWR_HAL_STM32_RTC_CALIBR             0x18
+#define CYGHWR_HAL_STM32_RTC_ALRMAR             0x1C
+#define CYGHWR_HAL_STM32_RTC_ALRMBR             0x20
+#define CYGHWR_HAL_STM32_RTC_WPR                0x24
+#define CYGHWR_HAL_STM32_RTC_TSTR               0x30
+#define CYGHWR_HAL_STM32_RTC_TSDR               0x34
+#define CYGHWR_HAL_STM32_RTC_TAFCR              0x40
+#define CYGHWR_HAL_STM32_RTC_BKxR(_x)           (0x50 + 4*(_x))
+
+#define CYGHWR_HAL_STM32_RTC_TR_SU              MASK_(0,4)
+#define CYGHWR_HAL_STM32_RTC_TR_SU_SHIFT        0
+#define CYGHWR_HAL_STM32_RTC_TR_ST              MASK_(4,3)
+#define CYGHWR_HAL_STM32_RTC_TR_ST_SHIFT        4
+#define CYGHWR_HAL_STM32_RTC_TR_MNU             MASK_(8,4)
+#define CYGHWR_HAL_STM32_RTC_TR_MNU_SHIFT       8
+#define CYGHWR_HAL_STM32_RTC_TR_MNT             MASK_(12,3)
+#define CYGHWR_HAL_STM32_RTC_TR_MNT_SHIFT       12
+#define CYGHWR_HAL_STM32_RTC_TR_HU              MASK_(16,4)
+#define CYGHWR_HAL_STM32_RTC_TR_HU_SHIFT        16
+#define CYGHWR_HAL_STM32_RTC_TR_HT              MASK_(20,2)
+#define CYGHWR_HAL_STM32_RTC_TR_HT_SHIFT        20
+#define CYGHWR_HAL_STM32_RTC_TR_AM              VALUE_(22, 0)
+#define CYGHWR_HAL_STM32_RTC_TR_PM              VALUE_(22, 1)
+
+#define CYGHWR_HAL_STM32_RTC_DR_DU              MASK_(0,4)
+#define CYGHWR_HAL_STM32_RTC_DR_DU_SHIFT        0
+#define CYGHWR_HAL_STM32_RTC_DR_DT              MASK_(4,2)
+#define CYGHWR_HAL_STM32_RTC_DR_DT_SHIFT        4
+#define CYGHWR_HAL_STM32_RTC_DR_MU              MASK_(8,4)
+#define CYGHWR_HAL_STM32_RTC_DR_MU_SHIFT        8
+#define CYGHWR_HAL_STM32_RTC_DR_MT              BIT_(12)
+#define CYGHWR_HAL_STM32_RTC_DR_MT_SHIFT        12
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_MON         VALUE_(13,1)
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_TUE         VALUE_(13,2)
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_WED         VALUE_(13,3)
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_THU         VALUE_(13,4)
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_FRI         VALUE_(13,5)
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_SAT         VALUE_(13,6)
+#define CYGHWR_HAL_STM32_RTC_DR_WDU_SUN         VALUE_(13,7)
+#define CYGHWR_HAL_STM32_RTC_DR_YU              MASK_(16,4)
+#define CYGHWR_HAL_STM32_RTC_DR_YU_SHIFT        16
+#define CYGHWR_HAL_STM32_RTC_DR_YT              MASK_(20,4)
+#define CYGHWR_HAL_STM32_RTC_DR_YT_SHIFT        20
+
+#define CYGHWR_HAL_STM32_RTC_CR_WUCKSEL_16      VALUE_(0,0)
+#define CYGHWR_HAL_STM32_RTC_CR_WUCKSEL_8       VALUE_(0,1)
+#define CYGHWR_HAL_STM32_RTC_CR_WUCKSEL_4       VALUE_(0,2)
+#define CYGHWR_HAL_STM32_RTC_CR_WUCKSEL_2       VALUE_(0,3)
+#define CYGHWR_HAL_STM32_RTC_CR_WUCKSEL_CK_SPRE VALUE_(0,4)
+#define CYGHWR_HAL_STM32_RTC_CR_WUCKSEL_CK_SPRE_PLUS_216 VALUE_(0,6)
+#define CYGHWR_HAL_STM32_RTC_CR_TSEDGE          BIT_(3)
+#define CYGHWR_HAL_STM32_RTC_CR_REFCKON         BIT_(4)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+#define CYGHWR_HAL_STM32_RTC_CR_BYPSHAD         BIT_(5)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4
+#define CYGHWR_HAL_STM32_RTC_CR_FMT             BIT_(6)
+#define CYGHWR_HAL_STM32_RTC_CR_DCE             BIT_(7)
+#define CYGHWR_HAL_STM32_RTC_CR_ALRAE           BIT_(8)
+#define CYGHWR_HAL_STM32_RTC_CR_ALRBE           BIT_(9)
+#define CYGHWR_HAL_STM32_RTC_CR_WUTE            BIT_(10)
+#define CYGHWR_HAL_STM32_RTC_CR_TSE             BIT_(11)
+#define CYGHWR_HAL_STM32_RTC_CR_ALRAIE          BIT_(12)
+#define CYGHWR_HAL_STM32_RTC_CR_ALRBIE          BIT_(13)
+#define CYGHWR_HAL_STM32_RTC_CR_WUTIE           BIT_(14)
+#define CYGHWR_HAL_STM32_RTC_CR_TSIE            BIT_(15)
+#define CYGHWR_HAL_STM32_RTC_CR_ADD1H           BIT_(16)
+#define CYGHWR_HAL_STM32_RTC_CR_SUB1H           BIT_(17)
+#define CYGHWR_HAL_STM32_RTC_CR_BKP             BIT_(18)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+#define CYGHWR_HAL_STM32_RTC_CR_COSEL           BIT_(19)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4
+#define CYGHWR_HAL_STM32_RTC_CR_POL             BIT_(20)
+#define CYGHWR_HAL_STM32_RTC_CR_OSEL_DISABLE    VALUE_(21, 0)
+#define CYGHWR_HAL_STM32_RTC_CR_OSEL_ALRAOE     VALUE_(21, 1)
+#define CYGHWR_HAL_STM32_RTC_CR_OSEL_ALRBOE     VALUE_(21, 2)
+#define CYGHWR_HAL_STM32_RTC_CR_OSEL_WUOE       VALUE_(21, 3)
+#define CYGHWR_HAL_STM32_RTC_CR_OSEL_COE        BIT_(23)
+
+#define CYGHWR_HAL_STM32_RTC_ISR_ALRAWF         BIT_(0)
+#define CYGHWR_HAL_STM32_RTC_ISR_ALRBWF         BIT_(1)
+#define CYGHWR_HAL_STM32_RTC_ISR_WUTWF          BIT_(2)
+#define CYGHWR_HAL_STM32_RTC_ISR_INITS          BIT_(4)
+#define CYGHWR_HAL_STM32_RTC_ISR_RSF            BIT_(5)
+#define CYGHWR_HAL_STM32_RTC_ISR_INITF          BIT_(6)
+#define CYGHWR_HAL_STM32_RTC_ISR_INIT           BIT_(7)
+#define CYGHWR_HAL_STM32_RTC_ISR_ALRAF          BIT_(8)
+#define CYGHWR_HAL_STM32_RTC_ISR_ALRBF          BIT_(9)
+#define CYGHWR_HAL_STM32_RTC_ISR_WUTF           BIT_(10)
+#define CYGHWR_HAL_STM32_RTC_ISR_TSF            BIT_(11)
+#define CYGHWR_HAL_STM32_RTC_ISR_TSOVF          BIT_(12)
+#define CYGHWR_HAL_STM32_RTC_ISR_TAMP1F         BIT_(13)
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F2)
+#define CYGHWR_HAL_STM32_RTC_PRER_PREDIV_S      MASK_(0,13)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+#define CYGHWR_HAL_STM32_RTC_ISR_SHPF           BIT_(3)
+#define CYGHWR_HAL_STM32_RTC_ISR_TAMP2F         BIT_(14)
+#define CYGHWR_HAL_STM32_RTC_ISR_RECALPF        BIT_(16)
+#define CYGHWR_HAL_STM32_RTC_PRER_PREDIV_S      MASK_(0,15)
+#endif
+#define CYGHWR_HAL_STM32_RTC_PRER_PREDIV_A      MASK_(16,7)
+
+// RTC_WUTR defines omitted
+// RTC_CALIBR defines omitted
+// RTC_ALRMAR defines omitted
+// RTC_ALRMBR defines omitted
+
+#define CYGHWR_HAL_STM32_RTC_WPR_KEY            MASK_(0,8)
+#define CYGHWR_HAL_STM32_RTC_WPR_KEY1           0xCA
+#define CYGHWR_HAL_STM32_RTC_WPR_KEY2           0x53
+
+// RTC_TSTR defines omitted, but layout identical to RTC_TR
+// RTC_TSDR defines omitted, but layout identical to RTC_DR except for omission of year fields
+// RTC_TAFCR defines omitted
+// No relevant RTC_BKPxR defines.
+
+// RCC clock is selected within wallclock driver, so no define here.
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+
+//=============================================================================
+// System configuration controller - F2 and F4 only
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+// Register offsets
+#define CYGHWR_HAL_STM32_SYSCFG_MEMRMP          0x00
+#define CYGHWR_HAL_STM32_SYSCFG_PMC             0x04
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICR1         0x08
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICR2         0x0C
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICR3         0x10
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICR4         0x14
+#define CYGHWR_HAL_STM32_SYSCFG_CMPCR           0x20
+
+// Register definitions
+
+#define CYGHWR_HAL_STM32_SYSCFG_MEMRMP_MAINFLASH VALUE_(0,0)
+#define CYGHWR_HAL_STM32_SYSCFG_MEMRMP_SYSFLASH  VALUE_(0,1)
+#define CYGHWR_HAL_STM32_SYSCFG_MEMRMP_FSMC1     VALUE_(0,2)
+#define CYGHWR_HAL_STM32_SYSCFG_MEMRMP_SRAM      VALUE_(0,3)
+
+#define CYGHWR_HAL_STM32_SYSCFG_PMC_MII          VALUE_(23,0)
+#define CYGHWR_HAL_STM32_SYSCFG_PMC_RMII         VALUE_(23,1)
+
+// FIXME: The below EXTI bits should be merged with the F1 defines in
+// var_io_pins.h to provide a common interface
+
+// The following macro allows the four EXTICR registers to be indexed
+// as CYGHWR_HAL_STM32_SYSCFG_EXTICR(1) to CYGHWR_HAL_STM32_SYSCFG_EXTICR(4)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICR(__x)      (4*((__x)-1)+0x08)
+
+// The following macros are used to generate the bitfields for setting up
+// external interrupts.  For example, CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTC(12)
+// will generate the bitfield which when ORed into the EXTICR4 register will
+// set up C12 as the external interrupt pin for the EXTI12 interrupt.
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTA(__x) VALUE_(4*((__x)&3),0)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTB(__x) VALUE_(4*((__x)&3),1)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTC(__x) VALUE_(4*((__x)&3),2)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTD(__x) VALUE_(4*((__x)&3),3)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTE(__x) VALUE_(4*((__x)&3),4)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTF(__x) VALUE_(4*((__x)&3),5)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTG(__x) VALUE_(4*((__x)&3),6)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_PORTH(__x) VALUE_(4*((__x)&3),7)
+#define CYGHWR_HAL_STM32_SYSCFG_EXTICRX_MASK(__x)  VALUE_(4*((__x)&3),0xF)
+
+#define CYGHWR_HAL_STM32_SYSCFG_CMPCR_CMP_DIS      VALUE_(0,0)
+#define CYGHWR_HAL_STM32_SYSCFG_CMPCR_CMP_ENA      VALUE_(0,1)
+#define CYGHWR_HAL_STM32_SYSCFG_CMPCR_READY        BIT_(8)
+
+// SYSCFG clock control
+
+#define CYGHWR_HAL_STM32_SYSCFG_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB2, SYSCFG )
+
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+
 //=============================================================================
 // External interrupt controller
 
@@ -299,162 +773,44 @@
 #define CYGHWR_HAL_STM32_EXTI_BIT(__b)          BIT_(__b)
 
 //=============================================================================
-// GPIO ports
-
-#define CYGHWR_HAL_STM32_GPIO_CRL               0x00
-#define CYGHWR_HAL_STM32_GPIO_CRH               0x04
-#define CYGHWR_HAL_STM32_GPIO_IDR               0x08
-#define CYGHWR_HAL_STM32_GPIO_ODR               0x0C
-#define CYGHWR_HAL_STM32_GPIO_BSRR              0x10
-#define CYGHWR_HAL_STM32_GPIO_BRR               0x14
-#define CYGHWR_HAL_STM32_GPIO_LCKR              0x18
-
-#define CYGHWR_HAL_STM32_GPIO_MODE_IN           VALUE_(0,0)     // Input mode
-#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_10MHZ    VALUE_(0,1)     // Output mode, max 10MHz
-#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_2MHZ     VALUE_(0,2)     // Output mode, max 2MHz
-#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_50MHZ    VALUE_(0,3)     // Output mode, max 50MHz
-
-#define CYGHWR_HAL_STM32_GPIO_CNF_AIN           VALUE_(2,0)     // Analog input
-#define CYGHWR_HAL_STM32_GPIO_CNF_FIN           VALUE_(2,1)     // Floating input
-#define CYGHWR_HAL_STM32_GPIO_CNF_PULL          VALUE_(2,2)     // Input with pull up/down
-#define CYGHWR_HAL_STM32_GPIO_CNF_RESV          VALUE_(2,3)     // Reserved
-
-#define CYGHWR_HAL_STM32_GPIO_CNF_GPOPP         VALUE_(2,0)     // GP output push/pull
-#define CYGHWR_HAL_STM32_GPIO_CNF_GPOOD         VALUE_(2,1)     // GP output open drain
-#define CYGHWR_HAL_STM32_GPIO_CNF_AOPP          VALUE_(2,2)     // Alt output push/pull
-#define CYGHWR_HAL_STM32_GPIO_CNF_AOOD          VALUE_(2,3)     // Alt output open drain
-
-
-// Alternative, more readable, config names
-// Inputs
-#define CYGHWR_HAL_STM32_GPIO_CNF_ANALOG        CYGHWR_HAL_STM32_GPIO_CNF_AIN
-#define CYGHWR_HAL_STM32_GPIO_CNF_FLOATING      CYGHWR_HAL_STM32_GPIO_CNF_FIN
-#define CYGHWR_HAL_STM32_GPIO_CNF_PULLDOWN      (CYGHWR_HAL_STM32_GPIO_CNF_PULL)
-#define CYGHWR_HAL_STM32_GPIO_CNF_PULLUP        (CYGHWR_HAL_STM32_GPIO_CNF_PULL|CYGHWR_HAL_STM32_GPIO_PULLUP)
-// Outputs
-#define CYGHWR_HAL_STM32_GPIO_CNF_OUT_OPENDRAIN CYGHWR_HAL_STM32_GPIO_CNF_GPOOD
-#define CYGHWR_HAL_STM32_GPIO_CNF_OUT_PUSHPULL  CYGHWR_HAL_STM32_GPIO_CNF_GPOPP
-#define CYGHWR_HAL_STM32_GPIO_CNF_ALT_OPENDRAIN CYGHWR_HAL_STM32_GPIO_CNF_AOOD
-#define CYGHWR_HAL_STM32_GPIO_CNF_ALT_PUSHPULL  CYGHWR_HAL_STM32_GPIO_CNF_AOPP
-
-
-// This macro packs the port number, bit number, mode and
-// configuration for a GPIO pin into a single word. The packing puts
-// the mode and config in the ls 5 bits, the bit number in 16:20 and
-// the offset of the GPIO port from GPIOA in bits 8:15. The port, mode
-// and config are only specified using the last component of the names
-// to keep definitions short.
-
-#define CYGHWR_HAL_STM32_GPIO(__port, __bit, __mode, __cnf )            \
-            ((CYGHWR_HAL_STM32_GPIO##__port - CYGHWR_HAL_STM32_GPIOA) | \
-             (__bit<<16) |                                              \
-             (CYGHWR_HAL_STM32_GPIO_MODE_##__mode) |                    \
-             (CYGHWR_HAL_STM32_GPIO_CNF_##__cnf))
-
-// Macros to extract encoded values
-#define CYGHWR_HAL_STM32_GPIO_PORT(__pin)       (CYGHWR_HAL_STM32_GPIOA+((__pin)&0x0000FF00))
-#define CYGHWR_HAL_STM32_GPIO_BIT(__pin)        (((__pin)>>16)&0x1F)
-#define CYGHWR_HAL_STM32_GPIO_CFG(__pin)        ((__pin)&0xF)
-#define CYGHWR_HAL_STM32_GPIO_PULLUP            BIT_(4)
-
-
-#define CYGHWR_HAL_STM32_GPIO_NONE      (0xFFFFFFFF)
-
-// Functions and macros to configure GPIO ports.
-
-__externC void hal_stm32_gpio_set( cyg_uint32 pin );
-__externC void hal_stm32_gpio_out( cyg_uint32 pin, int val );
-__externC void hal_stm32_gpio_in ( cyg_uint32 pin, int *val );
-
-#define CYGHWR_HAL_STM32_GPIO_SET(__pin ) hal_stm32_gpio_set( __pin )
-#define CYGHWR_HAL_STM32_GPIO_OUT(__pin, __val ) hal_stm32_gpio_out( __pin, __val )
-#define CYGHWR_HAL_STM32_GPIO_IN(__pin,  __val ) hal_stm32_gpio_in( __pin, __val )
-
-//=============================================================================
-// Alternate I/O configuration registers.
-
-#define CYGHWR_HAL_STM32_AFIO_EVCR              0x00
-#define CYGHWR_HAL_STM32_AFIO_MAPR              0x04
-#define CYGHWR_HAL_STM32_AFIO_EXTICR1           0x08
-#define CYGHWR_HAL_STM32_AFIO_EXTICR2           0x0C
-#define CYGHWR_HAL_STM32_AFIO_EXTICR3           0x10
-#define CYGHWR_HAL_STM32_AFIO_EXTICR4           0x14
-
-// The following macro allows the four ETXICR registers to be indexed
-// as CYGHWR_HAL_STM32_AFIO_EXTICR(1) to CYGHWR_HAL_STM32_AFIO_EXTICR(4)
-#define CYGHWR_HAL_STM32_AFIO_EXTICR(__x)       (4*((__x)-1)+0x08)
-
-#define CYGHWR_HAL_STM32_AFIO_EVCR_PIN(__x)     VALUE_(0,(__x))
-#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTA        VALUE_(4,0) 
-#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTB        VALUE_(4,1) 
-#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTC        VALUE_(4,2) 
-#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTD        VALUE_(4,3) 
-#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTE        VALUE_(4,4)
-#define CYGHWR_HAL_STM32_AFIO_EVCR_EVOE         BIT_(7) 
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_SPI1_RMP     BIT_(0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_I2C1_RMP     BIT_(1)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_URT1_RMP     BIT_(2)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_URT2_RMP     BIT_(3)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_URT3_NO_RMP  VALUE_(4,0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_URT3_P1_RMP  VALUE_(4,1)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_URT3_FL_RMP  VALUE_(4,3)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM1_NO_RMP  VALUE_(6,0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM1_P1_RMP  VALUE_(6,1)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM1_FL_RMP  VALUE_(6,3)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_NO_RMP  VALUE_(8,0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_P1_RMP  VALUE_(8,1)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_P2_RMP  VALUE_(8,2)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_FL_RMP  VALUE_(8,3)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM3_NO_RMP  VALUE_(10,0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM3_P2_RMP  VALUE_(10,2)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM3_FL_RMP  VALUE_(10,3)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM4_RMP     BIT_(12)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN_NO_RMP   VALUE_(13,0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN_FL1_RMP  VALUE_(13,2)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN_FL2_RMP  VALUE_(13,3)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_PD01_RMP     BIT_(15)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM5CH4_RMP  BIT_(16)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC1EINJ_RMP BIT_(17)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC1EREG_RMP BIT_(18)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC2EINJ_RMP BIT_(19)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC2EREG_RMP BIT_(20)
-
-#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_FULL     VALUE_(24,0)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_NORST    VALUE_(24,1)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_SWDPEN   VALUE_(24,2)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_SWDPDIS  VALUE_(24,4)
-#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_MASK     VALUE_(24,7)
-
-// The following macros are used to generate the bitfields for setting up
-// external interrupts.  For example, CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTC(12)
-// will generate the bitfield which when ORed into the EXTICR4 register will
-// set up C12 as the external interrupt pin for the EXTI12 interrupt.
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTA(__x) VALUE_(4*((__x)&3),0)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTB(__x) VALUE_(4*((__x)&3),1)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTC(__x) VALUE_(4*((__x)&3),2)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTD(__x) VALUE_(4*((__x)&3),3)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTE(__x) VALUE_(4*((__x)&3),4)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTF(__x) VALUE_(4*((__x)&3),5)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTG(__x) VALUE_(4*((__x)&3),6)
-#define CYGHWR_HAL_STM32_AFIO_EXTICRX_MASK(__x)  VALUE_(4*((__x)&3),0xF)
+// GPIO ports and pin configuration. Include separate header file for this
+// to avoid this header getting unmanageable.
+#include <cyg/hal/var_io_pins.h>
 
 //=============================================================================
 // DMA controller register definitions.
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
 #define CYGHWR_HAL_STM32_DMA_ISR                0x00
 #define CYGHWR_HAL_STM32_DMA_IFCR               0x04
 
+#define CYGHWR_HAL_STM32_DMA_ISR_REG(__chan)    CYGHWR_HAL_STM32_DMA_ISR
+#define CYGHWR_HAL_STM32_DMA_IFCR_REG(__chan)   CYGHWR_HAL_STM32_DMA_IFCR
+
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_DMA_LISR               0x00
+#define CYGHWR_HAL_STM32_DMA_HISR               0x04
+#define CYGHWR_HAL_STM32_DMA_LIFCR              0x08
+#define CYGHWR_HAL_STM32_DMA_HIFCR              0x0C
+
+#define CYGHWR_HAL_STM32_DMA_ISR_REG(__stream)  ((__stream)>3 ?               \
+                                                 CYGHWR_HAL_STM32_DMA_HISR :  \
+                                                 CYGHWR_HAL_STM32_DMA_LISR)
+#define CYGHWR_HAL_STM32_DMA_IFCR_REG(__stream) ((__stream)>3 ?               \
+                                                 CYGHWR_HAL_STM32_DMA_HIFCR : \
+                                                 CYGHWR_HAL_STM32_DMA_LIFCR)
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+
 // The following macros allow access to the per-channel DMA registers, indexed
-// by channel number.  Valid channel numbers are 1 to 7 for DMA1 and 1 to 5
-// for DMA2.
+// by channel number. For F1 parts there is no concept of a stream - each entry
+// has a fixed relationship to the corresponding channel.
+// Valid channel/stream numbers are 1 to 7 for DMA1 and 1 to 5 for DMA2 on F1
+// parts, 1 to 7 for DMA2 streams on F2/F4 parts.
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_DMA_CCR(__x)           (0x14*(__x)-0x0C)
 #define CYGHWR_HAL_STM32_DMA_CNDTR(__x)         (0x14*(__x)-0x08)
 #define CYGHWR_HAL_STM32_DMA_CPAR(__x)          (0x14*(__x)-0x04)
@@ -471,6 +827,51 @@
 #define CYGHWR_HAL_STM32_DMA_IFCR_CHTIF(__x)    BIT_(4*(__x)-2)
 #define CYGHWR_HAL_STM32_DMA_IFCR_CTEIF(__x)    BIT_(4*(__x)-1)
 #define CYGHWR_HAL_STM32_DMA_IFCR_MASK(__x)     VALUE_(4*(__x)-4,0xF)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_DMA_SCR(__x)           (0x18*(__x)+0x10)
+#define CYGHWR_HAL_STM32_DMA_SNDTR(__x)         (0x18*(__x)+0x14)
+#define CYGHWR_HAL_STM32_DMA_SPAR(__x)          (0x18*(__x)+0x18)
+#define CYGHWR_HAL_STM32_DMA_SM0AR(__x)         (0x18*(__x)+0x1C)
+#define CYGHWR_HAL_STM32_DMA_SM1AR(__x)         (0x18*(__x)+0x20)
+#define CYGHWR_HAL_STM32_DMA_SFCR(__x)          (0x18*(__x)+0x24)
+
+// For now at least we implement an identity mapping between
+// streams and channels.
+#define CYGHWR_HAL_STM32_DMA_CCR(__x)           CYGHWR_HAL_STM32_DMA_SCR(__x)
+#define CYGHWR_HAL_STM32_DMA_CNDTR(__x)         CYGHWR_HAL_STM32_DMA_SNDTR(__x)
+#define CYGHWR_HAL_STM32_DMA_CPAR(__x)          CYGHWR_HAL_STM32_DMA_SPAR(__x)
+#define CYGHWR_HAL_STM32_DMA_CMAR(__x)          CYGHWR_HAL_STM32_DMA_SM0AR(__x)
+#define CYGHWR_HAL_STM32_DMA_CM0AR(__x)         CYGHWR_HAL_STM32_DMA_SM0AR(__x)
+#define CYGHWR_HAL_STM32_DMA_CM1AR(__x)         CYGHWR_HAL_STM32_DMA_SM1AR(__x)
+
+// This selects which region of an isr register to use for a stream
+#define CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x)  ( ((__x)&0x3) == 3 ? 22 : \
+                                               ((__x)&0x3) == 2 ? 16 : \
+                                               ((__x)&0x3) == 1 ? 6 : 0 )
+    
+#define CYGHWR_HAL_STM32_DMA_ISR_FEIF(__x)      BIT_( CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x) )
+#define CYGHWR_HAL_STM32_DMA_ISR_DMEIF(__x)     BIT_( CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x) + 2 )
+#define CYGHWR_HAL_STM32_DMA_ISR_TEIF(__x)      BIT_( CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x) + 3 )
+#define CYGHWR_HAL_STM32_DMA_ISR_HTIF(__x)      BIT_( CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x) + 4 )
+#define CYGHWR_HAL_STM32_DMA_ISR_TCIF(__x)      BIT_( CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x) + 5 )
+
+#define CYGHWR_HAL_STM32_DMA_ISR_MASK(__x)      VALUE_( CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x), 0x3f )
+
+// This selects which region of an ifcr register to use for a stream.
+// Happens to be laid out the same as the isr, so reuse.
+#define CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x)    CYGHWR_HAL_STM32_DMA_ISR_SHIFT(__x)
+
+#define CYGHWR_HAL_STM32_DMA_IFCR_CFEIF(__x)    BIT_( CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x) )
+#define CYGHWR_HAL_STM32_DMA_IFCR_CDMEIF(__x)   BIT_( CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x) + 2 )
+#define CYGHWR_HAL_STM32_DMA_IFCR_CTEIF(__x)    BIT_( CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x) + 3 )
+#define CYGHWR_HAL_STM32_DMA_IFCR_CHTIF(__x)    BIT_( CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x) + 4 )
+#define CYGHWR_HAL_STM32_DMA_IFCR_CTCIF(__x)    BIT_( CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x) + 5 )
+#define CYGHWR_HAL_STM32_DMA_IFCR_MASK(__x)     VALUE_( CYGHWR_HAL_STM32_DMA_IFCR_SHIFT(__x), 0x3f )
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 
 #define CYGHWR_HAL_STM32_DMA_CCR_EN             BIT_(0)
 #define CYGHWR_HAL_STM32_DMA_CCR_TCIE           BIT_(1)
@@ -486,126 +887,86 @@
 #define CYGHWR_HAL_STM32_DMA_CCR_MSIZE8         VALUE_(10,0)
 #define CYGHWR_HAL_STM32_DMA_CCR_MSIZE16        VALUE_(10,1)
 #define CYGHWR_HAL_STM32_DMA_CCR_MSIZE32        VALUE_(10,2)
+#define CYGHWR_HAL_STM32_DMA_CCR_PL(__x)        VALUE_(12,__x)
 #define CYGHWR_HAL_STM32_DMA_CCR_PLLOW          VALUE_(12,0)
 #define CYGHWR_HAL_STM32_DMA_CCR_PLMEDIUM       VALUE_(12,1)
 #define CYGHWR_HAL_STM32_DMA_CCR_PLHIGH         VALUE_(12,2)
 #define CYGHWR_HAL_STM32_DMA_CCR_PLMAX          VALUE_(12,3)
 #define CYGHWR_HAL_STM32_DMA_CCR_MEM2MEM        BIT_(14)
 
+// F2/F4 compatibility combinations to control transfer source/dest
+#define CYGHWR_HAL_STM32_DMA_CCR_P2MEM          0
+#define CYGHWR_HAL_STM32_DMA_CCR_MEM2P          CYGHWR_HAL_STM32_DMA_CCR_DIR
+
+// Clock enable bits
+
+#define CYGHWR_HAL_STM32_DMA1_CLOCK             CYGHWR_HAL_STM32_CLOCK( AHB, DMA1 )
+#define CYGHWR_HAL_STM32_DMA2_CLOCK             CYGHWR_HAL_STM32_CLOCK( AHB, DMA2 )
+
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_DMA_CCR_EN             BIT_(0)
+#define CYGHWR_HAL_STM32_DMA_CCR_DMEIE          BIT_(1)
+#define CYGHWR_HAL_STM32_DMA_CCR_TEIE           BIT_(2)
+#define CYGHWR_HAL_STM32_DMA_CCR_HTIE           BIT_(3)
+#define CYGHWR_HAL_STM32_DMA_CCR_TCIE           BIT_(4)
+#define CYGHWR_HAL_STM32_DMA_CCR_PFCTRL         BIT_(5)
+#define CYGHWR_HAL_STM32_DMA_CCR_P2MEM          VALUE_(6,0)
+#define CYGHWR_HAL_STM32_DMA_CCR_MEM2P          VALUE_(6,1)
+#define CYGHWR_HAL_STM32_DMA_CCR_MEM2MEM        VALUE_(6,2)
+
+#define CYGHWR_HAL_STM32_DMA_CCR_CIRC           BIT_(8)
+#define CYGHWR_HAL_STM32_DMA_CCR_PINC           BIT_(9)
+#define CYGHWR_HAL_STM32_DMA_CCR_MINC           BIT_(10)
+#define CYGHWR_HAL_STM32_DMA_CCR_PSIZE8         VALUE_(11,0)
+#define CYGHWR_HAL_STM32_DMA_CCR_PSIZE16        VALUE_(11,1)
+#define CYGHWR_HAL_STM32_DMA_CCR_PSIZE32        VALUE_(11,2)
+#define CYGHWR_HAL_STM32_DMA_CCR_MSIZE8         VALUE_(13,0)
+#define CYGHWR_HAL_STM32_DMA_CCR_MSIZE16        VALUE_(13,1)
+#define CYGHWR_HAL_STM32_DMA_CCR_MSIZE32        VALUE_(13,2)
+#define CYGHWR_HAL_STM32_DMA_CCR_PINCOS         BIT_(15)
+#define CYGHWR_HAL_STM32_DMA_CCR_PL(__x)        VALUE_(16,__x)
+#define CYGHWR_HAL_STM32_DMA_CCR_PLLOW          VALUE_(16,0)
+#define CYGHWR_HAL_STM32_DMA_CCR_PLMEDIUM       VALUE_(16,1)
+#define CYGHWR_HAL_STM32_DMA_CCR_PLHIGH         VALUE_(16,2)
+#define CYGHWR_HAL_STM32_DMA_CCR_PLMAX          VALUE_(16,3)
+#define CYGHWR_HAL_STM32_DMA_CCR_DBM            BIT_(18)
+#define CYGHWR_HAL_STM32_DMA_CCR_CT             BIT_(19)
+#define CYGHWR_HAL_STM32_DMA_CCR_PBURST1        VALUE_(21,0)
+#define CYGHWR_HAL_STM32_DMA_CCR_PBURST4        VALUE_(21,1)
+#define CYGHWR_HAL_STM32_DMA_CCR_PBURST8        VALUE_(21,2)
+#define CYGHWR_HAL_STM32_DMA_CCR_PBURST16       VALUE_(21,3)
+#define CYGHWR_HAL_STM32_DMA_CCR_MBURST1        VALUE_(23,0)
+#define CYGHWR_HAL_STM32_DMA_CCR_MBURST4        VALUE_(23,1)
+#define CYGHWR_HAL_STM32_DMA_CCR_MBURST8        VALUE_(23,2)
+#define CYGHWR_HAL_STM32_DMA_CCR_MBURST16       VALUE_(23,3)
+#define CYGHWR_HAL_STM32_DMA_CCR_CHSEL(__x)     VALUE_(25,__x)
+
+#define CYGHWR_HAL_STM32_DMA_FCR_FTH_QUARTER    VALUE_(0,0) // FIFO threshold selection
+#define CYGHWR_HAL_STM32_DMA_FCR_FTH_HALF       VALUE_(0,1)
+#define CYGHWR_HAL_STM32_DMA_FCR_FTH_3QUARTER   VALUE_(0,2)
+#define CYGHWR_HAL_STM32_DMA_FCR_FTH_FULL       VALUE_(0,3)
+#define CYGHWR_HAL_STM32_DMA_FCR_DMDIS          BIT_(2)
+#define CYGHWR_HAL_STM32_DMA_FCR_FS_LTQUARTER   VALUE_(3,0) // LT==less than
+#define CYGHWR_HAL_STM32_DMA_FCR_FS_LTHALF      VALUE_(3,1)
+#define CYGHWR_HAL_STM32_DMA_FCR_FS_LT3QUARTER  VALUE_(3,2)
+#define CYGHWR_HAL_STM32_DMA_FCR_FS_LTFULL      VALUE_(3,3)
+#define CYGHWR_HAL_STM32_DMA_FCR_FS_EMPTY       VALUE_(3,4)
+#define CYGHWR_HAL_STM32_DMA_FCR_FS_FULL        VALUE_(3,5)
+#define CYGHWR_HAL_STM32_DMA_FCR_FEIE           BIT_(7)
+
+// Clock enable bits
+
+#define CYGHWR_HAL_STM32_DMA1_CLOCK             CYGHWR_HAL_STM32_CLOCK( AHB1, DMA1 )
+#define CYGHWR_HAL_STM32_DMA2_CLOCK             CYGHWR_HAL_STM32_CLOCK( AHB1, DMA2 )
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
 //=============================================================================
 // UARTs
-
-#define CYGHWR_HAL_STM32_UART_SR                0x00
-#define CYGHWR_HAL_STM32_UART_DR                0x04
-#define CYGHWR_HAL_STM32_UART_BRR               0x08
-#define CYGHWR_HAL_STM32_UART_CR1               0x0C
-#define CYGHWR_HAL_STM32_UART_CR2               0x10
-#define CYGHWR_HAL_STM32_UART_CR3               0x14
-#define CYGHWR_HAL_STM32_UART_GTPR              0x18
-
-// SR Bits
-
-#define CYGHWR_HAL_STM32_UART_SR_PE             BIT_(0)
-#define CYGHWR_HAL_STM32_UART_SR_FE             BIT_(1)
-#define CYGHWR_HAL_STM32_UART_SR_NE             BIT_(2)
-#define CYGHWR_HAL_STM32_UART_SR_ORE            BIT_(3)
-#define CYGHWR_HAL_STM32_UART_SR_IDLE           BIT_(4)
-#define CYGHWR_HAL_STM32_UART_SR_RXNE           BIT_(5)
-#define CYGHWR_HAL_STM32_UART_SR_TC             BIT_(6)
-#define CYGHWR_HAL_STM32_UART_SR_TXE            BIT_(7)
-#define CYGHWR_HAL_STM32_UART_SR_LBD            BIT_(8)
-#define CYGHWR_HAL_STM32_UART_SR_CTS            BIT_(9)
-
-// BRR bits
-
-#define CYGHWR_HAL_STM32_UART_DR_DIVF(__f)      VALUE_(0,__f)
-#define CYGHWR_HAL_STM32_UART_DR_DIVM(__m)      VALUE_(4,__m)
-
-// CR1 bits
-
-#define CYGHWR_HAL_STM32_UART_CR1_SBK           BIT_(0)
-#define CYGHWR_HAL_STM32_UART_CR1_RWU           BIT_(1)
-#define CYGHWR_HAL_STM32_UART_CR1_RE            BIT_(2)
-#define CYGHWR_HAL_STM32_UART_CR1_TE            BIT_(3)
-#define CYGHWR_HAL_STM32_UART_CR1_IDLEIE        BIT_(4)
-#define CYGHWR_HAL_STM32_UART_CR1_RXNEIE        BIT_(5)
-#define CYGHWR_HAL_STM32_UART_CR1_TCIE          BIT_(6)
-#define CYGHWR_HAL_STM32_UART_CR1_TXEIE         BIT_(7)
-#define CYGHWR_HAL_STM32_UART_CR1_PEIE          BIT_(8)
-#define CYGHWR_HAL_STM32_UART_CR1_PS_EVEN       0
-#define CYGHWR_HAL_STM32_UART_CR1_PS_ODD        BIT_(9)
-#define CYGHWR_HAL_STM32_UART_CR1_PCE           BIT_(10)
-#define CYGHWR_HAL_STM32_UART_CR1_WAKE          BIT_(11)
-#define CYGHWR_HAL_STM32_UART_CR1_M_8           0
-#define CYGHWR_HAL_STM32_UART_CR1_M_9           BIT_(12)
-#define CYGHWR_HAL_STM32_UART_CR1_UE            BIT_(13)
-
-// CR2 bits
+// Include separate header file for this to avoid this header getting unmanageable.
 
-#define CYGHWR_HAL_STM32_UART_CR2_ADD(__a)      VALUE_(0,__a)
-#define CYGHWR_HAL_STM32_UART_CR2_LBDL          BIT_(5)
-#define CYGHWR_HAL_STM32_UART_CR2_LBDIE         BIT_(6)
-#define CYGHWR_HAL_STM32_UART_CR2_LBCL          BIT_(8)
-#define CYGHWR_HAL_STM32_UART_CR2_CPHA          BIT_(9)
-#define CYGHWR_HAL_STM32_UART_CR2_CPOL          BIT_(10)
-#define CYGHWR_HAL_STM32_UART_CR2_CLKEN         BIT_(11)
-#define CYGHWR_HAL_STM32_UART_CR2_STOP_1        VALUE_(12,0)
-#define CYGHWR_HAL_STM32_UART_CR2_STOP_0_5      VALUE_(12,1)
-#define CYGHWR_HAL_STM32_UART_CR2_STOP_2        VALUE_(12,2)
-#define CYGHWR_HAL_STM32_UART_CR2_STOP_1_5      VALUE_(12,3)
-#define CYGHWR_HAL_STM32_UART_CR2_LINEN         BIT_(14)
-
-// CR3 bits
-
-#define CYGHWR_HAL_STM32_UART_CR3_EIE           BIT_(0)
-#define CYGHWR_HAL_STM32_UART_CR3_IREN          BIT_(1)
-#define CYGHWR_HAL_STM32_UART_CR3_IRLP          BIT_(2)
-#define CYGHWR_HAL_STM32_UART_CR3_HDSEL         BIT_(3)
-#define CYGHWR_HAL_STM32_UART_CR3_NACK          BIT_(4)
-#define CYGHWR_HAL_STM32_UART_CR3_SCEN          BIT_(5)
-#define CYGHWR_HAL_STM32_UART_CR3_DMAR          BIT_(6)
-#define CYGHWR_HAL_STM32_UART_CR3_DMAT          BIT_(7)
-#define CYGHWR_HAL_STM32_UART_CR3_RTSE          BIT_(8)
-#define CYGHWR_HAL_STM32_UART_CR3_CTSE          BIT_(9)
-#define CYGHWR_HAL_STM32_UART_CR3_CTSIE         BIT_(10)
-
-// GTPR fields
-
-#define CYGHWR_HAL_STM32_UART_GTPR_PSC(__p)     VALUE_(0,__p)
-#define CYGHWR_HAL_STM32_UART_GTPR_GT(__g)      VALUE_(8,__g)
-
-// UART GPIO pins
-
-#define CYGHWR_HAL_STM32_UART1_RX               CYGHWR_HAL_STM32_GPIO( A, 10, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART1_TX               CYGHWR_HAL_STM32_GPIO( A,  9, OUT_50MHZ , ALT_PUSHPULL  )
-#define CYGHWR_HAL_STM32_UART1_CTS              CYGHWR_HAL_STM32_GPIO( A, 11, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART1_RTS              CYGHWR_HAL_STM32_GPIO( A, 12, OUT_50MHZ , OUT_PUSHPULL  )
-
-#define CYGHWR_HAL_STM32_UART2_RX               CYGHWR_HAL_STM32_GPIO( A,  3, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART2_TX               CYGHWR_HAL_STM32_GPIO( A,  2, OUT_50MHZ , ALT_PUSHPULL  )
-#define CYGHWR_HAL_STM32_UART2_CTS              CYGHWR_HAL_STM32_GPIO( A,  0, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART2_RTS              CYGHWR_HAL_STM32_GPIO( A,  1, OUT_50MHZ , OUT_PUSHPULL  )
-
-#define CYGHWR_HAL_STM32_UART3_RX               CYGHWR_HAL_STM32_GPIO( B, 11, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART3_TX               CYGHWR_HAL_STM32_GPIO( B, 10, OUT_50MHZ , ALT_PUSHPULL  )
-#define CYGHWR_HAL_STM32_UART3_CTS              CYGHWR_HAL_STM32_GPIO( B, 13, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART3_RTS              CYGHWR_HAL_STM32_GPIO( B, 14, OUT_50MHZ , OUT_PUSHPULL  )
-
-#define CYGHWR_HAL_STM32_UART4_RX               CYGHWR_HAL_STM32_GPIO( C, 11, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART4_TX               CYGHWR_HAL_STM32_GPIO( C, 10, OUT_50MHZ , ALT_PUSHPULL  )
-#define CYGHWR_HAL_STM32_UART4_CTS              CYGHWR_HAL_STM32_GPIO_NONE
-#define CYGHWR_HAL_STM32_UART4_RTS              CYGHWR_HAL_STM32_GPIO_NONE
-
-#define CYGHWR_HAL_STM32_UART5_RX               CYGHWR_HAL_STM32_GPIO( C,  2, IN        , FLOATING      )
-#define CYGHWR_HAL_STM32_UART5_TX               CYGHWR_HAL_STM32_GPIO( C, 12, OUT_50MHZ , ALT_PUSHPULL  )
-#define CYGHWR_HAL_STM32_UART5_CTS              CYGHWR_HAL_STM32_GPIO_NONE
-#define CYGHWR_HAL_STM32_UART5_RTS              CYGHWR_HAL_STM32_GPIO_NONE
-
-#ifndef __ASSEMBLER__
-
-__externC void hal_stm32_uart_setbaud( CYG_ADDRESS uart, cyg_uint32 baud );
-
-#endif
+#include <cyg/hal/var_io_usart.h>
 
 //=============================================================================
 // ADCs
@@ -645,18 +1006,33 @@
 #define CYGHWR_HAL_STM32_ADC_CR1_DISCEN         BIT_(11)
 #define CYGHWR_HAL_STM32_ADC_CR1_JDISCEN        BIT_(12)
 #define CYGHWR_HAL_STM32_ADC_CR1_DISCNUM(__x)   VALUE_(13,(__x))
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_ADC_CR1_DUALMODE(__x)  VALUE_(16,(__x))
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
 #define CYGHWR_HAL_STM32_ADC_CR1_JAWDEN         BIT_(22)
 #define CYGHWR_HAL_STM32_ADC_CR1_AWDEN          BIT_(23)
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ADC_CR1_OVRIE          BIT_(26)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+
+
 
 // CR2 fields
 
 #define CYGHWR_HAL_STM32_ADC_CR2_ADON           BIT_(0)
 #define CYGHWR_HAL_STM32_ADC_CR2_CONT           BIT_(1)
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_ADC_CR2_CAL            BIT_(2)
 #define CYGHWR_HAL_STM32_ADC_CR2_RSTCAL         BIT_(3)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
 #define CYGHWR_HAL_STM32_ADC_CR2_DMA            BIT_(8)
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ADC_CR2_DDS            BIT_(9)
+#define CYGHWR_HAL_STM32_ADC_CR2_EOCS           BIT_(10)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+
 #define CYGHWR_HAL_STM32_ADC_CR2_ALIGN          BIT_(11)
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_ADC_CR2_JEXTSEL(__x)   VALUE_(12,(__x))
 #define CYGHWR_HAL_STM32_ADC_CR2_JEXTTRIG       BIT_(15)
 #define CYGHWR_HAL_STM32_ADC_CR2_EXTSEL(__x)    VALUE_(17,(__x))
@@ -664,9 +1040,74 @@
 #define CYGHWR_HAL_STM32_ADC_CR2_JSWSTART       BIT_(21)
 #define CYGHWR_HAL_STM32_ADC_CR2_SWSTART        BIT_(22)
 #define CYGHWR_HAL_STM32_ADC_CR2_TSVREFE        BIT_(23)
+#elif defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ADC_CR2_JEXTSEL(__x)   VALUE_(16,(__x))
+#define CYGHWR_HAL_STM32_ADC_CR2_JEXTEN(__x)    VALUE_(20,(__x))
+#define CYGHWR_HAL_STM32_ADC_CR2_JSWSTART       BIT_(22)
+#define CYGHWR_HAL_STM32_ADC_CR2_EXTSEL(__x)    VALUE_(24,(__x))
+#define CYGHWR_HAL_STM32_ADC_CR2_EXTEN(__x)     VALUE_(28,(__x))
+#define CYGHWR_HAL_STM32_ADC_CR2_SWSTART        BIT_(30)
+#endif
+
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+// On F1 devices ADC1 and ADC3 have different external event sets for regular groups
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM1_CC1       (0)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM1_CC2       (1)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM1_CC3       (2)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM2_CC2       (3)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM3_TRGO      (4)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM4_CC4       (5)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_TIM8_TRGO      (6) // For high- and XL-density devices
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC1_SWSTART        (7)
+
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM3_CC1       (0)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM2_CC3       (1)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM1_CC3       (2)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM8_CC1       (3)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM8_TRGO      (4)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM5_CC1       (5)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_TIM5_CC3       (6)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_ADC3_SWSTART        (7)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM1_CC1    (0)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM1_CC2    (1)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM1_CC3    (2)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM2_CC2    (3)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM2_CC3    (4)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM2_CC4    (5)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM2_TRGO   (6)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM3_CC1    (7)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM3_TRGO   (8)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM4_CC4    (9)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM5_CC1    (10)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM5_CC2    (11)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM5_CC3    (12)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM8_CC1    (13)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_TIM8_TRGO   (14)
+#define CYGHWR_HAL_STM32_ADC_EXTSEL_EXTI        (15) // line 11
+
+#define CYGHWR_HAL_STM32_ADC_EXTEN_DISABLED     (0)
+#define CYGHWR_HAL_STM32_ADC_EXTEN_EDGE_RISE    (1)
+#define CYGHWR_HAL_STM32_ADC_EXTEN_EDGE_FALL    (2)
+#define CYGHWR_HAL_STM32_ADC_EXTEN_EDGE_BOTH    (3)
+
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
 
 // SMPRx fields
 
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+// F1 : SMPR1 17..10 : SMPR2 9..0
+#define CYGHWR_HAL_STM32_ADC_SMPR1_NUM_CHANNELS (8)
+#define CYGHWR_HAL_STM32_ADC_SMPR2_NUM_CHANNELS (10)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+// F2/F4 : SMPR1 18..10 : SMPR2 9..0
+#define CYGHWR_HAL_STM32_ADC_SMPR1_NUM_CHANNELS (9)
+#define CYGHWR_HAL_STM32_ADC_SMPR2_NUM_CHANNELS (10)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+
 #define CYGHWR_HAL_STM32_ADC_SMPRx_SMP(__x, __y) VALUE_((__x) * 3, (__y))
 
 // SQRx fields
@@ -680,32 +1121,52 @@
 
 // ADC GPIO pins
 
-#define CYGHWR_HAL_STM32_ADC123_IN0             CYGHWR_HAL_STM32_GPIO( A, 0,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC123_IN1             CYGHWR_HAL_STM32_GPIO( A, 1,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC123_IN2             CYGHWR_HAL_STM32_GPIO( A, 2,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC123_IN3             CYGHWR_HAL_STM32_GPIO( A, 3,  IN, ANALOG )
+// F1/F2/F4 GPIO inputs have 16 channels (0..15).
+// ADC1 has extra internal sources, which for F1 and HIPERFORMANCE (F2/F4)
+// devices respectively have 18 (0..17) and 19 (0..18) available sources.
+
+// Internal (non-GPIO) channels (ADC1 only):
+// - ADC1_IN16 temperature      F1/F2/F4
+// - ADC1_IN17 Vrefint          F1/F2/F4
+// - ADC1_IN18 Vbat             F2/F4
 
-#define CYGHWR_HAL_STM32_ADC12_IN4              CYGHWR_HAL_STM32_GPIO( A, 4,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC12_IN5              CYGHWR_HAL_STM32_GPIO( A, 5,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC12_IN6              CYGHWR_HAL_STM32_GPIO( A, 6,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC12_IN7              CYGHWR_HAL_STM32_GPIO( A, 7,  IN, ANALOG )
+#define CYGHWR_HAL_STM32_ADC123_IN0             CYGHWR_HAL_STM32_PIN_ANALOG( A, 0 )
+#define CYGHWR_HAL_STM32_ADC123_IN1             CYGHWR_HAL_STM32_PIN_ANALOG( A, 1 )
+#define CYGHWR_HAL_STM32_ADC123_IN2             CYGHWR_HAL_STM32_PIN_ANALOG( A, 2 )
+#define CYGHWR_HAL_STM32_ADC123_IN3             CYGHWR_HAL_STM32_PIN_ANALOG( A, 3 )
 
-#define CYGHWR_HAL_STM32_ADC12_IN8              CYGHWR_HAL_STM32_GPIO( B, 0,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC12_IN9              CYGHWR_HAL_STM32_GPIO( B, 1,  IN, ANALOG )
+#define CYGHWR_HAL_STM32_ADC12_IN4              CYGHWR_HAL_STM32_PIN_ANALOG( A, 4 )
+#define CYGHWR_HAL_STM32_ADC12_IN5              CYGHWR_HAL_STM32_PIN_ANALOG( A, 5 )
+#define CYGHWR_HAL_STM32_ADC12_IN6              CYGHWR_HAL_STM32_PIN_ANALOG( A, 6 )
+#define CYGHWR_HAL_STM32_ADC12_IN7              CYGHWR_HAL_STM32_PIN_ANALOG( A, 7 )
+
+#define CYGHWR_HAL_STM32_ADC12_IN8              CYGHWR_HAL_STM32_PIN_ANALOG( B, 0 )
+#define CYGHWR_HAL_STM32_ADC12_IN9              CYGHWR_HAL_STM32_PIN_ANALOG( B, 1 )
 
-#define CYGHWR_HAL_STM32_ADC3_IN4               CYGHWR_HAL_STM32_GPIO( F, 6,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC3_IN5               CYGHWR_HAL_STM32_GPIO( F, 7,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC3_IN6               CYGHWR_HAL_STM32_GPIO( F, 8,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC3_IN7               CYGHWR_HAL_STM32_GPIO( F, 9,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC3_IN8               CYGHWR_HAL_STM32_GPIO( F, 10, IN, ANALOG )
+#define CYGHWR_HAL_STM32_ADC3_IN4               CYGHWR_HAL_STM32_PIN_ANALOG( F, 6 )
+#define CYGHWR_HAL_STM32_ADC3_IN5               CYGHWR_HAL_STM32_PIN_ANALOG( F, 7 )
+#define CYGHWR_HAL_STM32_ADC3_IN6               CYGHWR_HAL_STM32_PIN_ANALOG( F, 8 )
+#define CYGHWR_HAL_STM32_ADC3_IN7               CYGHWR_HAL_STM32_PIN_ANALOG( F, 9 )
+#define CYGHWR_HAL_STM32_ADC3_IN8               CYGHWR_HAL_STM32_PIN_ANALOG( F, 10 )
+
+#define CYGHWR_HAL_STM32_ADC123_IN10            CYGHWR_HAL_STM32_PIN_ANALOG( C, 0 )
+#define CYGHWR_HAL_STM32_ADC123_IN11            CYGHWR_HAL_STM32_PIN_ANALOG( C, 1 )
+#define CYGHWR_HAL_STM32_ADC123_IN12            CYGHWR_HAL_STM32_PIN_ANALOG( C, 2 )
+#define CYGHWR_HAL_STM32_ADC123_IN13            CYGHWR_HAL_STM32_PIN_ANALOG( C, 3 )
 
-#define CYGHWR_HAL_STM32_ADC123_IN10            CYGHWR_HAL_STM32_GPIO( C, 0,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC123_IN11            CYGHWR_HAL_STM32_GPIO( C, 1,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC123_IN12            CYGHWR_HAL_STM32_GPIO( C, 2,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC123_IN13            CYGHWR_HAL_STM32_GPIO( C, 3,  IN, ANALOG )
+#define CYGHWR_HAL_STM32_ADC12_IN14             CYGHWR_HAL_STM32_PIN_ANALOG( C, 4 )
+#define CYGHWR_HAL_STM32_ADC12_IN15             CYGHWR_HAL_STM32_PIN_ANALOG( C, 5)
 
-#define CYGHWR_HAL_STM32_ADC12_IN14             CYGHWR_HAL_STM32_GPIO( C, 4,  IN, ANALOG )
-#define CYGHWR_HAL_STM32_ADC12_IN15             CYGHWR_HAL_STM32_GPIO( C, 5,  IN, ANALOG )
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+// Following ADC3 channels not-mapped on F1 devices
+#define CYGHWR_HAL_STM32_ADC3_IN9        CYGHWR_HAL_STM32_GPIO_NONE
+#define CYGHWR_HAL_STM32_ADC3_IN14       CYGHWR_HAL_STM32_GPIO_NONE
+#define CYGHWR_HAL_STM32_ADC3_IN15       CYGHWR_HAL_STM32_GPIO_NONE
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ADC3_IN9        CYGHWR_HAL_STM32_PIN_ANALOG( F, 3 )
+#define CYGHWR_HAL_STM32_ADC3_IN14       CYGHWR_HAL_STM32_PIN_ANALOG( F, 4 )
+#define CYGHWR_HAL_STM32_ADC3_IN15       CYGHWR_HAL_STM32_PIN_ANALOG( F, 5 )
+#endif
 
 // ADC1 GPIO pin aliases
 
@@ -751,14 +1212,75 @@
 #define CYGHWR_HAL_STM32_ADC3_IN1               CYGHWR_HAL_STM32_ADC123_IN1
 #define CYGHWR_HAL_STM32_ADC3_IN2               CYGHWR_HAL_STM32_ADC123_IN2
 #define CYGHWR_HAL_STM32_ADC3_IN3               CYGHWR_HAL_STM32_ADC123_IN3
-// Inputs 4 - 8 are already defined
-#define CYGHWR_HAL_STM32_ADC3_IN9               CYGHWR_HAL_STM32_GPIO_NONE
+// Inputs 4 - 9 are already defined
 #define CYGHWR_HAL_STM32_ADC3_IN10              CYGHWR_HAL_STM32_ADC123_IN10
 #define CYGHWR_HAL_STM32_ADC3_IN11              CYGHWR_HAL_STM32_ADC123_IN11
 #define CYGHWR_HAL_STM32_ADC3_IN12              CYGHWR_HAL_STM32_ADC123_IN12
 #define CYGHWR_HAL_STM32_ADC3_IN13              CYGHWR_HAL_STM32_ADC123_IN13
-#define CYGHWR_HAL_STM32_ADC3_IN14              CYGHWR_HAL_STM32_GPIO_NONE
-#define CYGHWR_HAL_STM32_ADC3_IN15              CYGHWR_HAL_STM32_GPIO_NONE
+// Inputs 14 - 15 are already defined
+
+// ADC Clock control pins
+
+#define CYGHWR_HAL_STM32_ADC1_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, ADC1 )
+#define CYGHWR_HAL_STM32_ADC2_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, ADC2 )
+#define CYGHWR_HAL_STM32_ADC3_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, ADC3 )
+
+// F2/F4 only: Common configuration registers based from CYGHWR_HAL_STM32_ADC_COMMON
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ADC_CSR  0x00
+#define CYGHWR_HAL_STM32_ADC_CCR  0x04
+#define CYGHWR_HAL_STM32_ADC_CDR  0x08
+
+// CSR
+#define CYGHWR_HAL_STM32_ADC_CSR_AWD            BIT_(0)
+#define CYGHWR_HAL_STM32_ADC_CSR_EOC            BIT_(1)
+#define CYGHWR_HAL_STM32_ADC_CSR_JEOC           BIT_(2)
+#define CYGHWR_HAL_STM32_ADC_CSR_JSTRT          BIT_(3)
+#define CYGHWR_HAL_STM32_ADC_CSR_STRT           BIT_(4)
+#define CYGHWR_HAL_STM32_ADC_CSR_OVR            BIT_(5)
+
+#define CYGHWR_HAL_STM32_ADC1_CSR_AWD            CYGHWR_HAL_STM32_ADC_CSR_AWD
+#define CYGHWR_HAL_STM32_ADC1_CSR_EOC            CYGHWR_HAL_STM32_ADC_CSR_EOC
+#define CYGHWR_HAL_STM32_ADC1_CSR_JEOC           CYGHWR_HAL_STM32_ADC_CSR_JEOC
+#define CYGHWR_HAL_STM32_ADC1_CSR_JSTRT          CYGHWR_HAL_STM32_ADC_CSR_JSTRT
+#define CYGHWR_HAL_STM32_ADC1_CSR_STRT           CYGHWR_HAL_STM32_ADC_CSR_STRT
+#define CYGHWR_HAL_STM32_ADC1_CSR_OVR            CYGHWR_HAL_STM32_ADC_CSR_OVR
+
+#define CYGHWR_HAL_STM32_ADC2_CSR_AWD            (CYGHWR_HAL_STM32_ADC_CSR_AWD << 8)
+#define CYGHWR_HAL_STM32_ADC2_CSR_EOC            (CYGHWR_HAL_STM32_ADC_CSR_EOC << 8)
+#define CYGHWR_HAL_STM32_ADC2_CSR_JEOC           (CYGHWR_HAL_STM32_ADC_CSR_JEOC << 8)
+#define CYGHWR_HAL_STM32_ADC2_CSR_JSTRT          (CYGHWR_HAL_STM32_ADC_CSR_JSTRT << 8)
+#define CYGHWR_HAL_STM32_ADC2_CSR_STRT           (CYGHWR_HAL_STM32_ADC_CSR_STRT << 8)
+#define CYGHWR_HAL_STM32_ADC2_CSR_OVR            (CYGHWR_HAL_STM32_ADC_CSR_OVR << 8)
+
+#define CYGHWR_HAL_STM32_ADC3_CSR_AWD            (CYGHWR_HAL_STM32_ADC_CSR_AWD << 16)
+#define CYGHWR_HAL_STM32_ADC3_CSR_EOC            (CYGHWR_HAL_STM32_ADC_CSR_EOC << 16)
+#define CYGHWR_HAL_STM32_ADC3_CSR_JEOC           (CYGHWR_HAL_STM32_ADC_CSR_JEOC << 16)
+#define CYGHWR_HAL_STM32_ADC3_CSR_JSTRT          (CYGHWR_HAL_STM32_ADC_CSR_JSTRT << 16)
+#define CYGHWR_HAL_STM32_ADC3_CSR_STRT           (CYGHWR_HAL_STM32_ADC_CSR_STRT << 16)
+#define CYGHWR_HAL_STM32_ADC3_CSR_OVR            (CYGHWR_HAL_STM32_ADC_CSR_OVR << 16)
+
+#define CYGHWR_HAL_STM32_ADC_CSR_ADC1(__csr) ((__csr) >> 0)
+#define CYGHWR_HAL_STM32_ADC_CSR_ADC2(__csr) ((__csr) >> 8)
+#define CYGHWR_HAL_STM32_ADC_CSR_ADC3(__csr) ((__csr) >> 16)
+
+// CCR
+#define CYGHWR_HAL_STM32_ADC_CCR_MULTI_XXX     VALUE_(0,0x1F)
+#define CYGHWR_HAL_STM32_ADC_CCR_DELAY_XXX     VALUE_(8,0xF)
+#define CYGHWR_HAL_STM32_ADC_CCR_DDS           BIT_(13)
+#define CYGHWR_HAL_STM32_ADC_CCR_DMA_XXX       VALUE_(14,0x3)
+#define CYGHWR_HAL_STM32_ADC_CCR_ADCPRE_2      VALUE_(16,0x0)
+#define CYGHWR_HAL_STM32_ADC_CCR_ADCPRE_4      VALUE_(16,0x1)
+#define CYGHWR_HAL_STM32_ADC_CCR_ADCPRE_6      VALUE_(16,0x2)
+#define CYGHWR_HAL_STM32_ADC_CCR_ADCPRE_8      VALUE_(16,0x3)
+#define CYGHWR_HAL_STM32_ADC_CCR_ADCPRE_XXX    VALUE_(16,0x3)
+#define CYGHWR_HAL_STM32_ADC_CCR_VBATE         BIT_(22)
+#define CYGHWR_HAL_STM32_ADC_CCR_TSVREFE       BIT_(23)
+
+// CDR
+#define CYGHWR_HAL_STM32_ADC_CDR_DATA1_XXX    VALUE_(0,0xFFFF)
+#define CYGHWR_HAL_STM32_ADC_CDR_DATA2_XXX    VALUE_(16,0xFFFF)
+#endif
 
 //=============================================================================
 // SPI interface register definitions.
@@ -825,9 +1347,97 @@
 #define CYGHWR_HAL_STM32_SPI_I2SPR_ODD          BIT_(8)
 #define CYGHWR_HAL_STM32_SPI_I2SPR_MCKOE        BIT_(9)
 
+// Clock control definitions for each SPI bus
+
+#define CYGHWR_HAL_STM32_SPI1_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, SPI1 )
+#define CYGHWR_HAL_STM32_SPI2_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, SPI2 )
+#define CYGHWR_HAL_STM32_SPI3_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, SPI3 )
+
+//=============================================================================
+// I2C busses
+
+#define CYGHWR_HAL_STM32_I2C_CR1                0x00
+#define CYGHWR_HAL_STM32_I2C_CR2                0x04
+#define CYGHWR_HAL_STM32_I2C_OAR1               0x08
+#define CYGHWR_HAL_STM32_I2C_OAR2               0x0C
+#define CYGHWR_HAL_STM32_I2C_DR                 0x10
+#define CYGHWR_HAL_STM32_I2C_SR1                0x14
+#define CYGHWR_HAL_STM32_I2C_SR2                0x18
+#define CYGHWR_HAL_STM32_I2C_CCR                0x1C
+#define CYGHWR_HAL_STM32_I2C_TRISE              0x20
+
+#define CYGHWR_HAL_STM32_I2C_CR1_PE             BIT_(0)
+#define CYGHWR_HAL_STM32_I2C_CR1_SMBUS          BIT_(1)
+#define CYGHWR_HAL_STM32_I2C_CR1_SMBTYPE        BIT_(3)
+#define CYGHWR_HAL_STM32_I2C_CR1_ENARP          BIT_(4)
+#define CYGHWR_HAL_STM32_I2C_CR1_ENPEC          BIT_(5)
+#define CYGHWR_HAL_STM32_I2C_CR1_ENGC           BIT_(6)
+#define CYGHWR_HAL_STM32_I2C_CR1_NOSTRETCH      BIT_(7)
+#define CYGHWR_HAL_STM32_I2C_CR1_START          BIT_(8)
+#define CYGHWR_HAL_STM32_I2C_CR1_STOP           BIT_(9)
+#define CYGHWR_HAL_STM32_I2C_CR1_ACK            BIT_(10)
+#define CYGHWR_HAL_STM32_I2C_CR1_POS            BIT_(11)
+#define CYGHWR_HAL_STM32_I2C_CR1_PEC            BIT_(12)
+#define CYGHWR_HAL_STM32_I2C_CR1_ALERT          BIT_(13)
+#define CYGHWR_HAL_STM32_I2C_CR1_SWRST          BIT_(15)
+
+
+#define CYGHWR_HAL_STM32_I2C_CR2_FREQ(__x)      VALUE_(0,__x)
+#define CYGHWR_HAL_STM32_I2C_CR2_FREQ_MASK      MASK_(0,6)
+#define CYGHWR_HAL_STM32_I2C_CR2_ITERREN        BIT_(8)
+#define CYGHWR_HAL_STM32_I2C_CR2_ITEVTEN        BIT_(9)
+#define CYGHWR_HAL_STM32_I2C_CR2_ITBUFEN        BIT_(10)
+#define CYGHWR_HAL_STM32_I2C_CR2_DMAEN          BIT_(11)
+#define CYGHWR_HAL_STM32_I2C_CR2_LAST           BIT_(12)
+
+// OAR1 and OAR2 omitted, we only support master mode
+
+#define CYGHWR_HAL_STM32_I2C_SR1_SB             BIT_(0)
+#define CYGHWR_HAL_STM32_I2C_SR1_ADDR           BIT_(1)
+#define CYGHWR_HAL_STM32_I2C_SR1_BTF            BIT_(2)
+#define CYGHWR_HAL_STM32_I2C_SR1_ADD10          BIT_(3)
+#define CYGHWR_HAL_STM32_I2C_SR1_STOPF          BIT_(4)
+#define CYGHWR_HAL_STM32_I2C_SR1_RxNE           BIT_(6)
+#define CYGHWR_HAL_STM32_I2C_SR1_TxE            BIT_(7)
+#define CYGHWR_HAL_STM32_I2C_SR1_BERR           BIT_(8)
+#define CYGHWR_HAL_STM32_I2C_SR1_ARLO           BIT_(9)
+#define CYGHWR_HAL_STM32_I2C_SR1_AF             BIT_(10)
+#define CYGHWR_HAL_STM32_I2C_SR1_OVR            BIT_(11)
+#define CYGHWR_HAL_STM32_I2C_SR1_PECERR         BIT_(12)
+#define CYGHWR_HAL_STM32_I2C_SR1_TIMEOUT        BIT_(14)
+#define CYGHWR_HAL_STM32_I2C_SR1_SMBALERT       BIT_(15)
+
+
+#define CYGHWR_HAL_STM32_I2C_SR2_MSL            BIT_(0)
+#define CYGHWR_HAL_STM32_I2C_SR2_BUSY           BIT_(1)
+#define CYGHWR_HAL_STM32_I2C_SR2_TRA            BIT_(2)
+#define CYGHWR_HAL_STM32_I2C_SR2_GENCALL        BIT_(4)
+#define CYGHWR_HAL_STM32_I2C_SR2_SMBDEFAULT     BIT_(5)
+#define CYGHWR_HAL_STM32_I2C_SR2_SMBHOST        BIT_(6)
+#define CYGHWR_HAL_STM32_I2C_SR2_DUALF          BIT_(7)
+#define CYGHWR_HAL_STM32_I2C_SR2_PEC            MASK_(7,8)
+
+#define CYGHWR_HAL_STM32_I2C_CCR_CCR(__x)       VALUE_(0,__x)
+#define CYGHWR_HAL_STM32_I2C_CCR_CCR_MASK       MASK_(0,12)
+#define CYGHWR_HAL_STM32_I2C_CCR_DUTY_2         0
+#define CYGHWR_HAL_STM32_I2C_CCR_DUTY_16_9      BIT_(14)
+#define CYGHWR_HAL_STM32_I2C_CCR_STD            0
+#define CYGHWR_HAL_STM32_I2C_CCR_FAST           BIT_(15)
+
+#define CYGHWR_HAL_STM32_I2C_TRISE_VAL(__x)     VALUE_(0,__x)
+#define CYGHWR_HAL_STM32_I2C_TRISE_MASK         MASK_(0,6)
+
+// Clock control definitions for each I2C bus
+
+#define CYGHWR_HAL_STM32_I2C1_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, I2C1 )
+#define CYGHWR_HAL_STM32_I2C2_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, I2C2 )
+
+
 //=============================================================================
 // USB interface register definitions.
 
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
 #define CYGHWR_HAL_STM32_USB_EP0R               0x00 
 #define CYGHWR_HAL_STM32_USB_EP1R               0x04 
 #define CYGHWR_HAL_STM32_USB_EP2R               0x08 
@@ -911,6 +1521,10 @@
 #define CYGHWR_HAL_STM32_USB_DADDR_ADD(__x)     VALUE_(0,(__x))
 #define CYGHWR_HAL_STM32_USB_DADDR_EF           BIT_(7)
 
+#endif // if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
+// USB in F2/F4 parts is completely different. Definitions will be provided when implemented.
+
 //=============================================================================
 // Timers
 //
@@ -955,6 +1569,24 @@
 
 #define CYGHWR_HAL_STM32_TIM_EGR_UG             BIT_(0)
 
+// Clock control pins
+#define CYGHWR_HAL_STM32_TIM1_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, TIM1 )
+#define CYGHWR_HAL_STM32_TIM2_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, TIM2 )
+#define CYGHWR_HAL_STM32_TIM3_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, TIM3 )
+#define CYGHWR_HAL_STM32_TIM4_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, TIM4 )
+#define CYGHWR_HAL_STM32_TIM5_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, TIM5 )
+#define CYGHWR_HAL_STM32_TIM6_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, TIM6 )
+#define CYGHWR_HAL_STM32_TIM7_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, TIM7 )
+#define CYGHWR_HAL_STM32_TIM8_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, TIM8 )
+#if 0
+#define CYGHWR_HAL_STM32_TIM9_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, TIM9 )
+#define CYGHWR_HAL_STM32_TIM10_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB2, TIM10 )
+#define CYGHWR_HAL_STM32_TIM11_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB2, TIM11 )
+#define CYGHWR_HAL_STM32_TIM12_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, TIM12 )
+#define CYGHWR_HAL_STM32_TIM13_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, TIM13 )
+#define CYGHWR_HAL_STM32_TIM14_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, TIM14 )
+#endif
+
 #ifndef __ASSEMBLER__
 
 __externC cyg_uint32 hal_stm32_timer_clock( CYG_ADDRESS base );
@@ -962,6 +1594,34 @@
 #endif
 
 //=============================================================================
+// Independent Watchdog
+
+#define CYGHWR_HAL_STM32_IWDG_KR                0x00
+#define CYGHWR_HAL_STM32_IWDG_PR                0x04
+#define CYGHWR_HAL_STM32_IWDG_RLR               0x08
+#define CYGHWR_HAL_STM32_IWDG_SR                0x0C
+
+#define CYGHWR_HAL_STM32_IWDG_KR_RESET          0xAAAA
+#define CYGHWR_HAL_STM32_IWDG_KR_ACCESS         0x5555
+#define CYGHWR_HAL_STM32_IWDG_KR_START          0xCCCC
+
+#define CYGHWR_HAL_STM32_IWDG_PR_4              0
+#define CYGHWR_HAL_STM32_IWDG_PR_8              1
+#define CYGHWR_HAL_STM32_IWDG_PR_16             2
+#define CYGHWR_HAL_STM32_IWDG_PR_32             3
+#define CYGHWR_HAL_STM32_IWDG_PR_64             4
+#define CYGHWR_HAL_STM32_IWDG_PR_128            5
+#define CYGHWR_HAL_STM32_IWDG_PR_256            6
+
+#define CYGHWR_HAL_STM32_IWDG_SR_PVU            BIT_(0)
+#define CYGHWR_HAL_STM32_IWDG_SR_RVU            BIT_(1)
+
+// Clock control
+
+//#define CYGHWR_HAL_STM32_IWDG_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB1, IWDG )
+
+
+//=============================================================================
 // Flash controller
 
 #define CYGHWR_HAL_STM32_FLASH_ACR              0x00
@@ -969,9 +1629,13 @@
 #define CYGHWR_HAL_STM32_FLASH_OPTKEYR          0x08
 #define CYGHWR_HAL_STM32_FLASH_SR               0x0C
 #define CYGHWR_HAL_STM32_FLASH_CR               0x10
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_FLASH_AR               0x14
 #define CYGHWR_HAL_STM32_FLASH_OBR              0x1C
 #define CYGHWR_HAL_STM32_FLASH_WRPR             0x20
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_FLASH_OPTCR            0x14
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
 
 // Key values
 
@@ -981,19 +1645,47 @@
 // ACR fields
 
 #define CYGHWR_HAL_STM32_FLASH_ACR_LATENCY(__x) VALUE_(0,__x)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
 #define CYGHWR_HAL_STM32_FLASH_ACR_HLFCYA       BIT_(3)
 #define CYGHWR_HAL_STM32_FLASH_ACR_PRFTBE       BIT_(4)
 #define CYGHWR_HAL_STM32_FLASH_ACR_PRFTBS       BIT_(5)
 
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_FLASH_ACR_PRFTEN       BIT_(8)
+#define CYGHWR_HAL_STM32_FLASH_ACR_ICEN         BIT_(9)
+#define CYGHWR_HAL_STM32_FLASH_ACR_DCEN         BIT_(10)
+#define CYGHWR_HAL_STM32_FLASH_ACR_ICRST        BIT_(11)
+#define CYGHWR_HAL_STM32_FLASH_ACR_DCRST        BIT_(12)
+
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
 // SR fields
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
 #define CYGHWR_HAL_STM32_FLASH_SR_BSY           BIT_(0)
 #define CYGHWR_HAL_STM32_FLASH_SR_PGERR         BIT_(2)
 #define CYGHWR_HAL_STM32_FLASH_SR_WRPRTERR      BIT_(4)
 #define CYGHWR_HAL_STM32_FLASH_SR_EOP           BIT_(5)
 
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_FLASH_SR_EOP           BIT_(0)
+#define CYGHWR_HAL_STM32_FLASH_SR_OPERR         BIT_(1)
+#define CYGHWR_HAL_STM32_FLASH_SR_WRPERR        BIT_(4)
+#define CYGHWR_HAL_STM32_FLASH_SR_PGAERR        BIT_(5)
+#define CYGHWR_HAL_STM32_FLASH_SR_PGPERR        BIT_(6)
+#define CYGHWR_HAL_STM32_FLASH_SR_PGSERR        BIT_(7)
+#define CYGHWR_HAL_STM32_FLASH_SR_BSY           BIT_(16)
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
 // CR fields
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
 #define CYGHWR_HAL_STM32_FLASH_CR_PG            BIT_(0)
 #define CYGHWR_HAL_STM32_FLASH_CR_PER           BIT_(1)
 #define CYGHWR_HAL_STM32_FLASH_CR_MER           BIT_(2)
@@ -1005,13 +1697,38 @@
 #define CYGHWR_HAL_STM32_FLASH_CR_ERRIE         BIT_(10)
 #define CYGHWR_HAL_STM32_FLASH_CR_EOPIE         BIT_(12)
 
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_FLASH_CR_PG            BIT_(0)
+#define CYGHWR_HAL_STM32_FLASH_CR_SER           BIT_(1)
+#define CYGHWR_HAL_STM32_FLASH_CR_MER           BIT_(2)
+#define CYGHWR_HAL_STM32_FLASH_CR_SNB(__x)      (((__x)&0xf) << 3)
+#define CYGHWR_HAL_STM32_FLASH_CR_SNB_MASK      MASK_(3,4)
+#define CYGHWR_HAL_STM32_FLASH_CR_PSIZE(__x)    ( (__x) == 8 ? VALUE_(8,0) : \
+                                                  (__x) == 16 ? VALUE_(8,1) : \
+                                                  (__x) == 32 ? VALUE_(8,2) : \
+                                                  VALUE_(8,3) )
+#define CYGHWR_HAL_STM32_FLASH_CR_PSIZE_8       VALUE_(8,0)
+#define CYGHWR_HAL_STM32_FLASH_CR_PSIZE_16      VALUE_(8,1)
+#define CYGHWR_HAL_STM32_FLASH_CR_PSIZE_32      VALUE_(8,2)
+#define CYGHWR_HAL_STM32_FLASH_CR_PSIZE_64      VALUE_(8,3)
+#define CYGHWR_HAL_STM32_FLASH_CR_STRT          BIT_(16)
+#define CYGHWR_HAL_STM32_FLASH_CR_EOPIE         BIT_(24)
+#define CYGHWR_HAL_STM32_FLASH_CR_ERRIE         BIT_(25)
+#define CYGHWR_HAL_STM32_FLASH_CR_LOCK          BIT_(31)
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
 // OBR fields
-
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 #define CYGHWR_HAL_STM32_FLASH_OBR_OPTERR       BIT_(0)
 #define CYGHWR_HAL_STM32_FLASH_OBR_RDPRT        BIT_(1)
 #define CYGHWR_HAL_STM32_FLASH_OBR_WDG_SW       BIT_(2)
 #define CYGHWR_HAL_STM32_FLASH_OBR_nRST_STOP    BIT_(3)
 #define CYGHWR_HAL_STM32_FLASH_OBR_nRST_STDBY   BIT_(4)
+#endif
+
+// F2/F4 FLASH_OPTCR not defined as our flash driver doesn't use it.
 
 //=============================================================================
 // Power control
@@ -1028,13 +1745,28 @@
 #define CYGHWR_HAL_STM32_PWR_CR_PVDE            BIT_(4)
 #define CYGHWR_HAL_STM32_PWR_CR_PLS_XXX         VALUE_(5,7)
 #define CYGHWR_HAL_STM32_PWR_CR_DBP             BIT_(8)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_PWR_CR_FPDS            BIT_(9)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+#define CYGHWR_HAL_STM32_PWR_CR_VOS             BIT_(14)
+#endif // (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
 
 // CSR fields
 
 #define CYGHWR_HAL_STM32_PWR_CSR_WUF            BIT_(0)
 #define CYGHWR_HAL_STM32_PWR_CSR_SBF            BIT_(1)
 #define CYGHWR_HAL_STM32_PWR_CSR_PVDO           BIT_(2)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_PWR_CSR_BRR            BIT_(3)
+#endif
 #define CYGHWR_HAL_STM32_PWR_CSR_EWUP           BIT_(8)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_PWR_CSR_BRE            BIT_(9)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+#define CYGHWR_HAL_STM32_PWR_CSR_VOSRDY         BIT_(14)
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
 
 // Functions and macros to reset the backup domain as well as
 // enable/disable backup domain write protection.
@@ -1088,10 +1820,10 @@
 #define CYGHWR_HAL_STM32_FSMC_PATT3             0x8C
 #define CYGHWR_HAL_STM32_FSMC_ECCR3             0x94
 
-#define CYGHWR_HAL_STM32_FSMC_PCR4              0xC0
-#define CYGHWR_HAL_STM32_FSMC_SR4               0xC4
-#define CYGHWR_HAL_STM32_FSMC_PMEM4             0xC8
-#define CYGHWR_HAL_STM32_FSMC_PATT4             0xCC
+#define CYGHWR_HAL_STM32_FSMC_PCR4              0xA0
+#define CYGHWR_HAL_STM32_FSMC_SR4               0xA4
+#define CYGHWR_HAL_STM32_FSMC_PMEM4             0xA8
+#define CYGHWR_HAL_STM32_FSMC_PATT4             0xAC
 
 #define CYGHWR_HAL_STM32_FSMC_PIO4              0xB0
 
@@ -1111,6 +1843,7 @@
 #define CYGHWR_HAL_STM32_FSMC_PCR_PWID_8        VALUE_(4,0)
 #define CYGHWR_HAL_STM32_FSMC_PCR_PWID_16       VALUE_(4,1)
 #define CYGHWR_HAL_STM32_FSMC_PCR_ECCEN         BIT_(6)
+// FIXME: I don't see where ADLOW comes from? It's not in F1, F2 or F4. -Jifl
 #define CYGHWR_HAL_STM32_FSMC_PCR_ADLOW         BIT_(8)
 #define CYGHWR_HAL_STM32_FSMC_PCR_TCLR(__x)     VALUE_(9,__x)
 #define CYGHWR_HAL_STM32_FSMC_PCR_TAR(__x)      VALUE_(13,__x)
@@ -1131,6 +1864,48 @@
 #define CYGHWR_HAL_STM32_FSMC_SR_IFEN           BIT_(5)
 #define CYGHWR_HAL_STM32_FSMC_SR_FEMPT          BIT_(6)
 
+//=============================================================================
+// Ethernet MAC
+// Include separate header file for this to avoid this header getting unmanageable.
+
+#include <cyg/hal/var_io_eth.h>
+
+//==========================================================================
+
+#if (defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103RC) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103VC) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103ZC) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103RD) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103VD) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103ZD) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103RE) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103VE) || \
+     defined(CYGHWR_HAL_CORTEXM_STM32_F1_F103ZE))
+// NOTE: From ST document ES0104 (STM32F101xC/D/E and STM32F103xC/D/E)
+// errata section 2.6.9 we cannot use FSMC and I2C1 at the same time.
+// For I2C1 support we are limited to on-chip SRAM/Flash execution and
+// must ensure that FSMC is disabled.
+# if (defined(CYG_HAL_STARTUP_SRAM) || \
+      defined(CYG_HAL_STARTUP_ROM) || \
+      defined(CYG_HAL_STARTUP_JTAG))
+#  define HAL_AARDVARK_CHECK_I2C( _i2cdev_ )                                   \
+     CYG_MACRO_START                                                           \
+     if ((_i2cdev_)->i2c_bus == &hal_stm32_i2c_bus1) {                         \
+         CYGHWR_HAL_STM32_CLOCK_DISABLE( CYGHWR_HAL_STM32_CLOCK( AHB, FSMC) ); \
+     }                                                                         \
+     CYG_MACRO_END
+# else // on this CPU we cannot use I2C1 since FSMC needed for the CYG_HAL_STARTUP type
+#  define HAL_AARDVARK_CHECK_I2C( _i2cdev_ )                                  \
+     CYG_MACRO_START                                                          \
+     if ((_i2cdev_)->i2c_bus == &hal_stm32_i2c_bus1) {                        \
+         CYG_TEST_FAIL_FINISH("Invalid CYG_HAL_STARTUP for I2C1 operations"); \
+     }                                                                        \
+     CYG_MACRO_END
+# endif
+#endif
+
+//==========================================================================
+
+#endif // CYGONCE_HAL_VAR_IO_H
 //-----------------------------------------------------------------------------
 // end of var_io.h
-#endif // CYGONCE_HAL_VAR_IO_H
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/stm32/var/current/include/var_io_eth.h
@@ -0,0 +1,462 @@
+#ifndef CYGONCE_HAL_VAR_IO_ETH_H
+#define CYGONCE_HAL_VAR_IO_ETH_H
+//=============================================================================
+//
+//      var_io_eth.h
+//
+//      Ethernet-specific variant definitions
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc.                        
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT      
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   nickg, jlarmour
+// Date:        2008-07-30
+// Purpose:     STM32 variant ETH specific registers
+// Description: 
+// Usage:       Do not include this header file directly. Instead:
+//              #include <cyg/hal/var_io.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#ifndef CYGONCE_HAL_VAR_IO_H
+# error Do not include var_io_eth.h directly, use var_io.h
+#endif
+
+
+//=============================================================================
+// Ethernet MAC
+//
+// Connectivity devices only
+
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+
+#define CYGHWR_HAL_STM32_ETH_MACCR              0x0000
+#define CYGHWR_HAL_STM32_ETH_MACFFR             0x0004
+#define CYGHWR_HAL_STM32_ETH_MACHTHR            0x0008
+#define CYGHWR_HAL_STM32_ETH_MACHTLR            0x000C
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR           0x0010
+#define CYGHWR_HAL_STM32_ETH_MACMIIDR           0x0014
+#define CYGHWR_HAL_STM32_ETH_MACFCR             0x0018
+#define CYGHWR_HAL_STM32_ETH_MACVLANTR          0x001C
+#define CYGHWR_HAL_STM32_ETH_MACRWUFFR          0x0028
+#define CYGHWR_HAL_STM32_ETH_MACPMTCSR          0x002C
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_MACDBGR            0x0034
+#endif
+#define CYGHWR_HAL_STM32_ETH_MACSR              0x0038
+#define CYGHWR_HAL_STM32_ETH_MACIMR             0x003C
+#define CYGHWR_HAL_STM32_ETH_MACA0HR            0x0040
+#define CYGHWR_HAL_STM32_ETH_MACA0LR            0x0044
+#define CYGHWR_HAL_STM32_ETH_MACA1HR            0x0048
+#define CYGHWR_HAL_STM32_ETH_MACA1LR            0x004C
+#define CYGHWR_HAL_STM32_ETH_MACA2HR            0x0050
+#define CYGHWR_HAL_STM32_ETH_MACA2LR            0x0054
+#define CYGHWR_HAL_STM32_ETH_MACA3HR            0x0058
+#define CYGHWR_HAL_STM32_ETH_MACA3LR            0x005C
+
+#define CYGHWR_HAL_STM32_ETH_MMCCR              0x0100
+#define CYGHWR_HAL_STM32_ETH_MMCRIR             0x0104
+#define CYGHWR_HAL_STM32_ETH_MMCTIR             0x0108
+#define CYGHWR_HAL_STM32_ETH_MMCRIMR            0x010C
+#define CYGHWR_HAL_STM32_ETH_MMCTIMR            0x0110
+#define CYGHWR_HAL_STM32_ETH_MMCTGFSCCR         0x014C
+#define CYGHWR_HAL_STM32_ETH_MMCTGFMSCCR        0x0150
+#define CYGHWR_HAL_STM32_ETH_MMCTGFCR           0x0168
+#define CYGHWR_HAL_STM32_ETH_MMCRFCECR          0x0194
+#define CYGHWR_HAL_STM32_ETH_MMCRFAECR          0x0198
+#define CYGHWR_HAL_STM32_ETH_MMCRGUFCR          0x01C4
+
+#define CYGHWR_HAL_STM32_ETH_PTPTSCR            0x0700
+#define CYGHWR_HAL_STM32_ETH_PTPSSIR            0x0704
+#define CYGHWR_HAL_STM32_ETH_PTPTSHR            0x0708
+#define CYGHWR_HAL_STM32_ETH_PTPTSLR            0x070C
+#define CYGHWR_HAL_STM32_ETH_PTPTSHUR           0x0710
+#define CYGHWR_HAL_STM32_ETH_PTPTSLUR           0x0714
+#define CYGHWR_HAL_STM32_ETH_PTPTSAR            0x0718
+#define CYGHWR_HAL_STM32_ETH_PTPTTHR            0x071C
+#define CYGHWR_HAL_STM32_ETH_PTPTTLR            0x0720
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_PTPTSSR            0x0728
+#endif
+
+#define CYGHWR_HAL_STM32_ETH_DMABMR             0x1000
+#define CYGHWR_HAL_STM32_ETH_DMATPDR            0x1004
+#define CYGHWR_HAL_STM32_ETH_DMARPDR            0x1008
+#define CYGHWR_HAL_STM32_ETH_DMARDLAR           0x100C
+#define CYGHWR_HAL_STM32_ETH_DMATDLAR           0x1010
+#define CYGHWR_HAL_STM32_ETH_DMASR              0x1014
+#define CYGHWR_HAL_STM32_ETH_DMAOMR             0x1018
+#define CYGHWR_HAL_STM32_ETH_DMAIER             0x101C
+#define CYGHWR_HAL_STM32_ETH_DMAMFBOCR          0x1020
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_DMARSWTR           0x1024
+#endif
+#define CYGHWR_HAL_STM32_ETH_DMACHTDR           0x1048
+#define CYGHWR_HAL_STM32_ETH_DMACHRDR           0x104C
+#define CYGHWR_HAL_STM32_ETH_DMACHTBAR          0x1050
+#define CYGHWR_HAL_STM32_ETH_DMACHRBAR          0x1054
+
+// MACCR
+
+#define CYGHWR_HAL_STM32_ETH_MACCR_RE           BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_MACCR_TE           BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_MACCR_DC           BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_MACCR_BL(__x)      VALUE_(6, __x)
+#define CYGHWR_HAL_STM32_ETH_MACCR_APCS         BIT_(7)
+#define CYGHWR_HAL_STM32_ETH_MACCR_RD           BIT_(9)
+#define CYGHWR_HAL_STM32_ETH_MACCR_IPCO         BIT_(10)
+#define CYGHWR_HAL_STM32_ETH_MACCR_DM           BIT_(11)
+#define CYGHWR_HAL_STM32_ETH_MACCR_LM           BIT_(12)
+#define CYGHWR_HAL_STM32_ETH_MACCR_ROD          BIT_(13)
+#define CYGHWR_HAL_STM32_ETH_MACCR_FES          BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_MACCR_CSD          BIT_(16)
+#define CYGHWR_HAL_STM32_ETH_MACCR_IFG(__x)     VALUE_(17, (96-(__x))/8 )
+#define CYGHWR_HAL_STM32_ETH_MACCR_JD           BIT_(22)
+#define CYGHWR_HAL_STM32_ETH_MACCR_WD           BIT_(23)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_MACCR_CSTF         BIT_(25)
+#endif
+
+// MACFFR
+
+#define CYGHWR_HAL_STM32_ETH_MACFFR_PM          BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_HU          BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_HM          BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_DAIF        BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_PAM         BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_BFD         BIT_(5)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_PCF_BLOCK   VALUE_(6,0)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_PCF_NOPAUSE VALUE_(6,1)
+#endif
+#define CYGHWR_HAL_STM32_ETH_MACFFR_PCF_ALL     VALUE_(6,2)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_PCF_FILTER  VALUE_(6,3)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_SAIF        BIT_(8)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_SAF         BIT_(9)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_HPF         BIT_(10)
+#define CYGHWR_HAL_STM32_ETH_MACFFR_RA          BIT_(31)
+
+// MACHT* omitted
+
+// MACMIIAR
+
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR_MB        BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR_MW        BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR_CR(__x)   VALUE_(2,__x)
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR_CR_MASK   MASK_(2,3)
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+# define CYGHWR_HAL_STM32_ETH_MACMIIAR_CR_MHZ_CHECK(_mhz) ((_mhz) >= 20 && (_mhz) <= 72)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F2)
+# define CYGHWR_HAL_STM32_ETH_MACMIIAR_CR_MHZ_CHECK(_mhz) ((_mhz) >= 20 && (_mhz) <= 120)
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F4)
+# define CYGHWR_HAL_STM32_ETH_MACMIIAR_CR_MHZ_CHECK(_mhz) ((_mhz) >= 20 && (_mhz) <= 168)
+#endif
+// This macro is shared between F1/F2/F4 families for now (despite
+// irrelevance for >72Mhz speed, but that's checked above) but it's
+// foreseeable that this could change for future products.
+# define CYGHWR_HAL_STM32_ETH_MACMIIAR_CR_MHZ(_mhz)  (          \
+  ((_mhz) >= 100) ? CYGHWR_HAL_STM32_ETH_MACMIIAR_CR(1) :       \
+  ((_mhz) >= 60)  ? CYGHWR_HAL_STM32_ETH_MACMIIAR_CR(0) :       \
+  ((_mhz) >= 35)  ? CYGHWR_HAL_STM32_ETH_MACMIIAR_CR(3) :       \
+  /*((_mhz) >= 20)  ?*/ CYGHWR_HAL_STM32_ETH_MACMIIAR_CR(2))
+
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR_MR(__x)   VALUE_(6,__x)
+#define CYGHWR_HAL_STM32_ETH_MACMIIAR_PA(__x)   VALUE_(11,__x)
+
+// MACFCR omitted
+// MACVLANTR omitted
+// MACRWUFFR omitted
+// MACPMTCSR omitted
+// MACDBGR (F2/F4 only) omitted
+
+// MACSR
+
+#define CYGHWR_HAL_STM32_ETH_MACSR_PMTS         BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_MACSR_MMCS         BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_MACSR_MMCRS        BIT_(5)
+#define CYGHWR_HAL_STM32_ETH_MACSR_MMCTS        BIT_(6)
+#define CYGHWR_HAL_STM32_ETH_MACSR_TSTS         BIT_(9)
+
+// MACIMR
+
+#define CYGHWR_HAL_STM32_ETH_MACIMR_PMTIM       BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_MACIMR_TSTIM       BIT_(9)
+
+// MMCR
+
+#define CYGHWR_HAL_STM32_ETH_MMCCR_CR           BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_MMCCR_CSR          BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_MMCCR_ROR          BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_MMCCR_MCF          BIT_(3)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_MMCCR_MCP          BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_MMCCR_MCFHP        BIT_(5)
+#endif
+
+// MMCRIR & MMCRIMR
+
+#define CYGHWR_HAL_STM32_ETH_MMCRIR_RFCES       BIT_(5)
+#define CYGHWR_HAL_STM32_ETH_MMCRIR_RFAES       BIT_(6)
+#define CYGHWR_HAL_STM32_ETH_MMCRIR_RGUFS       BIT_(17)
+
+// MMCTIR & MMCTIMR
+
+#define CYGHWR_HAL_STM32_ETH_MMCTIR_TGFSCS      BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_MMCTIR_TGFMSCS     BIT_(15)
+#define CYGHWR_HAL_STM32_ETH_MMCTIR_TGFS        BIT_(21)
+
+// PTP* omitted
+
+// DMABMR
+
+#define CYGHWR_HAL_STM32_ETH_DMABMR_SR          BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_DA          BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_DSL(__x)    VALUE_(2,__x)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_PBL(__x)    VALUE_(8,__x)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_RTPR(__x)   VALUE_(14,(__x)-1)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_FB          BIT_(16)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_RDP(__x)    VALUE_(17,__x)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_USP         BIT_(23)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_FPM         BIT_(24)
+#define CYGHWR_HAL_STM32_ETH_DMABMR_AAB         BIT_(25)
+
+//DMASR
+
+#define CYGHWR_HAL_STM32_ETH_DMASR_TS           BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_DMASR_TPSS         BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_DMASR_TBUS         BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_DMASR_TJTS         BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_DMASR_ROS          BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_DMASR_TUS          BIT_(5)
+#define CYGHWR_HAL_STM32_ETH_DMASR_RS           BIT_(6)
+#define CYGHWR_HAL_STM32_ETH_DMASR_RBUS         BIT_(7)
+#define CYGHWR_HAL_STM32_ETH_DMASR_RPSS         BIT_(8)
+#define CYGHWR_HAL_STM32_ETH_DMASR_RWTS         BIT_(9)
+#define CYGHWR_HAL_STM32_ETH_DMASR_ETS          BIT_(10)
+#define CYGHWR_HAL_STM32_ETH_DMASR_FBES         BIT_(13)
+#define CYGHWR_HAL_STM32_ETH_DMASR_ERS          BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_DMASR_AIS          BIT_(15)
+#define CYGHWR_HAL_STM32_ETH_DMASR_NIS          BIT_(16)
+#define CYGHWR_HAL_STM32_ETH_DMASR_RPS          MASK_(17,3)
+#define CYGHWR_HAL_STM32_ETH_DMASR_TPS          MASK_(20,3)
+#define CYGHWR_HAL_STM32_ETH_DMASR_EBS          MASK_(23,3)
+#define CYGHWR_HAL_STM32_ETH_DMASR_MMCS         BIT_(27)
+#define CYGHWR_HAL_STM32_ETH_DMASR_PMTS         BIT_(28)
+#define CYGHWR_HAL_STM32_ETH_DMASR_TSTS         BIT_(29)
+
+// DMAOMR
+
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_SR          BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_OSF         BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_RTC(__x)    VALUE_(3,__x)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_FUGF        BIT_(6)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_FEF         BIT_(7)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_ST          BIT_(13)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_TTC(__x)    VALUE_(14,__x)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_FTF         BIT_(20)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_TSF         BIT_(21)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_DFRF        BIT_(24)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_RSF         BIT_(25)
+#define CYGHWR_HAL_STM32_ETH_DMAOMR_DTCEFD      BIT_(26)
+
+// DMAIER
+
+#define CYGHWR_HAL_STM32_ETH_DMAIER_TIE         BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_TPSIE       BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_TBUIE       BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_TJTIE       BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_ROIE        BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_TUIE        BIT_(5)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_RIE         BIT_(6)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_RBUIE       BIT_(7)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_RPSIE       BIT_(8)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_RWTIE       BIT_(9)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_ETIE        BIT_(10)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_FBEIE       BIT_(13)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_ERIE        BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_AISE        BIT_(15)
+#define CYGHWR_HAL_STM32_ETH_DMAIER_NISE        BIT_(16)
+
+// DMAFBOCR omitted
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_ETH_DMARSWTR_RSWTC_MASK   MASK_(0,8)
+#define CYGHWR_HAL_STM32_ETH_DMARSWTR_RSWTC(__x)   ((__x)& CYGHWR_HAL_STM32_ETH_DMARSWTR_RSWTC_MASK)
+#endif
+
+// Transmit descriptor fields
+
+#define CYGHWR_HAL_STM32_ETH_TDES0_DB           BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_TDES0_UF           BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_TDES0_ED           BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_TDES0_CC           MASK_(3,4)
+#define CYGHWR_HAL_STM32_ETH_TDES0_VF           BIT_(7)
+#define CYGHWR_HAL_STM32_ETH_TDES0_EC           BIT_(8)
+#define CYGHWR_HAL_STM32_ETH_TDES0_LCO          BIT_(9)
+#define CYGHWR_HAL_STM32_ETH_TDES0_NC           BIT_(10)
+#define CYGHWR_HAL_STM32_ETH_TDES0_LCA          BIT_(11)
+#define CYGHWR_HAL_STM32_ETH_TDES0_IPE          BIT_(12)
+#define CYGHWR_HAL_STM32_ETH_TDES0_FF           BIT_(13)
+#define CYGHWR_HAL_STM32_ETH_TDES0_JT           BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_TDES0_ES           BIT_(15)
+#define CYGHWR_HAL_STM32_ETH_TDES0_IHE          BIT_(16)
+#define CYGHWR_HAL_STM32_ETH_TDES0_TTSS         BIT_(17)
+#define CYGHWR_HAL_STM32_ETH_TDES0_TCH          BIT_(20)
+#define CYGHWR_HAL_STM32_ETH_TDES0_TER          BIT_(21)
+#define CYGHWR_HAL_STM32_ETH_TDES0_CIC_DISA     VALUE_(22,0)
+#define CYGHWR_HAL_STM32_ETH_TDES0_CIC_H        VALUE_(22,1)
+#define CYGHWR_HAL_STM32_ETH_TDES0_CIC_HP       VALUE_(22,2)
+#define CYGHWR_HAL_STM32_ETH_TDES0_CIC_HPP      VALUE_(22,3)
+#define CYGHWR_HAL_STM32_ETH_TDES0_TTSE         BIT_(25)
+#define CYGHWR_HAL_STM32_ETH_TDES0_DP           BIT_(26)
+#define CYGHWR_HAL_STM32_ETH_TDES0_DC           BIT_(27)
+#define CYGHWR_HAL_STM32_ETH_TDES0_FS           BIT_(28)
+#define CYGHWR_HAL_STM32_ETH_TDES0_LS           BIT_(29)
+#define CYGHWR_HAL_STM32_ETH_TDES0_IC           BIT_(30)
+#define CYGHWR_HAL_STM32_ETH_TDES0_OWN          BIT_(31)
+
+#define CYGHWR_HAL_STM32_ETH_TDES1_TBS1(__x)    VALUE_(0,__x)
+#define CYGHWR_HAL_STM32_ETH_TDES1_TBS2(__x)    VALUE_(16,__x)
+
+// Receive descriptor fields
+
+#define CYGHWR_HAL_STM32_ETH_RDES0_PCE          BIT_(0)
+#define CYGHWR_HAL_STM32_ETH_RDES0_CE           BIT_(1)
+#define CYGHWR_HAL_STM32_ETH_RDES0_DE           BIT_(2)
+#define CYGHWR_HAL_STM32_ETH_RDES0_RE           BIT_(3)
+#define CYGHWR_HAL_STM32_ETH_RDES0_RWT          BIT_(4)
+#define CYGHWR_HAL_STM32_ETH_RDES0_FT           BIT_(5)
+#define CYGHWR_HAL_STM32_ETH_RDES0_LCO          BIT_(6)
+#define CYGHWR_HAL_STM32_ETH_RDES0_IPHCE        BIT_(7)
+#define CYGHWR_HAL_STM32_ETH_RDES0_LS           BIT_(8)
+#define CYGHWR_HAL_STM32_ETH_RDES0_FS           BIT_(9)
+#define CYGHWR_HAL_STM32_ETH_RDES0_VLAN         BIT_(10)
+#define CYGHWR_HAL_STM32_ETH_RDES0_OE           BIT_(11)
+#define CYGHWR_HAL_STM32_ETH_RDES0_LE           BIT_(12)
+#define CYGHWR_HAL_STM32_ETH_RDES0_SAF          BIT_(13)
+#define CYGHWR_HAL_STM32_ETH_RDES0_DESCE        BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_RDES0_ES           BIT_(15)
+#define CYGHWR_HAL_STM32_ETH_RDES0_FL(__x)      (((__x)>>16)&0x3FFF)
+#define CYGHWR_HAL_STM32_ETH_RDES0_AFM          BIT_(30)
+#define CYGHWR_HAL_STM32_ETH_RDES0_OWN          BIT_(31)
+
+#define CYGHWR_HAL_STM32_ETH_RDES1_RBS1(__x)    VALUE_(0,__x)
+#define CYGHWR_HAL_STM32_ETH_RDES1_RCH          BIT_(14)
+#define CYGHWR_HAL_STM32_ETH_RDES1_RER          BIT_(15)
+#define CYGHWR_HAL_STM32_ETH_RDES1_RBS2(__x)    VALUE_(16,__x)
+
+
+// GPIO pins
+
+// NOTE: The platform specific (re-)mapping of pins is provided in the relevant
+// target specific "plf_io.h" header file. These definitions just cover the
+// fixed mappings.
+
+// MCO1 clock to PHY
+#define CYGHWR_HAL_STM32_ETH_MCO                CYGHWR_HAL_STM32_PIN_ALTFN_OUT( A,  8,  0, PUSHPULL,  NONE,     AT_LEAST(50) )
+
+// MII interface
+#define CYGHWR_HAL_STM32_ETH_MII_MDC            CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C,  1, 11, PUSHPULL,  NONE,     AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_TXD2           CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C,  2, 11, PUSHPULL,  NONE,     AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_MDIO           CYGHWR_HAL_STM32_PIN_ALTFN_OUT( A,  2, 11, PUSHPULL,  NONE,     AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_TX_CLK         CYGHWR_HAL_STM32_PIN_ALTFN_IN(  C,  3, 11, OPENDRAIN, FLOATING )
+#define CYGHWR_HAL_STM32_ETH_MII_RX_CLK         CYGHWR_HAL_STM32_PIN_ALTFN_IN(  A,  1, 11, OPENDRAIN, FLOATING )
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
+// MII interface
+#define CYGHWR_HAL_STM32_ETH_MII_TX_CRS         CYGHWR_HAL_STM32_PIN_IN( A,  0, NA, FLOATING )
+#define CYGHWR_HAL_STM32_ETH_MII_COL            CYGHWR_HAL_STM32_PIN_IN( A,  3, NA, FLOATING )
+#define CYGHWR_HAL_STM32_ETH_MII_RX_ER          CYGHWR_HAL_STM32_PIN_IN( B, 10, NA, FLOATING )
+
+#define CYGHWR_HAL_STM32_ETH_MII_TX_EN          CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B, 11, 11, PUSHPULL, NONE, AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_TXD0           CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B, 12, 11, PUSHPULL, NONE, AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_TXD1           CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B, 13, 11, PUSHPULL, NONE, AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_PPS_OUT        CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B,  5, 11, PUSHPULL, NONE, AT_LEAST(50) )
+#define CYGHWR_HAL_STM32_ETH_MII_TXD3           CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B,  8, 11, PUSHPULL, NONE, AT_LEAST(50) )
+
+// RMII interface
+#define CYGHWR_HAL_STM32_ETH_RMII_MDC           CYGHWR_HAL_STM32_ETH_MII_MDC
+#define CYGHWR_HAL_STM32_ETH_RMII_REF_CLK       CYGHWR_HAL_STM32_ETH_MII_RX_CLK
+#define CYGHWR_HAL_STM32_ETH_RMII_MDIO          CYGHWR_HAL_STM32_ETH_MII_MDIO
+#define CYGHWR_HAL_STM32_ETH_RMII_CRS_DV        CYGHWR_HAL_STM32_ETH_MII_RX_DV
+#define CYGHWR_HAL_STM32_ETH_RMII_RXD0          CYGHWR_HAL_STM32_ETH_MII_RXD0
+#define CYGHWR_HAL_STM32_ETH_RMII_RXD1          CYGHWR_HAL_STM32_ETH_MII_RXD1
+#define CYGHWR_HAL_STM32_ETH_RMII_TX_EN         CYGHWR_HAL_STM32_ETH_MII_TX_EN
+#define CYGHWR_HAL_STM32_ETH_RMII_TXD0          CYGHWR_HAL_STM32_ETH_MII_TXD0
+#define CYGHWR_HAL_STM32_ETH_RMII_TXD1          CYGHWR_HAL_STM32_ETH_MII_TXD1
+#define CYGHWR_HAL_STM32_ETH_RMII_PPS_OUT       CYGHWR_HAL_STM32_ETH_MII_PPS_OUT
+
+// Clock controls
+
+#define CYGHWR_HAL_STM32_ETH_MAC_CLOCK          CYGHWR_HAL_STM32_CLOCK( AHB, ETHMAC )
+#define CYGHWR_HAL_STM32_ETH_TX_CLOCK           CYGHWR_HAL_STM32_CLOCK( AHB, ETHMACTX )
+#define CYGHWR_HAL_STM32_ETH_RX_CLOCK           CYGHWR_HAL_STM32_CLOCK( AHB, ETHMACRX )
+
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+// MII interface
+#define CYGHWR_HAL_STM32_ETH_MII_RX_DV          CYGHWR_HAL_STM32_PIN_ALTFN_IN(  A,  7, 11, OPENDRAIN, NONE )
+#define CYGHWR_HAL_STM32_ETH_MII_RXD0           CYGHWR_HAL_STM32_PIN_ALTFN_IN(  C,  4, 11, OPENDRAIN, NONE )
+#define CYGHWR_HAL_STM32_ETH_MII_RXD1           CYGHWR_HAL_STM32_PIN_ALTFN_IN(  C,  5, 11, OPENDRAIN, NONE )
+
+// RMII interface
+#define CYGHWR_HAL_STM32_ETH_RMII_MDC           CYGHWR_HAL_STM32_ETH_MII_MDC
+#define CYGHWR_HAL_STM32_ETH_RMII_REF_CLK       CYGHWR_HAL_STM32_ETH_MII_RX_CLK
+#define CYGHWR_HAL_STM32_ETH_RMII_MDIO          CYGHWR_HAL_STM32_ETH_MII_MDIO
+#define CYGHWR_HAL_STM32_ETH_RMII_CRS_DV        CYGHWR_HAL_STM32_ETH_MII_RX_DV
+#define CYGHWR_HAL_STM32_ETH_RMII_RXD0          CYGHWR_HAL_STM32_ETH_MII_RXD0
+#define CYGHWR_HAL_STM32_ETH_RMII_RXD1          CYGHWR_HAL_STM32_ETH_MII_RXD1
+#define CYGHWR_HAL_STM32_ETH_RMII_TX_EN         CYGHWR_HAL_STM32_ETH_MII_TX_EN
+#define CYGHWR_HAL_STM32_ETH_RMII_TXD0          CYGHWR_HAL_STM32_ETH_MII_TXD0
+#define CYGHWR_HAL_STM32_ETH_RMII_TXD1          CYGHWR_HAL_STM32_ETH_MII_TXD1
+#define CYGHWR_HAL_STM32_ETH_RMII_PPS_OUT       CYGHWR_HAL_STM32_ETH_MII_PPS_OUT
+
+// Clock controls
+
+#define CYGHWR_HAL_STM32_ETH_MAC_CLOCK          CYGHWR_HAL_STM32_CLOCK( AHB1, ETHMAC )
+#define CYGHWR_HAL_STM32_ETH_TX_CLOCK           CYGHWR_HAL_STM32_CLOCK( AHB1, ETHMACTX )
+#define CYGHWR_HAL_STM32_ETH_RX_CLOCK           CYGHWR_HAL_STM32_CLOCK( AHB1, ETHMACRX )
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#endif // CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+
+#endif // CYGONCE_HAL_VAR_IO_ETH_H
+//-----------------------------------------------------------------------------
+// end of var_io_eth.h
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/stm32/var/current/include/var_io_pins.h
@@ -0,0 +1,502 @@
+#ifndef CYGONCE_HAL_VAR_IO_PINS_H
+#define CYGONCE_HAL_VAR_IO_PINS_H
+//=============================================================================
+//
+//      var_io_pins.h
+//
+//      Pin configuration and GPIO definitions
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc.                        
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT      
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   nickg, jlarmour
+// Date:        2011-11-29
+// Purpose:     STM32 variant GPIO and pin configuration specific registers
+// Description: 
+// Usage:       Do not include this header file directly. Instead:
+//              #include <cyg/hal/var_io.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#ifndef CYGONCE_HAL_VAR_IO_H
+# error Do not include var_io_pins.h directly, use var_io.h
+#endif
+
+//=============================================================================
+// GPIO ports - common manifests
+
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_NA (0) // Convenience define for ease of pin definitions (for F1 actually marks MODE as INPUT)
+
+//=============================================================================
+// GPIO ports - F1 family
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_GPIO_CRL               0x00
+#define CYGHWR_HAL_STM32_GPIO_CRH               0x04
+#define CYGHWR_HAL_STM32_GPIO_IDR               0x08
+#define CYGHWR_HAL_STM32_GPIO_ODR               0x0C
+#define CYGHWR_HAL_STM32_GPIO_BSRR              0x10
+#define CYGHWR_HAL_STM32_GPIO_BRR               0x14
+#define CYGHWR_HAL_STM32_GPIO_LCKR              0x18
+
+#define CYGHWR_HAL_STM32_GPIO_MODE_IN           VALUE_(0,0)     // Input mode
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_10MHZ    VALUE_(0,1)     // Output mode, max 10MHz
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_2MHZ     VALUE_(0,2)     // Output mode, max 2MHz
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_50MHZ    VALUE_(0,3)     // Output mode, max 50MHz
+
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_LOW (CYGHWR_HAL_STM32_GPIO_MODE_OUT_2MHZ)
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_MED (CYGHWR_HAL_STM32_GPIO_MODE_OUT_10MHZ)
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_FAST (CYGHWR_HAL_STM32_GPIO_MODE_OUT_50MHZ)
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_HIGH (CYGHWR_HAL_STM32_GPIO_MODE_OUT_FAST) // F1 limited to 50MHz
+
+// The following allows compatible specification of speed with other parts
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_AT_LEAST(__mhz)  ( ((__mhz) <= 2) ? CYGHWR_HAL_STM32_GPIO_MODE_OUT_2MHZ :   \
+                                                        ((__mhz) <= 10) ? CYGHWR_HAL_STM32_GPIO_MODE_OUT_10MHZ : \
+                                                        ((__mhz) <= 50) ? CYGHWR_HAL_STM32_GPIO_MODE_OUT_50MHZ : \
+                                                          CYGHWR_HAL_STM32_GPIO_MODE_OUT_HIGH )
+
+#define CYGHWR_HAL_STM32_GPIO_MODE_OUT_AT_MOST(__mhz)  ( ((__mhz) < 10) ? CYGHWR_HAL_STM32_GPIO_MODE_OUT_2MHZ :   \
+                                                       ((__mhz) < 50) ? CYGHWR_HAL_STM32_GPIO_MODE_OUT_10MHZ :  \
+                                                       ((__mhz) < 100) ? CYGHWR_HAL_STM32_GPIO_MODE_OUT_50MHZ : \
+                                                         CYGHWR_HAL_STM32_GPIO_MODE_OUT_HIGH )
+
+#define CYGHWR_HAL_STM32_GPIO_CNF_AIN           VALUE_(2,0)     // Analog input
+#define CYGHWR_HAL_STM32_GPIO_CNF_FIN           VALUE_(2,1)     // Floating input
+#define CYGHWR_HAL_STM32_GPIO_CNF_PULL          VALUE_(2,2)     // Input with pull up/down
+#define CYGHWR_HAL_STM32_GPIO_CNF_RESV          VALUE_(2,3)     // Reserved
+
+#define CYGHWR_HAL_STM32_GPIO_CNF_GPOPP         VALUE_(2,0)     // GP output push/pull
+#define CYGHWR_HAL_STM32_GPIO_CNF_GPOOD         VALUE_(2,1)     // GP output open drain
+#define CYGHWR_HAL_STM32_GPIO_CNF_AOPP          VALUE_(2,2)     // Alt output push/pull
+#define CYGHWR_HAL_STM32_GPIO_CNF_AOOD          VALUE_(2,3)     // Alt output open drain
+
+
+// Alternative, more readable, config names
+// Inputs
+#define CYGHWR_HAL_STM32_GPIO_CNF_ANALOG        CYGHWR_HAL_STM32_GPIO_CNF_AIN
+#define CYGHWR_HAL_STM32_GPIO_CNF_FLOATING      CYGHWR_HAL_STM32_GPIO_CNF_FIN
+#define CYGHWR_HAL_STM32_GPIO_CNF_PULLDOWN      (CYGHWR_HAL_STM32_GPIO_CNF_PULL)
+#define CYGHWR_HAL_STM32_GPIO_CNF_PULLUP        (CYGHWR_HAL_STM32_GPIO_CNF_PULL|CYGHWR_HAL_STM32_GPIO_PULLUP)
+// Outputs
+#define CYGHWR_HAL_STM32_GPIO_CNF_OUT_OPENDRAIN CYGHWR_HAL_STM32_GPIO_CNF_GPOOD
+#define CYGHWR_HAL_STM32_GPIO_CNF_OUT_PUSHPULL  CYGHWR_HAL_STM32_GPIO_CNF_GPOPP
+#define CYGHWR_HAL_STM32_GPIO_CNF_ALT_OPENDRAIN CYGHWR_HAL_STM32_GPIO_CNF_AOOD
+#define CYGHWR_HAL_STM32_GPIO_CNF_ALT_PUSHPULL  CYGHWR_HAL_STM32_GPIO_CNF_AOPP
+
+
+// This macro packs the port number, bit number, mode and
+// configuration for a GPIO pin into a single word. The packing puts
+// the mode and config in the ls 5 bits, the bit number in 16:20 and
+// the offset of the GPIO port from GPIOA in bits 8:15. The port, mode
+// and config are only specified using the last component of the names
+// to keep definitions short.
+
+#define CYGHWR_HAL_STM32_GPIO(__port, __bit, __mode, __cnf )            \
+            ((CYGHWR_HAL_STM32_GPIO##__port - CYGHWR_HAL_STM32_GPIOA) | \
+             (__bit<<16) |                                              \
+             (CYGHWR_HAL_STM32_GPIO_MODE_##__mode) |                    \
+             (CYGHWR_HAL_STM32_GPIO_CNF_##__cnf))
+
+// We treat the CNF and MODE fields as a single field to simplify the hardware register access. The CNFMODE fields are split across
+// two registers (CRL/CRH) so the passed __pin needs to be in the range 0..7
+#define CYGHWR_HAL_STM32_GPIO_CNFMODE_VAL(__pin, __cnfmode) ((__cnfmode) << ((__pin)<<2))
+#define CYGHWR_HAL_STM32_GPIO_CNFMODE_SET(__pin, __cnfmode, __reg) ((__reg) &= ~MASK_((__pin<<2),4), \
+                                                              (__reg) |= CYGHWR_HAL_STM32_GPIO_CNFMODE_VAL(__pin, __cnfmode))
+
+// Macros to extract encoded values
+#define CYGHWR_HAL_STM32_GPIO_PORT(__pin)       (CYGHWR_HAL_STM32_GPIOA+((__pin)&0x0000FF00))
+#define CYGHWR_HAL_STM32_GPIO_BIT(__pin)        (((__pin)>>16)&0x1F)
+#define CYGHWR_HAL_STM32_GPIO_CFG(__pin)        ((__pin)&0xF)
+#define CYGHWR_HAL_STM32_GPIO_PULLUP            BIT_(4)
+
+//=============================================================================
+// Alternate I/O configuration registers.
+
+#define CYGHWR_HAL_STM32_AFIO_EVCR              0x00
+#define CYGHWR_HAL_STM32_AFIO_MAPR              0x04
+#define CYGHWR_HAL_STM32_AFIO_EXTICR1           0x08
+#define CYGHWR_HAL_STM32_AFIO_EXTICR2           0x0C
+#define CYGHWR_HAL_STM32_AFIO_EXTICR3           0x10
+#define CYGHWR_HAL_STM32_AFIO_EXTICR4           0x14
+
+// The following macro allows the four EXTICR registers to be indexed
+// as CYGHWR_HAL_STM32_AFIO_EXTICR(1) to CYGHWR_HAL_STM32_AFIO_EXTICR(4)
+#define CYGHWR_HAL_STM32_AFIO_EXTICR(__x)       (4*((__x)-1)+0x08)
+
+#define CYGHWR_HAL_STM32_AFIO_EVCR_PIN(__x)     VALUE_(0,(__x))
+#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTA        VALUE_(4,0) 
+#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTB        VALUE_(4,1) 
+#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTC        VALUE_(4,2) 
+#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTD        VALUE_(4,3) 
+#define CYGHWR_HAL_STM32_AFIO_EVCR_PORTE        VALUE_(4,4)
+#define CYGHWR_HAL_STM32_AFIO_EVCR_EVOE         BIT_(7) 
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SPI1_RMP     BIT_(0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_I2C1_RMP     BIT_(1)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_URT1_RMP     BIT_(2)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_URT2_RMP     BIT_(3)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_URT3_NO_RMP  VALUE_(4,0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_URT3_P1_RMP  VALUE_(4,1)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_URT3_FL_RMP  VALUE_(4,3)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM1_NO_RMP  VALUE_(6,0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM1_P1_RMP  VALUE_(6,1)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM1_FL_RMP  VALUE_(6,3)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_NO_RMP  VALUE_(8,0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_P1_RMP  VALUE_(8,1)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_P2_RMP  VALUE_(8,2)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2_FL_RMP  VALUE_(8,3)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM3_NO_RMP  VALUE_(10,0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM3_P2_RMP  VALUE_(10,2)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM3_FL_RMP  VALUE_(10,3)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM4_RMP     BIT_(12)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN_NO_RMP   VALUE_(13,0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN_FL1_RMP  VALUE_(13,2)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN_FL2_RMP  VALUE_(13,3)
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_PD01_RMP     BIT_(15)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM5CH4_RMP  BIT_(16)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC1EINJ_RMP BIT_(17)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC1EREG_RMP BIT_(18)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC2EINJ_RMP BIT_(19)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_ADC2EREG_RMP BIT_(20)
+
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_AFIO_MAPR_ETH_RMP      BIT_(21)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_CAN2_RMP     BIT_(22)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_ETH_RMII     BIT_(23)
+#endif
+
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_FULL     VALUE_(24,0)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_NORST    VALUE_(24,1)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_SWDPEN   VALUE_(24,2)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_SWDPDIS  VALUE_(24,4)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SWJ_MASK     VALUE_(24,7)
+
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+#define CYGHWR_HAL_STM32_AFIO_MAPR_SPI3_RMP     BIT_(28)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_TIM2ITR1_RMP BIT_(29)
+#define CYGHWR_HAL_STM32_AFIO_MAPR_PTP_PPS_RMP  BIT_(30)
+#endif
+
+// The following macros are used to generate the bitfields for setting up
+// external interrupts.  For example, CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTC(12)
+// will generate the bitfield which when ORed into the EXTICR4 register will
+// set up C12 as the external interrupt pin for the EXTI12 interrupt.
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTA(__x) VALUE_(4*((__x)&3),0)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTB(__x) VALUE_(4*((__x)&3),1)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTC(__x) VALUE_(4*((__x)&3),2)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTD(__x) VALUE_(4*((__x)&3),3)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTE(__x) VALUE_(4*((__x)&3),4)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTF(__x) VALUE_(4*((__x)&3),5)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_PORTG(__x) VALUE_(4*((__x)&3),6)
+#define CYGHWR_HAL_STM32_AFIO_EXTICRX_MASK(__x)  VALUE_(4*((__x)&3),0xF)
+
+// AFIO clock control
+
+#define CYGHWR_HAL_STM32_AFIO_CLOCK             CYGHWR_HAL_STM32_CLOCK( APB2, AFIO )
+
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+//=============================================================================
+// GPIO ports - F2/F4 family
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+// GPIO Register offsets.
+#define CYGHWR_HAL_STM32_GPIO_MODER                   0x00
+#define CYGHWR_HAL_STM32_GPIO_OTYPER                  0x04
+#define CYGHWR_HAL_STM32_GPIO_OSPEEDR                 0x08
+#define CYGHWR_HAL_STM32_GPIO_PUPDR                   0x0C
+#define CYGHWR_HAL_STM32_GPIO_IDR                     0x10
+#define CYGHWR_HAL_STM32_GPIO_ODR                     0x14
+#define CYGHWR_HAL_STM32_GPIO_BSRR                    0x18
+#define CYGHWR_HAL_STM32_GPIO_LCKR                    0x1C
+#define CYGHWR_HAL_STM32_GPIO_AFRL                    0x20
+#define CYGHWR_HAL_STM32_GPIO_AFRH                    0x24
+
+// A helper macro just to allow access to a particular register
+#define CYGHWR_HAL_STM32_GPIO_REG(__portbaseaddr, __offset)  ((volatile cyg_uint32 *)( ((char*)__portbaseaddr) + __offset ))
+
+// GPIO port mode register. 
+#define CYGHWR_HAL_STM32_GPIO_MODE_GPIO_IN            (0)
+#define CYGHWR_HAL_STM32_GPIO_MODE_GPIO_OUT           (1)
+#define CYGHWR_HAL_STM32_GPIO_MODE_ALTFN              (2)
+#define CYGHWR_HAL_STM32_GPIO_MODE_ANALOG             (3)
+#define CYGHWR_HAL_STM32_GPIO_MODE_VAL(__pin, __mode) ((__mode) << ((__pin)<<1))
+#define CYGHWR_HAL_STM32_GPIO_MODE_SET(__pin, __mode, __reg) ((__reg) &= ~MASK_((__pin<<1),2), \
+                                                              (__reg) |= CYGHWR_HAL_STM32_GPIO_MODE_VAL(__pin, __mode))
+
+// GPIO port output type register.
+#define CYGHWR_HAL_STM32_GPIO_OTYPE_PUSHPULL          (0)
+#define CYGHWR_HAL_STM32_GPIO_OTYPE_OPENDRAIN         (1)
+#define CYGHWR_HAL_STM32_GPIO_OTYPE_VAL(__pin, __otype)   VALUE_(__pin,__otype)
+#define CYGHWR_HAL_STM32_GPIO_OTYPE_SET(__pin, __otype, __reg)   ((__reg) &= ~BIT_(__pin), \
+                                                                  (__reg) |= CYGHWR_HAL_STM32_GPIO_OTYPE_VAL(__pin, __otype))
+#define CYGHWR_HAL_STM32_GPIO_OTYPE_NA                (0) // Convenience define for ease of pin definitions
+
+// GPIO port output speed register.
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_LOW              (0)  // 2MHz
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_2MHZ             (0)
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_MED              (1)  // 25MHz
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_25MHZ            (1)
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_FAST             (2)  // 50MHz
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_50MHZ            (2)
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_HIGH             (3)  // 100MHZ on 30pF, 80MHz on 15pF
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_BAL(__pin, __speed)  ((__speed) << ((__pin)<<1))
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_SET(__pin, __speed, __reg)  ((__reg) &= ~MASK_((__pin<<1),2), \
+                                                                  (__reg) |= CYGHWR_HAL_STM32_GPIO_OSPEED_BAL(__pin, __speed))
+
+// The following allows compatible specification of speed with other parts
+// which have different speed ranges e.g. F1
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_AT_LEAST(__mhz)  ( ((__mhz) <= 2) ? CYGHWR_HAL_STM32_GPIO_OSPEED_2MHZ :   \
+                                                        ((__mhz) <= 25) ? CYGHWR_HAL_STM32_GPIO_OSPEED_25MHZ : \
+                                                        ((__mhz) <= 50) ? CYGHWR_HAL_STM32_GPIO_OSPEED_50MHZ : \
+                                                        CYGHWR_HAL_STM32_GPIO_OSPEED_HIGH )
+  
+#define CYGHWR_HAL_STM32_GPIO_OSPEED_AT_MOST(__mhz)  ( ((__mhz) < 25) ? CYGHWR_HAL_STM32_GPIO_OSPEED_2MHZ :   \
+                                                       ((__mhz) < 50) ? CYGHWR_HAL_STM32_GPIO_OSPEED_25MHZ :  \
+                                                       ((__mhz) < 100) ? CYGHWR_HAL_STM32_GPIO_OSPEED_50MHZ : \
+                                                       CYGHWR_HAL_STM32_GPIO_OSPEED_HIGH )
+
+// GPIO port pull-up/pull-down register.
+#define CYGHWR_HAL_STM32_GPIO_PUPD_NONE               (0)
+#define CYGHWR_HAL_STM32_GPIO_PUPD_PULLUP             (1)
+#define CYGHWR_HAL_STM32_GPIO_PUPD_PULLDOWN           (2)
+#define CYGHWR_HAL_STM32_GPIO_PUPD_VAL(__pin, __pupd) ((__pupd) << ((__pin)<<1))
+#define CYGHWR_HAL_STM32_GPIO_PUPD_SET(__pin, __pupd, __reg) ((__reg) &= ~MASK_(((__pin)<<1),2), \
+                                                              (__reg) |= CYGHWR_HAL_STM32_GPIO_PUPD_VAL(__pin, __pupd))
+
+// GPIO port input data register.
+#define CYGHWR_HAL_STM32_GPIO_IDR_GET(__portbaseaddr, __pin, __val) \
+  ((__val) = ( *CYGHWR_HAL_STM32_GPIO_REG(__portbaseaddr, CYGHWR_HAL_STM32_GPIO_IDR) >> (__pin)) & 1)
+
+// GPIO port output data register.
+// Don't encourage setting it here. Use GPIO_BSRR instead for that.
+#define CYGHWR_HAL_STM32_GPIO_ODR_GET(__portbaseaddr, __pin, __val) \
+  ((__val) = ( *CYGHWR_HAL_STM32_GPIO_REG(__portbaseaddr, CYGHWR_HAL_STM32_GPIO_ODR) >> (__pin)) & 1)
+
+// GPIO port bit set/reset register.
+#define CYGHWR_HAL_STM32_GPIO_BSRR_SET(__portbaseaddr, __pin, __val) \
+  ( *CYGHWR_HAL_STM32_GPIO_REG(__portbaseaddr, CYGHWR_HAL_STM32_GPIO_BSRR) = (__val)?(1<<(__pin)):(1<<((__pin)+16)))
+
+// GPIO port configuration lock register.
+#define CYGHWR_HAL_STM32_GPIO_LCKR_LCKK               BIT_(16)
+#define CYGHWR_HAL_STM32_GPIO_LCKR_LCK(__pin)         BIT_((__pin))
+
+// GPIO alternate function low register.
+#define CYGHWR_HAL_STM32_GPIO_AFRL0                   MASK_(0,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL1                   MASK_(4,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL2                   MASK_(8,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL3                   MASK_(12,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL4                   MASK_(16,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL5                   MASK_(20,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL6                   MASK_(24,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRL7                   MASK_(28,4)
+// GPIO alternate function high register.
+#define CYGHWR_HAL_STM32_GPIO_AFRH8                   MASK_(0,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH9                   MASK_(4,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH10                  MASK_(8,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH11                  MASK_(12,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH12                  MASK_(16,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH13                  MASK_(20,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH14                  MASK_(24,4)
+#define CYGHWR_HAL_STM32_GPIO_AFRH15                  MASK_(28,4)
+
+// Set alternate function. We try to keep this as a macro as most times the
+// arguments will be constant so can easily be collapsed substantially by the
+// compiler.
+// Note, this is not interrupt-safe, unavoidably. Provide your own protection
+// if that's needed, although in general this will happen at startup time.
+#define CYGHWR_HAL_STM32_GPIO_AFR_SET(__portbaseaddr, __pin, __func)    \
+  CYG_MACRO_START                                                       \
+  cyg_uint32 __cur_afr, __mask;                                         \
+  volatile cyg_uint32 *__reg;                                           \
+  cyg_uint8 __reg_pin = (__pin);                                        \
+  if (__pin < 8) {                                                      \
+    __reg = CYGHWR_HAL_STM32_GPIO_REG(__portbaseaddr, CYGHWR_HAL_STM32_GPIO_AFRL); \
+  } else {                                                              \
+    __reg = CYGHWR_HAL_STM32_GPIO_REG(__portbaseaddr, CYGHWR_HAL_STM32_GPIO_AFRH); \
+    __reg_pin -= 8;                                                     \
+  }                                                                     \
+  HAL_READ_UINT32( __reg, __cur_afr );                                  \
+  __mask = 0xf << (__reg_pin<<2);                                       \
+  __cur_afr &= ~__mask;                                                 \
+  __mask = (__func) << (__reg_pin<<2);                                  \
+  __cur_afr |= __mask;                                                  \
+  HAL_WRITE_UINT32( __reg, __cur_afr );                                 \
+  CYG_MACRO_END
+
+
+// This macro packs the port number, bit number, mode and
+// configuration for a GPIO pin into a single word. The packing puts
+// the GPIO bank at bits 16:19, the pin at bits 12:15, the mode (i.e. function)
+// at bits 10:11, for ALTFN mode the specific mapping at bits 6:9, pushpull(0)
+// or open drain(1) at bit 5, pull-up(1) pull-down (2) or neither(0) at
+// bits 3:4, and speed at bits 0:2 (low, med, fast, high).
+// To keep definitions short, we simplify most of the arguments so they
+// can be passed in with only their last components.
+
+// FIXME: This should be renamed to something like CYGHWR_HAL_STM32_PIN(... when
+// bringing F1 into line with this way of declaring pins.
+
+#define CYGHWR_HAL_STM32_GPIO(__port, __bit, __mode, __af, __ppod, __pupd, __speed) \
+  ( ((CYGHWR_HAL_STM32_GPIO##__port - CYGHWR_HAL_STM32_GPIOA) << 6 ) |	\
+    (__bit << 12) |							\
+    (CYGHWR_HAL_STM32_GPIO_MODE_##__mode << 10) |			\
+    (__af << 6) |                                                       \
+    (CYGHWR_HAL_STM32_GPIO_OTYPE_##__ppod << 5) |			\
+    (CYGHWR_HAL_STM32_GPIO_PUPD_##__pupd << 3) |			\
+    (CYGHWR_HAL_STM32_GPIO_OSPEED_##__speed) )
+
+// Macros to extract encoded values
+#define CYGHWR_HAL_STM32_GPIO_PORT(__pin)       (CYGHWR_HAL_STM32_GPIOA+(((__pin)&0xF0000)>>6))
+#define CYGHWR_HAL_STM32_GPIO_BIT(__pin)        (((__pin)>>12)&0xF)
+#define CYGHWR_HAL_STM32_GPIO_MODE(__pin)       (((__pin)>>10)&0x3)
+#define CYGHWR_HAL_STM32_GPIO_AF(__pin)         (((__pin)>>6)&0xF)
+#define CYGHWR_HAL_STM32_GPIO_OPENDRAIN(__pin)  (((__pin)>>5)&0x1)
+#define CYGHWR_HAL_STM32_GPIO_PULLUPDOWN(__pin) (((__pin)>>3)&0x3)
+#define CYGHWR_HAL_STM32_GPIO_SPEED(__pin)       ((__pin)&0x7)
+
+#endif  //if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+//=============================================================================
+
+#define CYGHWR_HAL_STM32_GPIO_NONE      (0xFFFFFFFF)
+
+// Functions and macros to configure GPIO ports.
+
+__externC void hal_stm32_gpio_set( cyg_uint32 pin );
+__externC void hal_stm32_gpio_out( cyg_uint32 pin, int val );
+__externC void hal_stm32_gpio_in ( cyg_uint32 pin, int *val );
+
+#define CYGHWR_HAL_STM32_GPIO_SET(__pin ) hal_stm32_gpio_set( __pin )
+#define CYGHWR_HAL_STM32_GPIO_OUT(__pin, __val ) hal_stm32_gpio_out( __pin, __val )
+#define CYGHWR_HAL_STM32_GPIO_IN(__pin,  __val ) hal_stm32_gpio_in( __pin, __val )
+
+//-----------------------------------------------------------------------------
+
+// For the following pin definition macros where __speed is a parameter the
+// actual rates available depend on the target family. The generic LOW, MED,
+// FAST and HIGH manifests can be used instead of explicit values, or more
+// usefully the AT_LEAST(__mhz) and AT_MOST(__mhz) macros can be used to specify
+// an acceptable limit instead.
+
+// The CYGHWR_HAL_STM32_PIN_OUT() macro defines a GPIO output pin. The __ppod
+// parameter can be one of PUSHPULL or OPENDRAIN. The __pupd parameter can be
+// one of NONE, PULLUP or PULLDOWN. For F1 devices the __pupd parameter is
+// not-relevant and is ignored.
+// e.g.
+//   CYGHWR_HAL_STM32_PIN_OUT(B,8,OPENDRAIN,NONE,FAST);
+//   CYGHWR_HAL_STM32_PIN_OUT(B,9,OPENDRAIN,NONE.AT_LEAST(50));
+
+// The CYGHWR_HAL_STM32_PIN_ALTFN_OUT() macro defines an alternative function
+// output pin. For F1 family devices the __af field is not-relevant and is
+// ignored. The __ppod should be PUSHPULL or OPENDRAIN. The __pupd parameter can
+// be one of NONE, PULLUP or PULLDOWN. For F1 devices the __pupd parameter is
+// not-relevant and is ignored.
+// e.g.
+//   CYGHWR_HAL_STM32_PIN_ALTFN_OUT(B,6,4,OPENDRAIN,NONE,MED);
+//   CYGHWR_HAL_STM32_PIN_ALTFN_OUT(B,10,4,OPENDRAIN,NONE,AT_LEAST(10));
+
+// The CYGHWR_HAL_STM32_PIN_IN() macro is used to define GPIO input pins. The
+// __pupd should be one of NONE. FLOATING, PULLUP or PULLDOWN.
+// e.g.
+//   CYGHWR_HAL_STM32_PIN_IN(B,4,PULLUP);
+
+// The CYGHWR_HAL_STM32_PIN_ALTFN_IN() macro is used to define alternate
+// function input pins. The __ppod parameter can be one of PUSHPULL,
+// OPENDRAIN or NA. The __pupd should be one of NONE. FLOATING, PULLUP or
+// PULLDOWN. For F1 family devices the __af and _ppod fields are not relevant
+// and are ignored, and in reality this macro peforms the same function as
+// CYGHWR_HAL_STM32_PIN_IN() for F1 family devices since extra AFIO
+// configuration is needed.
+// e.g.
+//   CYGHWR_HAL_STM32_PIN_ALTFN_IN(B,4,6,OPENDRAIN,PULLUP);
+
+// The CYGHWR_HAL_STM32_PIN_ANALOG() macro defines an analog mode pin. For F1
+// family devices this is for input only, e.g. ADC.
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
+#define CYGHWR_HAL_STM32_GPIO_CNF_NONE (CYGHWR_HAL_STM32_GPIO_CNF_FLOATING) // Should not be needed for F1 family but ensure HIPERFORMANCE compatible name NONE exists
+
+#define CYGHWR_HAL_STM32_PIN_OUT(__port,__pin,__ppod,__pupd,__speed) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,OUT_##__speed,OUT_##__ppod)
+
+#define CYGHWR_HAL_STM32_PIN_ALTFN_OUT(__port,__pin,__af,__ppod,__pupd,__speed) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,OUT_##__speed,ALT_##__ppod)
+
+#define CYGHWR_HAL_STM32_PIN_IN(__port,__pin,__ppod,__pupd)     \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,IN,__pupd)
+
+#define CYGHWR_HAL_STM32_PIN_ALTFN_IN(__port,__pin,__af,__ppod,__pupd)  \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,IN,__pupd) // NOTE: Identical to CYGHWR_HAL_STM32_PIN_IN() at the moment
+
+#define CYGHWR_HAL_STM32_PIN_ANALOG(__port,__pin) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,IN,ANALOG)
+
+#elif defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_GPIO_PUPD_FLOATING (CYGHWR_HAL_STM32_GPIO_PUPD_NONE) // Should not be needed for HIPERFORMANCE family but ensure F1 compatible name FLOATING exists
+
+#define CYGHWR_HAL_STM32_PIN_OUT(__port,__pin,__ppod,__pupd,__speed) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,GPIO_OUT,0,__ppod,__pupd,__speed)
+
+#define CYGHWR_HAL_STM32_PIN_ALTFN_OUT(__port,__pin,__af,__ppod,__pupd,__speed) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,ALTFN,__af,__ppod,__pupd,__speed)
+
+#define CYGHWR_HAL_STM32_PIN_IN(__port,__pin,__pupd) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,GPIO_IN,0,NA,__pupd,NA)
+
+#define CYGHWR_HAL_STM32_PIN_ALTFN_IN(__port,__pin,__af,__ppod,__pupd)  \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,ALTFN,__af,__ppod,__pupd,NA)
+
+#define CYGHWR_HAL_STM32_PIN_ANALOG(__port,__pin) \
+  CYGHWR_HAL_STM32_GPIO(__port,__pin,ANALOG,0,NA,NONE,NA)
+
+#else
+#error "Unknown STM32 family for GPIO PIN macros"
+#endif
+
+//-----------------------------------------------------------------------------
+// end of var_io_pins.h
+#endif // CYGONCE_HAL_VAR_IO_PINS_H
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/stm32/var/current/include/var_io_usart.h
@@ -0,0 +1,264 @@
+#ifndef CYGONCE_HAL_VAR_IO_USART_H
+#define CYGONCE_HAL_VAR_IO_USART_H
+//=============================================================================
+//
+//      var_io_usart.h
+//
+//      USART-specific variant definitions
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2008, 2009, 2011 Free Software Foundation, Inc.                        
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT      
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   nickg, jlarmour
+// Date:        2008-07-30
+// Purpose:     STM32 variant USART specific registers
+// Description: 
+// Usage:       Do not include this header file directly. Instead:
+//              #include <cyg/hal/var_io.h>
+//
+//####DESCRIPTIONEND####
+//
+//=============================================================================
+
+#ifndef CYGONCE_HAL_VAR_IO_H
+# error Do not include var_io_usart.h directly, use var_io.h
+#endif
+
+//=============================================================================
+// UARTs
+
+#define CYGHWR_HAL_STM32_UART_SR                0x00
+#define CYGHWR_HAL_STM32_UART_DR                0x04
+#define CYGHWR_HAL_STM32_UART_BRR               0x08
+#define CYGHWR_HAL_STM32_UART_CR1               0x0C
+#define CYGHWR_HAL_STM32_UART_CR2               0x10
+#define CYGHWR_HAL_STM32_UART_CR3               0x14
+#define CYGHWR_HAL_STM32_UART_GTPR              0x18
+
+// SR Bits
+
+#define CYGHWR_HAL_STM32_UART_SR_PE             BIT_(0)
+#define CYGHWR_HAL_STM32_UART_SR_FE             BIT_(1)
+#define CYGHWR_HAL_STM32_UART_SR_NE             BIT_(2)
+#define CYGHWR_HAL_STM32_UART_SR_NF             BIT_(2)
+#define CYGHWR_HAL_STM32_UART_SR_ORE            BIT_(3)
+#define CYGHWR_HAL_STM32_UART_SR_IDLE           BIT_(4)
+#define CYGHWR_HAL_STM32_UART_SR_RXNE           BIT_(5)
+#define CYGHWR_HAL_STM32_UART_SR_TC             BIT_(6)
+#define CYGHWR_HAL_STM32_UART_SR_TXE            BIT_(7)
+#define CYGHWR_HAL_STM32_UART_SR_LBD            BIT_(8)
+#define CYGHWR_HAL_STM32_UART_SR_CTS            BIT_(9)
+
+// BRR bits
+
+#define CYGHWR_HAL_STM32_UART_BRR_DIVF(__f)      VALUE_(0,__f)
+#define CYGHWR_HAL_STM32_UART_BRR_DIVM(__m)      VALUE_(4,__m)
+
+// CR1 bits
+
+#define CYGHWR_HAL_STM32_UART_CR1_SBK           BIT_(0)
+#define CYGHWR_HAL_STM32_UART_CR1_RWU           BIT_(1)
+#define CYGHWR_HAL_STM32_UART_CR1_RE            BIT_(2)
+#define CYGHWR_HAL_STM32_UART_CR1_TE            BIT_(3)
+#define CYGHWR_HAL_STM32_UART_CR1_IDLEIE        BIT_(4)
+#define CYGHWR_HAL_STM32_UART_CR1_RXNEIE        BIT_(5)
+#define CYGHWR_HAL_STM32_UART_CR1_TCIE          BIT_(6)
+#define CYGHWR_HAL_STM32_UART_CR1_TXEIE         BIT_(7)
+#define CYGHWR_HAL_STM32_UART_CR1_PEIE          BIT_(8)
+#define CYGHWR_HAL_STM32_UART_CR1_PS_EVEN       0
+#define CYGHWR_HAL_STM32_UART_CR1_PS_ODD        BIT_(9)
+#define CYGHWR_HAL_STM32_UART_CR1_PCE           BIT_(10)
+#define CYGHWR_HAL_STM32_UART_CR1_WAKE          BIT_(11)
+#define CYGHWR_HAL_STM32_UART_CR1_M_8           0
+#define CYGHWR_HAL_STM32_UART_CR1_M_9           BIT_(12)
+#define CYGHWR_HAL_STM32_UART_CR1_UE            BIT_(13)
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+#define CYGHWR_HAL_STM32_UART_CR1_OVER8         BIT_(15)
+#endif
+
+// CR2 bits
+
+#define CYGHWR_HAL_STM32_UART_CR2_ADD(__a)      VALUE_(0,__a)
+#define CYGHWR_HAL_STM32_UART_CR2_LBDL          BIT_(5)
+#define CYGHWR_HAL_STM32_UART_CR2_LBDIE         BIT_(6)
+#define CYGHWR_HAL_STM32_UART_CR2_LBCL          BIT_(8)
+#define CYGHWR_HAL_STM32_UART_CR2_CPHA          BIT_(9)
+#define CYGHWR_HAL_STM32_UART_CR2_CPOL          BIT_(10)
+#define CYGHWR_HAL_STM32_UART_CR2_CLKEN         BIT_(11)
+#define CYGHWR_HAL_STM32_UART_CR2_STOP_1        VALUE_(12,0)
+#define CYGHWR_HAL_STM32_UART_CR2_STOP_0_5      VALUE_(12,1)
+#define CYGHWR_HAL_STM32_UART_CR2_STOP_2        VALUE_(12,2)
+#define CYGHWR_HAL_STM32_UART_CR2_STOP_1_5      VALUE_(12,3)
+#define CYGHWR_HAL_STM32_UART_CR2_LINEN         BIT_(14)
+
+// CR3 bits
+
+#define CYGHWR_HAL_STM32_UART_CR3_EIE           BIT_(0)
+#define CYGHWR_HAL_STM32_UART_CR3_IREN          BIT_(1)
+#define CYGHWR_HAL_STM32_UART_CR3_IRLP          BIT_(2)
+#define CYGHWR_HAL_STM32_UART_CR3_HDSEL         BIT_(3)
+#define CYGHWR_HAL_STM32_UART_CR3_NACK          BIT_(4)
+#define CYGHWR_HAL_STM32_UART_CR3_SCEN          BIT_(5)
+#define CYGHWR_HAL_STM32_UART_CR3_DMAR          BIT_(6)
+#define CYGHWR_HAL_STM32_UART_CR3_DMAT          BIT_(7)
+#define CYGHWR_HAL_STM32_UART_CR3_RTSE          BIT_(8)
+#define CYGHWR_HAL_STM32_UART_CR3_CTSE          BIT_(9)
+#define CYGHWR_HAL_STM32_UART_CR3_CTSIE         BIT_(10)
+
+// GTPR fields
+
+#define CYGHWR_HAL_STM32_UART_GTPR_PSC(__p)     VALUE_(0,__p)
+#define CYGHWR_HAL_STM32_UART_GTPR_GT(__g)      VALUE_(8,__g)
+
+// UART GPIO pins
+
+// NOTE: For those UARTS providing a RTS pin the driver uses HW CTS control but
+// manually controls the RTS as a GPIO.
+
+#ifndef CYGHWR_HAL_STM32_UART0_REMAP
+#define CYGHWR_HAL_STM32_UART1_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  A, 10,  7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART1_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( A,  9,  7, PUSHPULL, NONE,    50MHZ )
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART1_REMAP_CONFIG     0
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+#else // CYGHWR_HAL_STM32_UART0_REMAP
+#define CYGHWR_HAL_STM32_UART1_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  B,  7,  7, NA  ,     FLOATING )
+#define CYGHWR_HAL_STM32_UART1_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B,  6,  7, PUSHPULL, NONE,    50MHZ )
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART1_REMAP_CONFIG     CYGHWR_HAL_STM32_AFIO_MAPR_URT1_RMP
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+#endif // else CYGHWR_HAL_STM32_UART0_REMAP
+
+#define CYGHWR_HAL_STM32_UART1_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  A, 11,  7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART1_RTS              CYGHWR_HAL_STM32_PIN_OUT( A, 12, PUSHPULL, NONE, 50MHZ )
+
+#define CYGHWR_HAL_STM32_UART1_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB2, UART1 )
+
+#ifndef CYGHWR_HAL_STM32_UART1_REMAP
+#define CYGHWR_HAL_STM32_UART2_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  A,  3, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART2_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( A,  2, 7, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART2_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  A,  0, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART2_RTS              CYGHWR_HAL_STM32_PIN_OUT( A, 1, PUSHPULL, NONE, 50MHZ )
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART2_REMAP_CONFIG     0
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+#else
+#define CYGHWR_HAL_STM32_UART2_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  D,  6, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART2_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( D,  5, 7, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART2_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  D,  3, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART2_RTS              CYGHWR_HAL_STM32_PIN_OUT( D,  4, PUSHPULL, NONE, 50MHZ )
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART2_REMAP_CONFIG     CYGHWR_HAL_STM32_AFIO_MAPR_URT2_RMP
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+#endif
+
+#define CYGHWR_HAL_STM32_UART2_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, UART2 )
+
+#if defined(CYGHWR_HAL_STM32_UART2_REMAP_PARTIAL)
+
+#define CYGHWR_HAL_STM32_UART3_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  C, 11, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART3_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 10, 7, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART3_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  B, 13, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART3_RTS              CYGHWR_HAL_STM32_PIN_OUT( B, 14, PUSHPULL, NONE, 50MHZ )
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART3_REMAP_CONFIG     CYGHWR_HAL_STM32_AFIO_MAPR_URT3_P1_RMP
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+
+#elif defined(CYGHWR_HAL_STM32_UART2_REMAP_FULL)
+
+#define CYGHWR_HAL_STM32_UART3_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  D,  9, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART3_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( D,  8, 7, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART3_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  D, 11, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART3_RTS              CYGHWR_HAL_STM32_PIN_OUT( D, 12, PUSHPULL, NONE, 50MHZ )
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART3_REMAP_CONFIG     CYGHWR_HAL_STM32_AFIO_MAPR_URT3_FL_RMP
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+
+#else
+
+#define CYGHWR_HAL_STM32_UART3_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  B, 11, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART3_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( B, 10, 7, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART3_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  B, 13, 7, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART3_RTS              CYGHWR_HAL_STM32_PIN_OUT( B, 14, PUSHPULL, NONE, 50MHZ )
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART3_REMAP_CONFIG     CYGHWR_HAL_STM32_AFIO_MAPR_URT3_NO_RMP
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+
+#endif
+
+#define CYGHWR_HAL_STM32_UART3_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, UART3 )
+
+#define CYGHWR_HAL_STM32_UART4_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  C, 11, 8, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART4_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 10, 8, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART4_CTS              CYGHWR_HAL_STM32_GPIO_NONE
+#define CYGHWR_HAL_STM32_UART4_RTS              CYGHWR_HAL_STM32_GPIO_NONE
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART4_REMAP_CONFIG     0
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+
+#define CYGHWR_HAL_STM32_UART4_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, UART4 )
+
+#define CYGHWR_HAL_STM32_UART5_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  D,  2, 8, NA,       FLOATING )
+#define CYGHWR_HAL_STM32_UART5_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C, 12, 8, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART5_CTS              CYGHWR_HAL_STM32_GPIO_NONE
+#define CYGHWR_HAL_STM32_UART5_RTS              CYGHWR_HAL_STM32_GPIO_NONE
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+#define CYGHWR_HAL_STM32_UART5_REMAP_CONFIG     0
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1
+
+#define CYGHWR_HAL_STM32_UART5_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB1, UART5 )
+
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#define CYGHWR_HAL_STM32_UART6_RX               CYGHWR_HAL_STM32_PIN_ALTFN_IN(  C,  7, 8, NA,       NONE )
+#define CYGHWR_HAL_STM32_UART6_TX               CYGHWR_HAL_STM32_PIN_ALTFN_OUT( C,  6, 8, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART6_CTS              CYGHWR_HAL_STM32_PIN_ALTFN_IN(  G, 15, 8, NA,       NONE )
+#define CYGHWR_HAL_STM32_UART6_RTS              CYGHWR_HAL_STM32_PIN_ALTFN_OUT( G,  8, 8, PUSHPULL, NONE, 50MHZ )
+#define CYGHWR_HAL_STM32_UART6_CLOCK            CYGHWR_HAL_STM32_CLOCK( APB2, UART6 )
+
+#endif // CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE
+
+#ifndef __ASSEMBLER__
+
+__externC void hal_stm32_uart_setbaud( CYG_ADDRESS uart, cyg_uint32 baud );
+
+#endif
+
+#endif // CYGONCE_HAL_VAR_IO_USART_H
+//-----------------------------------------------------------------------------
+// end of var_io_usart.h
--- a/packages/hal/cortexm/stm32/var/current/src/hal_diag.c
+++ b/packages/hal/cortexm/stm32/var/current/src/hal_diag.c
@@ -72,26 +72,56 @@ typedef struct {
     int                 isr_vector;
     cyg_uint32          rxpin;
     cyg_uint32          txpin;
+    cyg_uint32          clkena;
+#if defined(CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+    cyg_uint32          remap;
+#endif
     cyg_uint32          baud_rate;
     int                 irq_state;
     
 } channel_data_t;
 
+// If remap isn't supported (e.g. F2/F4 parts) just #define to nothing. The struct initialiser will still work.
+#ifndef CYGHWR_HAL_STM32_UART1_REMAP_CONFIG
+#define CYGHWR_HAL_STM32_UART1_REMAP_CONFIG
+#endif
+#ifndef CYGHWR_HAL_STM32_UART2_REMAP_CONFIG
+#define CYGHWR_HAL_STM32_UART2_REMAP_CONFIG
+#endif
+#ifndef CYGHWR_HAL_STM32_UART3_REMAP_CONFIG
+#define CYGHWR_HAL_STM32_UART3_REMAP_CONFIG
+#endif
+#ifndef CYGHWR_HAL_STM32_UART4_REMAP_CONFIG
+#define CYGHWR_HAL_STM32_UART4_REMAP_CONFIG
+#endif
+#ifndef CYGHWR_HAL_STM32_UART5_REMAP_CONFIG
+#define CYGHWR_HAL_STM32_UART5_REMAP_CONFIG
+#endif
+
 static channel_data_t stm32_ser_channels[] = {
 #if CYGINT_HAL_STM32_UART0>0
-    { 0, CYGHWR_HAL_STM32_UART1, 1000, CYGNUM_HAL_INTERRUPT_UART1, CYGHWR_HAL_STM32_UART1_RX, CYGHWR_HAL_STM32_UART1_TX },
+    { 0, CYGHWR_HAL_STM32_UART1, 1000, CYGNUM_HAL_INTERRUPT_UART1, CYGHWR_HAL_STM32_UART1_RX, CYGHWR_HAL_STM32_UART1_TX,
+      CYGHWR_HAL_STM32_UART1_CLOCK, CYGHWR_HAL_STM32_UART1_REMAP_CONFIG },
 #endif
 #if CYGINT_HAL_STM32_UART1>0
-    { 1, CYGHWR_HAL_STM32_UART2, 1000, CYGNUM_HAL_INTERRUPT_UART2, CYGHWR_HAL_STM32_UART2_RX, CYGHWR_HAL_STM32_UART2_TX },
+    { 1, CYGHWR_HAL_STM32_UART2, 1000, CYGNUM_HAL_INTERRUPT_UART2, CYGHWR_HAL_STM32_UART2_RX, CYGHWR_HAL_STM32_UART2_TX,
+      CYGHWR_HAL_STM32_UART2_CLOCK, CYGHWR_HAL_STM32_UART2_REMAP_CONFIG },
 #endif
 #if CYGINT_HAL_STM32_UART2>0
-    { 2, CYGHWR_HAL_STM32_UART3, 1000, CYGNUM_HAL_INTERRUPT_UART3, CYGHWR_HAL_STM32_UART3_RX, CYGHWR_HAL_STM32_UART3_TX },
+    { 2, CYGHWR_HAL_STM32_UART3, 1000, CYGNUM_HAL_INTERRUPT_UART3, CYGHWR_HAL_STM32_UART3_RX, CYGHWR_HAL_STM32_UART3_TX,
+      CYGHWR_HAL_STM32_UART3_CLOCK, CYGHWR_HAL_STM32_UART3_REMAP_CONFIG },
 #endif
 #if CYGINT_HAL_STM32_UART3>0
-    { 3, CYGHWR_HAL_STM32_UART4, 1000, CYGNUM_HAL_INTERRUPT_UART4, CYGHWR_HAL_STM32_UART4_RX, CYGHWR_HAL_STM32_UART4_TX },
+    { 3, CYGHWR_HAL_STM32_UART4, 1000, CYGNUM_HAL_INTERRUPT_UART4, CYGHWR_HAL_STM32_UART4_RX, CYGHWR_HAL_STM32_UART4_TX,
+      CYGHWR_HAL_STM32_UART4_CLOCK, CYGHWR_HAL_STM32_UART4_REMAP_CONFIG },
 #endif
 #if CYGINT_HAL_STM32_UART4>0
-    { 4, CYGHWR_HAL_STM32_UART5, 1000, CYGNUM_HAL_INTERRUPT_UART5, CYGHWR_HAL_STM32_UART5_RX, CYGHWR_HAL_STM32_UART5_TX },
+    { 4, CYGHWR_HAL_STM32_UART5, 1000, CYGNUM_HAL_INTERRUPT_UART5, CYGHWR_HAL_STM32_UART5_RX, CYGHWR_HAL_STM32_UART5_TX,
+      CYGHWR_HAL_STM32_UART5_CLOCK, CYGHWR_HAL_STM32_UART5_REMAP_CONFIG },
+#endif
+#if CYGINT_HAL_STM32_UART5>0
+    { 5, CYGHWR_HAL_STM32_UART6, 1000, CYGNUM_HAL_INTERRUPT_UART6, CYGHWR_HAL_STM32_UART6_RX, CYGHWR_HAL_STM32_UART6_TX,
+      CYGHWR_HAL_STM32_UART6_CLOCK },  // UART6 only supported on F2/F4 so no remap config needed.
 #endif
 };
 
@@ -108,6 +138,19 @@ hal_stm32_serial_init_channel(void* __ch
 
     CYGHWR_HAL_STM32_GPIO_SET( chan->rxpin );
     CYGHWR_HAL_STM32_GPIO_SET( chan->txpin );
+    CYGHWR_HAL_STM32_CLOCK_ENABLE( chan->clkena );
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+    if( chan->remap != 0 )
+    {
+        CYG_ADDRESS afio = CYGHWR_HAL_STM32_AFIO;
+        cyg_uint32 mapr;
+        CYGHWR_HAL_STM32_CLOCK_ENABLE( CYGHWR_HAL_STM32_AFIO_CLOCK );
+        HAL_READ_UINT32( afio+CYGHWR_HAL_STM32_AFIO_MAPR, mapr );
+        mapr |= chan->remap;
+        HAL_WRITE_UINT32( afio+CYGHWR_HAL_STM32_AFIO_MAPR, mapr );
+    }
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
 
     cr2 = CYGHWR_HAL_STM32_UART_CR2_STOP_1;
     HAL_WRITE_UINT32( base+CYGHWR_HAL_STM32_UART_CR2, cr2 );
new file mode 100644
--- /dev/null
+++ b/packages/hal/cortexm/stm32/var/current/src/stm32_dma.c
@@ -0,0 +1,308 @@
+/*=============================================================================
+//
+//      stm32_dma.c
+//
+//      STM32 DMA support
+//
+//=============================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####                                            
+// -------------------------------------------                              
+// This file is part of eCos, the Embedded Configurable Operating System.   
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under    
+// the terms of the GNU General Public License as published by the Free     
+// Software Foundation; either version 2 or (at your option) any later      
+// version.                                                                 
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT      
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or    
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License    
+// for more details.                                                        
+//
+// You should have received a copy of the GNU General Public License        
+// along with eCos; if not, write to the Free Software Foundation, Inc.,    
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.            
+//
+// As a special exception, if other files instantiate templates or use      
+// macros or inline functions from this file, or you compile this file      
+// and link it with other works to produce a work based on this file,       
+// this file does not by itself cause the resulting work to be covered by   
+// the GNU General Public License. However the source code for this file    
+// must still be made available in accordance with section (3) of the GNU   
+// General Public License v2.                                               
+//
+// This exception does not invalidate any other reasons why a work based    
+// on this file might be covered by the GNU General Public License.         
+// -------------------------------------------                              
+// ####ECOSGPLCOPYRIGHTEND####                                              
+//=============================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):    nickg
+// Contributors: 
+// Date:         2009-10-11
+// Purpose:      STM32 DMA support
+// Description:  This file provides the implementation for the STM32's
+//               on-chip DMA controllers.
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================*/
+
+#include <pkgconf/system.h>
+#include <pkgconf/hal_cortexm_stm32.h>
+
+#include <cyg/hal/hal_io.h>
+#include <cyg/hal/hal_intr.h>
+#include <cyg/hal/var_dma.h>
+
+#include <cyg/infra/diag.h>
+#include <cyg/infra/cyg_ass.h>
+
+//=============================================================================
+
+#if 0
+#define dma_diag( __fmt, ... ) diag_printf("DMA: %20s[%3d]: " __fmt, __FUNCTION__, __LINE__, ## __VA_ARGS__ );
+#define dma_dump_buf(__addr, __size ) diag_dump_buf( __addr, __size )
+#else
+#define dma_diag( __fmt, ... )
+#define dma_dump_buf(__addr, __size )
+#endif
+
+//=============================================================================
+
+static const struct
+{
+    CYG_ADDRWORD        base;
+    cyg_uint32          clock;
+} hal_stm32_dma_controller[] =
+{
+    { 0, 0 },
+    { CYGHWR_HAL_STM32_DMA1, CYGHWR_HAL_STM32_DMA1_CLOCK },
+    { CYGHWR_HAL_STM32_DMA2, CYGHWR_HAL_STM32_DMA2_CLOCK },
+};
+
+//-----------------------------------------------------------------------------
+
+static cyg_uint32 hal_stm32_dma_isr( cyg_vector_t vector, CYG_ADDRWORD data )
+{
+    hal_stm32_dma_stream *stream = (hal_stm32_dma_stream *)data;
+    cyg_uint32 ret = CYG_ISR_HANDLED;    
+    cyg_uint32 isr;
+
+    HAL_READ_UINT32( stream->ctlr+CYGHWR_HAL_STM32_DMA_ISR_REG(stream->stream), isr );
+
+    dma_diag("ctlr %08x stream %d chan %d isr %08x\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc), isr );
+
+    if( isr & CYGHWR_HAL_STM32_DMA_ISR_TCIF(stream->stream) )
+    {
+        // Clear all stream interrupt bits
+        HAL_WRITE_UINT32( stream->ctlr+CYGHWR_HAL_STM32_DMA_IFCR_REG(stream->stream),
+                          CYGHWR_HAL_STM32_DMA_IFCR_MASK(stream->stream) );
+        
+        if( (stream->ccr & CYGHWR_HAL_STM32_DMA_CCR_CIRC) == 0)
+        {
+            // Disable the stream
+            HAL_WRITE_UINT32( stream->ctlr+CYGHWR_HAL_STM32_DMA_CCR(stream->stream), 0 );
+        }
+
+        // Update the count
+        HAL_READ_UINT32( stream->ctlr+CYGHWR_HAL_STM32_DMA_CNDTR(stream->stream), stream->count );
+
+        ret = CYG_ISR_CALL_DSR;
+    }
+
+    return ret;
+}
+
+//-----------------------------------------------------------------------------
+
+static void hal_stm32_dma_dsr( cyg_vector_t vector, cyg_ucount32 count, CYG_ADDRWORD data )
+{
+    hal_stm32_dma_stream *stream = (hal_stm32_dma_stream *)data;
+
+    dma_diag("ctlr %08x stream %d chan %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc) );
+    
+    stream->callback( stream, stream->count, stream->data );
+
+    stream->active = false;    
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_init( hal_stm32_dma_stream *stream, int pri )
+{
+    stream->ctlr = hal_stm32_dma_controller[CYGHWR_HAL_STM32_DMA_CONTROLLER(stream->desc)].base;
+    stream->stream = CYGHWR_HAL_STM32_DMA_STREAM(stream->desc);
+
+    dma_diag("ctlr %08x stream %d chan %d pri %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc), pri );
+             
+    cyg_drv_interrupt_create( CYGHWR_HAL_STM32_DMA_INTERRUPT(stream->desc),
+                              pri,
+                              (CYG_ADDRWORD)stream,
+                              hal_stm32_dma_isr,
+                              hal_stm32_dma_dsr,
+                              &stream->handle,
+                              &stream->interrupt );
+    cyg_drv_interrupt_attach( stream->handle );
+    cyg_drv_interrupt_unmask( CYGHWR_HAL_STM32_DMA_INTERRUPT(stream->desc) );
+
+    // Enable DMA controller clock
+    CYGHWR_HAL_STM32_CLOCK_ENABLE( hal_stm32_dma_controller[CYGHWR_HAL_STM32_DMA_CONTROLLER(stream->desc)].clock );
+
+
+    // Clear CCR, disable channel and put into known state
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CCR(stream->stream), 0 );
+
+    
+    // Initialize a private copy of the CCR, we don't write this to
+    // the hardware until we are ready to start the transfer.
+
+    stream->ccr = CYGHWR_HAL_STM32_DMA_CCR_EN;
+
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+    // Select channel number in F2/F4 variants. The F1 variants simply
+    // have the various device DMA request lines wire-ORed together.
+    stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_CHSEL(CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc));
+#endif
+    
+    // Set stream direction
+    if( CYGHWR_HAL_STM32_DMA_MODE(stream->desc) == CYGHWR_HAL_STM32_DMA_MODE_M2P )
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_MEM2P;
+
+    // Set memory increment mode
+    stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_MINC;
+           
+    // Transfer end interrupt enable
+    stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_TCIE;
+
+    // Use top 2 bits of priority to define DMA stream priority
+    stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_PL((pri>>6)&3);
+    
+    dma_diag("ccr %08x\n", stream->ccr);
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_delete( hal_stm32_dma_stream *stream )
+{
+    dma_diag("ctlr %08x stream %d chan %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc) );
+
+    // Clear CCR, disables stream
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CCR(stream->stream), 0 );
+
+    // Mask, detach and delete interrupt object
+    cyg_drv_interrupt_mask( CYGHWR_HAL_STM32_DMA_INTERRUPT(stream->desc) );
+    cyg_drv_interrupt_detach( stream->handle );
+    cyg_drv_interrupt_delete( stream->handle );
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_disable( hal_stm32_dma_stream *stream )
+{
+    dma_diag("ctlr %08x stream %d chan %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc) );
+
+    // Clear CCR, disables stream
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CCR(stream->stream), 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_poll( hal_stm32_dma_stream *stream )
+{
+//    dma_diag("ctlr %08x stream %d chan %d\n", stream->ctlr, stream->stream,
+//             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc) );
+    
+    if( stream->active )
+        if( hal_stm32_dma_isr( CYGHWR_HAL_STM32_DMA_INTERRUPT(stream->desc), (CYG_ADDRWORD)stream ) & CYG_ISR_CALL_DSR )
+            hal_stm32_dma_dsr( CYGHWR_HAL_STM32_DMA_INTERRUPT(stream->desc), 1, (CYG_ADDRWORD)stream );
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_configure( hal_stm32_dma_stream *stream, int tfr_size, cyg_bool no_minc, cyg_bool polled  )
+{
+    dma_diag("ctlr %08x stream %d chan %d tfr_size %d no_minc %d polled %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc), tfr_size, no_minc, polled );
+    
+    if( tfr_size == 8 )
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_PSIZE8 | CYGHWR_HAL_STM32_DMA_CCR_MSIZE8;
+    else if( tfr_size == 16 )
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_PSIZE16 | CYGHWR_HAL_STM32_DMA_CCR_MSIZE16;
+    else 
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_PSIZE32 | CYGHWR_HAL_STM32_DMA_CCR_MSIZE32;
+
+    // Clear MINC bit if not wanted
+    if( no_minc )
+        stream->ccr &= ~CYGHWR_HAL_STM32_DMA_CCR_MINC;
+    else
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_MINC;
+
+    // Clear interrupt enables if polled mode, otherwise enable them
+    if( polled )
+        stream->ccr &= ~(CYGHWR_HAL_STM32_DMA_CCR_TCIE | CYGHWR_HAL_STM32_DMA_CCR_TEIE);
+    else
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_TCIE | CYGHWR_HAL_STM32_DMA_CCR_TEIE;
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_configure_circular( hal_stm32_dma_stream *stream, cyg_bool enable)
+{
+    if (enable) {
+        stream->ccr |= CYGHWR_HAL_STM32_DMA_CCR_CIRC;
+    } else {
+        stream->ccr &= ~CYGHWR_HAL_STM32_DMA_CCR_CIRC;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void hal_stm32_dma_start( hal_stm32_dma_stream *stream, void *memory, CYG_ADDRESS peripheral, cyg_uint32 size )
+{
+    dma_diag("ctlr %08x stream %d chan %d mem %08x peri %08x size %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc), memory, peripheral, size );
+
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CMAR(stream->stream), (cyg_uint32)memory );
+
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CPAR(stream->stream), peripheral );
+
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CNDTR(stream->stream), size );
+
+    HAL_WRITE_UINT32(stream->ctlr+CYGHWR_HAL_STM32_DMA_CCR(stream->stream), stream->ccr );
+
+    stream->active = true;
+}
+
+//=============================================================================
+
+void hal_stm32_dma_show( hal_stm32_dma_stream *stream )
+{
+    cyg_uint32 dma = stream->ctlr;
+    cyg_uint32 chan = stream->stream;
+    cyg_uint32 reg;
+    
+    dma_diag("ctlr %08x stream %d chan %d\n", stream->ctlr, stream->stream,
+             CYGHWR_HAL_STM32_DMA_CHANNEL(stream->desc) );
+    dma_diag("vector %d stream->ccr %08x\n", CYGHWR_HAL_STM32_DMA_INTERRUPT(stream->desc), stream->ccr );
+
+    HAL_READ_UINT32( dma+CYGHWR_HAL_STM32_DMA_ISR_REG(chan), reg );
+    dma_diag("DMA   ISR:   %08x\n", reg );
+    
+    HAL_READ_UINT32( dma+CYGHWR_HAL_STM32_DMA_CCR(chan), reg );   dma_diag("DMA %d CCR:   %08x\n", chan, reg );
+    HAL_READ_UINT32( dma+CYGHWR_HAL_STM32_DMA_CNDTR(chan), reg ); dma_diag("DMA %d CNDTR: %08x\n", chan, reg );
+    HAL_READ_UINT32( dma+CYGHWR_HAL_STM32_DMA_CPAR(chan), reg );  dma_diag("DMA %d CPAR:  %08x\n", chan, reg );
+    HAL_READ_UINT32( dma+CYGHWR_HAL_STM32_DMA_CMAR(chan), reg );  dma_diag("DMA %d CMAR:  %08x\n", chan, reg );
+    
+}
+
+
+//=============================================================================
+/* EOF stm32_dma.c */
--- a/packages/hal/cortexm/stm32/var/current/src/stm32_misc.c
+++ b/packages/hal/cortexm/stm32/var/current/src/stm32_misc.c
@@ -127,6 +127,9 @@ cyg_uint32 hal_stm32_hclk;
 cyg_uint32 hal_stm32_pclk1;
 cyg_uint32 hal_stm32_pclk2;
 cyg_uint32 hal_cortexm_systick_clock;
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+cyg_uint32 hal_stm32_qclk;
+#endif
 
 void hal_start_clocks( void );
 cyg_uint32 hal_exti_isr( cyg_uint32 vector, CYG_ADDRWORD data );
@@ -135,11 +138,6 @@ cyg_uint32 hal_exti_isr( cyg_uint32 vect
 
 void hal_variant_init( void )
 {
-    CYG_ADDRESS rcc = CYGHWR_HAL_STM32_RCC;
-
-    // Enable all devices in RCC
-    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_APB2ENR, 0xFFFFFFFF );
-    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_APB1ENR, 0xFFFFFFFF );
 
 #if 1 //!defined(CYG_HAL_STARTUP_RAM)
     hal_start_clocks();
@@ -167,15 +165,11 @@ void hal_start_clocks( void )
     
     // Reset RCC
 
-    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, 0x00000001 );
+    cr = CYGHWR_HAL_STM32_RCC_CR_HSION;
+    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
     
     // Start up HSE clock
     
-    HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
-    cr &= ~(CYGHWR_HAL_STM32_RCC_CR_HSEON|CYGHWR_HAL_STM32_RCC_CR_HSEBYP);
-    HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
-
-    HAL_READ_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
     cr |= CYGHWR_HAL_STM32_RCC_CR_HSEON;
     HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CR, cr );
     
@@ -188,25 +182,78 @@ void hal_start_clocks( void )
 
     // Configure clocks
     
-    hal_stm32_sysclk = CYGARC_HAL_CORTEXM_STM32_INPUT_CLOCK;
+    // Temporarily divide by 4 until we've dealt with potential large
+    // multiplications overflow.
+    hal_stm32_sysclk = CYGARC_HAL_CORTEXM_STM32_INPUT_CLOCK >> 2;
     
     cfgr = 0;
 
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
+
 #if defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSE)
     cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLSRC_HSE;
-#elif defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSE_HALF)
-    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLSRC_HSE |
-            CYGHWR_HAL_STM32_RCC_CFGR_PLLXTPRE;
+#endif
+
+    // Just a little sanity check.
+#if defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSI) && (CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV != 2)
+# error PLL PREDIV must be 2
+#endif
+
+    // Ordering could be important if divisions below cause truncation, so multiply first.
+    hal_stm32_sysclk *= CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL;
+
+#ifdef CYGHWR_HAL_CORTEXM_STM32_CONNECTIVITY
+    HAL_WRITE_UINT32( rcc + CYGHWR_HAL_STM32_RCC_CFGR2,
+                      CYGHWR_HAL_STM32_RCC_CFGR2_PREDIV1(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV-1) );
+    hal_stm32_sysclk /= CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV;
+#else
+    // Non-connectivity parts can only use PLLXTPRE
+    if ( CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV == 2 )
+    {
+        cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLXTPRE; // irrelevant if HSI used, so just set anyway.
     hal_stm32_sysclk /= 2;
-#elif defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSI_HALF)
-    hal_stm32_sysclk /= 2;
+    }
 #endif
+    hal_stm32_sysclk <<= 2; // return to correct range now we've dealt with risk of overflow.
     
     cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PLLMUL(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL);
     cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_HPRE;
     cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PPRE1;
     cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PPRE2;
 
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
+#if defined(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_SOURCE_HSE)
+    cfgr |= CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLSRC_HSE;
+#endif
+
+    cfgr |= CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLM(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV);
+    cfgr |= CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLN(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL);
+    // Ordering could be important if divisions below cause truncation, so multiply first.
+    hal_stm32_sysclk *= CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL;
+    hal_stm32_sysclk /= CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_PREDIV;
+
+    hal_stm32_sysclk <<= 2; // return to correct range now we've dealt with risk of overflow.
+
+    cfgr |= CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLP(CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV);
+    cfgr |= CYGHWR_HAL_STM32_RCC_PLLCFGR_PLLQ(CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV);
+
+    // qclk divides down VCO output, so calc it first before updating sysclk for PLLP
+    hal_stm32_qclk = hal_stm32_sysclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLLQ_DIV;
+
+    hal_stm32_sysclk /= CYGHWR_HAL_CORTEXM_STM32_CLOCK_SYSCLK_DIV;
+
+    HAL_WRITE_UINT32( rcc + CYGHWR_HAL_STM32_RCC_PLLCFGR, cfgr );
+
+    cfgr  = CYGHWR_HAL_STM32_RCC_CFGR_HPRE;
+    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PPRE1;
+    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_PPRE2;
+
+    // RTCPRE divides down HSE, which is the input clock. Must be 1MHz.
+    cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_RTCPRE( CYGARC_HAL_CORTEXM_STM32_INPUT_CLOCK/1000000 );
+
+#endif // elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+
     HAL_WRITE_UINT32( rcc+CYGHWR_HAL_STM32_RCC_CFGR, cfgr );
 
     // Enable the PLL and wait for it to lock
@@ -220,6 +267,7 @@ void hal_start_clocks( void )
     } while( !(cr & CYGHWR_HAL_STM32_RCC_CR_PLLRDY) );
 
     // Now switch to use PLL as SYSCLK
+    // TODO: make this configurable between HSI, HSE and PLL
     
     cfgr |= CYGHWR_HAL_STM32_RCC_CFGR_SW_PLL;
 
@@ -232,7 +280,6 @@ void hal_start_clocks( void )
 
     // Calculate clocks from configuration
 
-    hal_stm32_sysclk *= CYGHWR_HAL_CORTEXM_STM32_CLOCK_PLL_MUL;
     hal_stm32_hclk = hal_stm32_sysclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_HCLK_DIV;
     hal_stm32_pclk1 = hal_stm32_hclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK1_DIV;
     hal_stm32_pclk2 = hal_stm32_hclk / CYGHWR_HAL_CORTEXM_STM32_CLOCK_PCLK2_DIV;
@@ -281,6 +328,9 @@ cyg_uint32 hal_exti_isr( cyg_uint32 vect
 
 __externC void hal_stm32_gpio_set( cyg_uint32 pin )
 {
+  // FIXME: Power on GPIO ports selectively here, rather than
+  // platform having to power them all on for boot.
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
     cyg_uint32 port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
     int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
     cyg_uint32 cm = CYGHWR_HAL_STM32_GPIO_CFG(pin);
@@ -291,8 +341,7 @@ cyg_uint32 hal_exti_isr( cyg_uint32 vect
     
     if( bit > 7 ) port += 4, bit -= 8;
     HAL_READ_UINT32( port, cr );
-    cr &= ~(0xF<<(bit*4));
-    cr |= cm<<(bit*4);
+    CYGHWR_HAL_STM32_GPIO_CNFMODE_SET(bit,cm,cr);
     HAL_WRITE_UINT32( port, cr );
 
     // If this is a pullup/down input, set the ODR bit to switch on
@@ -309,26 +358,99 @@ cyg_uint32 hal_exti_isr( cyg_uint32 vect
             odr &= ~(1<<bit);
         HAL_WRITE_UINT32( port+CYGHWR_HAL_STM32_GPIO_ODR, odr );
     }
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+    CYG_ADDRESS port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
+    int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
+    cyg_uint32 mode = CYGHWR_HAL_STM32_GPIO_MODE(pin);
+    cyg_uint32 af = CYGHWR_HAL_STM32_GPIO_AF(pin);
+    cyg_uint32 od = CYGHWR_HAL_STM32_GPIO_OPENDRAIN(pin);
+    cyg_uint32 pupd = CYGHWR_HAL_STM32_GPIO_PULLUPDOWN(pin);
+    cyg_uint32 speed = CYGHWR_HAL_STM32_GPIO_SPEED(pin);
+    cyg_uint32 reg;
+
+    if( pin == CYGHWR_HAL_STM32_GPIO_NONE )
+        return;
+
+    
+    HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_OTYPER, reg );
+    CYGHWR_HAL_STM32_GPIO_OTYPE_SET( bit, od, reg );
+    HAL_WRITE_UINT32( port+CYGHWR_HAL_STM32_GPIO_OTYPER, reg );
+
+    HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_OSPEEDR, reg );
+    CYGHWR_HAL_STM32_GPIO_OSPEED_SET( bit, speed, reg );
+    HAL_WRITE_UINT32( port+CYGHWR_HAL_STM32_GPIO_OSPEEDR, reg );
+
+    HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_PUPDR, reg );
+    CYGHWR_HAL_STM32_GPIO_PUPD_SET( bit, pupd, reg );
+    HAL_WRITE_UINT32( port+CYGHWR_HAL_STM32_GPIO_PUPDR, reg );
+
+    if ( CYGHWR_HAL_STM32_GPIO_MODE_ALTFN == mode )
+    {
+        CYGHWR_HAL_STM32_GPIO_AFR_SET( port, bit, af );
+    }
+
+    HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_MODER, reg );
+    CYGHWR_HAL_STM32_GPIO_MODE_SET( bit, mode, reg );
+    HAL_WRITE_UINT32( port+CYGHWR_HAL_STM32_GPIO_MODER, reg );
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
 }
     
 __externC void hal_stm32_gpio_out( cyg_uint32 pin, int val )
 {
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
     cyg_uint32 port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
     int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
     
     port += CYGHWR_HAL_STM32_GPIO_BSRR;
     if( (val&1) == 0 ) port += 4;
     HAL_WRITE_UINT32( port, 1<<bit );
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+    CYG_ADDRESS port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
+    int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
+
+    CYGHWR_HAL_STM32_GPIO_BSRR_SET( port, bit, val );
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
 }
     
 __externC void hal_stm32_gpio_in ( cyg_uint32 pin, int *val )
 {
+#if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_F1)
     cyg_uint32 port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
     int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
     cyg_uint32 pd;
     
     HAL_READ_UINT32( port+CYGHWR_HAL_STM32_GPIO_IDR, pd );
     *val = (pd>>bit)&1;
+#elif defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+    CYG_ADDRESS port = CYGHWR_HAL_STM32_GPIO_PORT(pin);
+    int bit = CYGHWR_HAL_STM32_GPIO_BIT(pin);
+
+    CYGHWR_HAL_STM32_GPIO_IDR_GET( port, bit, *val );
+#endif // if defined (CYGHWR_HAL_CORTEXM_STM32_FAMILY_HIPERFORMANCE)
+}
+
+//==========================================================================
+// Clock support.
+//
+// These functions provide support for enabling and disabling clock
+// control bits.
+
+__externC void hal_stm32_clock_enable( cyg_uint32 desc )
+{
+    cyg_uint32 r;
+    cyg_uint32 reg = CYGHWR_HAL_STM32_RCC+CYGHWR_HAL_STM32_CLOCK_REG(desc);
+    HAL_READ_UINT32( reg, r );
+    r |= BIT_(CYGHWR_HAL_STM32_CLOCK_PIN(desc));
+    HAL_WRITE_UINT32( reg, r );
+}
+
+__externC void hal_stm32_clock_disable( cyg_uint32 desc )
+{
+    cyg_uint32 r;
+    cyg_uint32 reg = CYGHWR_HAL_STM32_RCC+CYGHWR_HAL_STM32_CLOCK_REG(desc);
+    HAL_READ_UINT32( reg, r );
+    r &= ~BIT_(CYGHWR_HAL_STM32_CLOCK_PIN(desc));
+    HAL_WRITE_UINT32( reg, r );
 }
 
 //==========================================================================
@@ -344,7 +466,6 @@ void hal_stm32_bd_protect( int protect )
         cr &= ~CYGHWR_HAL_STM32_PWR_CR_DBP;
     else
         cr |= CYGHWR_HAL_STM32_PWR_CR_DBP;        
-
     HAL_WRITE_UINT32( pwr+CYGHWR_HAL_STM32_PWR_CR, cr );
 }
 
@@ -360,8 +481,14 @@ void hal_stm32_uart_setbaud( cyg_uint32 
     cyg_uint32 int_div, frac_div;
     cyg_uint32 brr;
     
-    if( base == CYGHWR_HAL_STM32_UART1 )
+    if( base == CYGHWR_HAL_STM32_UART1 ||
+#ifdef CYGHWR_HAL_STM32_UART6
+        base == CYGHWR_HAL_STM32_UART6 ||
+#endif
+        0)
+    {
         apbclk = hal_stm32_pclk2;
+    }
 
     int_div = (25 * apbclk ) / (4 * baud );
     brr = ( int_div / 100 ) << 4;
--- a/packages/hal/cortexm/stm32/var/current/tests/timers.c
+++ b/packages/hal/cortexm/stm32/var/current/tests/timers.c
@@ -120,7 +120,11 @@ struct timer timers[] =
     { 5, CYGHWR_HAL_STM32_TIM5, CYGNUM_HAL_INTERRUPT_TIM5,    0x60,    1453 },
     { 6, CYGHWR_HAL_STM32_TIM6, CYGNUM_HAL_INTERRUPT_TIM6,    0x70,    1931 },
     { 7, CYGHWR_HAL_STM32_TIM7, CYGNUM_HAL_INTERRUPT_TIM7,    0x80,    2011 },
+#ifdef CYGNUM_HAL_INTERRUPT_TIM8_UP
     { 8, CYGHWR_HAL_STM32_TIM8, CYGNUM_HAL_INTERRUPT_TIM8_UP, 0x90,    2345 },    
+#elif defined(CYGNUM_HAL_INTERRUPT_TIM8_UP_TIM13)
+    { 8, CYGHWR_HAL_STM32_TIM8, CYGNUM_HAL_INTERRUPT_TIM8_UP_TIM13, 0x90,    2345 },
+#endif
 #endif
     { 0, 0, 0, 0 }
 };