Konstantin Oblaukhov 12 лет назад
Родитель
Сommit
b4405e486d

+ 118 - 0
cmake/Modules/ChibiOS.cmake

@@ -0,0 +1,118 @@
+IF(NOT CHIBIOS_ROOT)
+    SET(CHIBIOS_ROOT /usr/src/chibios)
+    MESSAGE(STATUS "No CHIBIOS_ROOT specified, using default: ${CHIBIOS_ROOT}")
+ENDIF()
+
+IF(STM32_FAMILY STREQUAL "F4")
+    SET(CHIBIOS_HAL_PLATFORM_SOURCES
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32F4xx/stm32_dma.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32F4xx/hal_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32F4xx/adc_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32F4xx/ext_lld_isr.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/GPIOv2/pal_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/I2Cv1/i2c_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/OTGv1/usb_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/RTCv2/rtc_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/SPIv1/spi_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/TIMv1/gpt_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/TIMv1/icu_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/TIMv1/pwm_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/USARTv1/serial_lld.c
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/USARTv1/uart_lld.c
+    )
+    SET(CHIBIOS_KERNEL_PLATFORM_SOURCES
+        ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx/STM32F4xx/vectors.c
+    )  
+    SET(CHIBIOS_HAL_PLATFORM_INCLUDE_DIRS
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32F4xx/
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/GPIOv2
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/I2Cv1
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/OTGv1
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/RTCv2
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/SPIv1
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/TIMv1
+        ${CHIBIOS_ROOT}/os/hal/platforms/STM32/USARTv1
+    )
+    SET(CHIBIOS_KERNEL_PLATFORM_INCLUDE_DIRS
+        ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx/STM32F4xx
+    )
+ENDIF()
+
+SET(CHIBIOS_HAL_PLATFORM_SOURCES ${CHIBIOS_HAL_PLATFORM_SOURCES}
+    ${CHIBIOS_ROOT}/os/hal/platforms/STM32/can_lld.c
+    ${CHIBIOS_ROOT}/os/hal/platforms/STM32/ext_lld.c
+    ${CHIBIOS_ROOT}/os/hal/platforms/STM32/mac_lld.c
+    ${CHIBIOS_ROOT}/os/hal/platforms/STM32/sdc_lld.c
+)  
+
+SET(CHIBIOS_KERNEL_PLATFORM_SOURCES ${CHIBIOS_KERNEL_PLATFORM_SOURCES}
+    ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx/crt0.c
+    ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx/chcore.c
+    ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx/chcore_v7m.c
+    ${CHIBIOS_ROOT}/os/ports/common/ARMCMx/nvic.c
+)
+
+SET(CHIBIOS_KERNEL_PLATFORM_INCLUDE_DIRS ${CHIBIOS_KERNEL_PLATFORM_INCLUDE_DIRS}
+    ${CHIBIOS_ROOT}/os/ports/common/ARMCMx
+    ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx
+)
+
+SET(CHIBIOS_HAL_INCLUDE_DIRS
+    ${CHIBIOS_ROOT}/os/hal/include
+)
+
+SET(CHIBIOS_HAL_SOURCES
+    ${CHIBIOS_ROOT}/os/hal/src/hal.c
+    ${CHIBIOS_ROOT}/os/hal/src/adc.c
+    ${CHIBIOS_ROOT}/os/hal/src/can.c
+    ${CHIBIOS_ROOT}/os/hal/src/ext.c
+    ${CHIBIOS_ROOT}/os/hal/src/gpt.c
+    ${CHIBIOS_ROOT}/os/hal/src/i2c.c
+    ${CHIBIOS_ROOT}/os/hal/src/icu.c
+    ${CHIBIOS_ROOT}/os/hal/src/mac.c
+    ${CHIBIOS_ROOT}/os/hal/src/mmc_spi.c
+    ${CHIBIOS_ROOT}/os/hal/src/mmcsd.c
+    ${CHIBIOS_ROOT}/os/hal/src/pal.c
+    ${CHIBIOS_ROOT}/os/hal/src/pwm.c
+    ${CHIBIOS_ROOT}/os/hal/src/rtc.c
+    ${CHIBIOS_ROOT}/os/hal/src/sdc.c
+    ${CHIBIOS_ROOT}/os/hal/src/serial.c
+    ${CHIBIOS_ROOT}/os/hal/src/serial_usb.c
+    ${CHIBIOS_ROOT}/os/hal/src/spi.c
+    ${CHIBIOS_ROOT}/os/hal/src/tm.c
+    ${CHIBIOS_ROOT}/os/hal/src/uart.c
+    ${CHIBIOS_ROOT}/os/hal/src/usb.c
+)
+
+SET(CHIBIOS_KERNEL_INCLUDE_DIRS
+    ${CHIBIOS_ROOT}/os/kernel/include
+)
+  
+SET(CHIBIOS_KERNEL_SOURCES  
+    ${CHIBIOS_ROOT}/os/kernel/src/chsys.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chdebug.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chlists.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chvt.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chschd.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chthreads.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chdynamic.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chregistry.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chsem.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chmtx.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chcond.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chevents.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chmsg.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chmboxes.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chqueues.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chmemcore.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chheap.c
+    ${CHIBIOS_ROOT}/os/kernel/src/chmempools.c
+)
+
+SET(CHIBIOS_VARIOUS_INCLUDE_DIRS
+    ${CHIBIOS_ROOT}/os/various/
+)
+
+SET(CHIBIOS_SOURCES ${CHIBIOS_KERNEL_PLATFORM_SOURCES} ${CHIBIOS_KERNEL_SOURCES} ${CHIBIOS_HAL_PLATFORM_SOURCES} ${CHIBIOS_HAL_SOURCES})
+SET(CHIBIOS_INCLUDE_DIRS ${CHIBIOS_KERNEL_PLATFORM_INCLUDE_DIRS} ${CHIBIOS_KERNEL_INCLUDE_DIRS} ${CHIBIOS_HAL_PLATFORM_INCLUDE_DIRS} ${CHIBIOS_HAL_INCLUDE_DIRS} ${CHIBIOS_VARIOUS_INCLUDE_DIRS})

+ 15 - 12
gcc_stm32.cmake

@@ -120,20 +120,23 @@ FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
 ENDFUNCTION()
 
 FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
-    IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
-        MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
-    ELSE()
-        STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
-        IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
-            MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
-        ENDIF()
+    IF(NOT STM32_CHIP_TYPE)
+        IF(NOT STM32_CHIP)
+            MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
+        ELSE()
+            STM32_GET_CHIP_TYPE(${STM32_CHIP} STM32_CHIP_TYPE)
+        ENDIF() 
+    ENDIF()
+    STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
+    IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
+        MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
+    ENDIF()
+    IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
+        STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
         IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
-            STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
-            IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
-                MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
-            ENDIF()
-            MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
+            MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
         ENDIF()
+        MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
     ENDIF()
     STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
 ENDFUNCTION()

+ 24 - 0
stm32-chibios/CMakeLists.txt

@@ -0,0 +1,24 @@
+PROJECT(stm32-chibios)
+
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+ENABLE_LANGUAGE(ASM)
+
+INCLUDE(ChibiOS)
+
+INCLUDE_DIRECTORIES(
+    ${CMAKE_CURRENT_SOURCE_DIR}    
+    ${CHIBIOS_INCLUDE_DIRS}
+)
+
+SET(PROJECT_SOURCES
+    main.c
+    board.c
+)
+
+SET(STM32_LINKER_SCRIPT ${CHIBIOS_ROOT}/os/ports/GCC/ARMCMx/STM32F4xx/ld/STM32F407xG_CCM.ld)
+
+ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CHIBIOS_SOURCES})
+TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME})
+
+STM32_SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME})
+STM32_ADD_HEX_BIN_TARGETS(${CMAKE_PROJECT_NAME})

+ 33 - 0
stm32-chibios/board.c

@@ -0,0 +1,33 @@
+#include "ch.h"
+#include "hal.h"
+
+const PALConfig pal_default_config =
+{
+    {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
+     VAL_GPIOA_ODR,   VAL_GPIOA_AFRL,   VAL_GPIOA_AFRH},
+    {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
+     VAL_GPIOB_ODR,   VAL_GPIOB_AFRL,   VAL_GPIOB_AFRH},
+    {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
+     VAL_GPIOC_ODR,   VAL_GPIOC_AFRL,   VAL_GPIOC_AFRH},
+    {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
+     VAL_GPIOD_ODR,   VAL_GPIOD_AFRL,   VAL_GPIOD_AFRH},
+    {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
+     VAL_GPIOE_ODR,   VAL_GPIOE_AFRL,   VAL_GPIOE_AFRH},
+    {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
+     VAL_GPIOF_ODR,   VAL_GPIOF_AFRL,   VAL_GPIOF_AFRH},
+    {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
+     VAL_GPIOG_ODR,   VAL_GPIOG_AFRL,   VAL_GPIOG_AFRH},
+    {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
+     VAL_GPIOH_ODR,   VAL_GPIOH_AFRL,   VAL_GPIOH_AFRH},
+    {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
+     VAL_GPIOI_ODR,   VAL_GPIOI_AFRL,   VAL_GPIOI_AFRH}
+};
+
+void __early_init(void) 
+{
+    stm32_clock_init();
+}
+
+void boardInit(void) 
+{
+}

+ 1267 - 0
stm32-chibios/board.h

@@ -0,0 +1,1267 @@
+#ifndef _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for STMicroelectronics WaveShare XCore407I/EVK407I board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_WAVESHARE_XCORE407I
+#define BOARD_NAME                  "WaveShare XCore407I/EVK407I"
+
+
+
+#if !defined(STM32_LSECLK)
+#define STM32_LSECLK                32768
+#endif
+
+#if !defined(STM32_HSECLK)
+#define STM32_HSECLK                8000000
+#endif
+
+#define STM32_VDD                   330
+
+#define GPIOA_PIN0                  0
+#define GPIOA_PIN1                  1
+#define GPIOA_MDIO                  2
+#define GPIOA_ULPI_D0               3
+#define GPIOA_PIN4                  4
+#define GPIOA_ULPI_CK               5
+#define GPIOA_PIN6                  6
+#define GPIOA_MII_CRS_DV            7
+#define GPIOA_PIN8                  8
+#define GPIOA_VBUS_FS               9
+#define GPIOA_OTG_FS_ID             10
+#define GPIOA_OTG_FS_DM             11
+#define GPIOA_OTG_FS_DP             12
+#define GPIOA_JTMS                  13
+#define GPIOA_JTCK                  14
+#define GPIOA_JTDI                  15
+
+#define GPIOB_ULPI_D1               0
+#define GPIOB_ULPI_D2               1
+#define GPIOB_PIN2                  2
+#define GPIOB_JTDO                  3
+#define GPIOB_NJTRST                4
+#define GPIOB_ULPI_D7               5
+#define GPIOB_PIN6                  6
+#define GPIOB_PIN7                  7
+#define GPIOB_PIN8                  8
+#define GPIOB_PIN9                  9
+#define GPIOB_ULPI_D3               10
+#define GPIOB_ULPI_D4               11
+#define GPIOB_ULPI_D5               12
+#define GPIOB_ULPI_D6               13
+#define GPIOB_PIN14                 14
+#define GPIOB_PIN15                 15
+
+#define GPIOC_ULPI_STP              0
+#define GPIOC_OTG_FS_POWER_ON       1
+#define GPIOC_PIN2                  2
+#define GPIOC_PIN3                  3
+#define GPIOC_MII_RX_D0            4
+#define GPIOC_MII_RX_D1            5
+#define GPIOC_TP_IRQ                6
+#define GPIOC_PIN7                  7
+#define GPIOC_PIN8                  8
+#define GPIOC_PIN9                  9
+#define GPIOC_USART3_TX             10
+#define GPIOC_USART3_RX             11
+#define GPIOC_PIN12                 12
+#define GPIOC_PIN13                 13
+#define GPIOC_OSC32_IN              14
+#define GPIOC_OSC32_OUT             15
+
+#define GPIOD_FSMC_D2               0
+#define GPIOD_FSMC_D3               1
+#define GPIOD_PIN2                  2
+#define GPIOD_PIN3                  3
+#define GPIOD_FSMC_NOE              4
+#define GPIOD_FSMC_NWE              5
+#define GPIOD_FSMC_NWAIT            6
+#define GPIOD_FSMC_NCE2             7
+#define GPIOD_FSMC_D13              8
+#define GPIOD_FSMC_D14              9
+#define GPIOD_FSMC_D15              10
+#define GPIOD_FSMC_A16              11
+#define GPIOD_FSMC_A17              12
+#define GPIOD_PIN13                 13
+#define GPIOD_FSMC_D0               14
+#define GPIOD_FSMC_D1               15
+
+#define GPIOE_PIN0                  0
+#define GPIOE_PIN1                  1
+#define GPIOE_JOY_A                 2
+#define GPIOE_JOY_B                 3
+#define GPIOE_JOY_C                 4
+#define GPIOE_JOY_D                 5
+#define GPIOE_JOY_PRESS             6
+#define GPIOE_FSMC_D4               7
+#define GPIOE_FSMC_D5               8
+#define GPIOE_FSMC_D6               9
+#define GPIOE_FSMC_D7               10
+#define GPIOE_FSMC_D8               11
+#define GPIOE_FSMC_D9               12
+#define GPIOE_FSMC_D10              13
+#define GPIOE_FSMC_D11              14
+#define GPIOE_FSMC_D12              15
+
+#define GPIOF_PIN0                  0
+#define GPIOF_PIN1                  1
+#define GPIOF_PIN2                  2
+#define GPIOF_PIN3                  3
+#define GPIOF_PIN4                  4
+#define GPIOF_PIN5                  5
+#define GPIOF_PIN6                  6
+#define GPIOF_LCD_PWM               7
+#define GPIOF_PIN8                  8
+#define GPIOF_PIN9                  9
+#define GPIOF_PIN10                 10
+#define GPIOF_PIN11                 11
+#define GPIOF_PIN12                 12
+#define GPIOF_PIN13                 13
+#define GPIOF_PIN14                 14
+#define GPIOF_PIN15                 15
+
+#define GPIOG_PIN0                  0
+#define GPIOG_PIN1                  1
+#define GPIOG_PIN2                  2
+#define GPIOG_PIN3                  3
+#define GPIOG_PIN4                  4
+#define GPIOG_FSMC_A15              5
+#define GPIOG_PIN6                  6
+#define GPIOG_PIN7                  7
+#define GPIOG_PIN8                  8
+#define GPIOG_PIN9                  9
+#define GPIOG_PIN10                 10
+#define GPIOG_MII_TX_EN             11
+#define GPIOG_PIN12                 12
+#define GPIOG_MII_TX_D0             13
+#define GPIOG_MII_TX_D1             14
+#define GPIOG_PIN15                 15
+
+#define GPIOH_OSC_IN                0
+#define GPIOH_OSC_OUT               1
+#define GPIOH_LED1                  2
+#define GPIOH_LED2                  3
+#define GPIOH_ULPI_NXT              4
+#define GPIOH_PIN5                  5
+#define GPIOH_PIN6                  6
+#define GPIOH_PIN7                  7
+#define GPIOH_PIN8                  8
+#define GPIOH_PIN9                  9
+#define GPIOH_PIN10                 10
+#define GPIOH_ULPI_RESET            11
+#define GPIOH_PIN12                 12
+#define GPIOH_PIN13                 13
+#define GPIOH_PIN14                 14
+#define GPIOH_PIN15                 15
+
+#define GPIOI_TP_CS                 0
+#define GPIOI_SPI2_SCK              1
+#define GPIOI_SPI2_MISO             2
+#define GPIOI_SPI2_MOSI             3
+#define GPIOI_PIN4                  4
+#define GPIOI_PIN5                  5
+#define GPIOI_PIN6                  6
+#define GPIOI_PIN7                  7
+#define GPIOI_LED3                  8
+#define GPIOI_PIN9                  9
+#define GPIOI_LED4                  10
+#define GPIOI_ULPI_DIR              11
+#define GPIOI_PIN12                 12
+#define GPIOI_PIN13                 13
+#define GPIOI_PIN14                 14
+#define GPIOI_PIN15                 15
+
+#define PIN_MODE_INPUT(n)           (0U << ((n) * 2))
+#define PIN_MODE_OUTPUT(n)          (1U << ((n) * 2))
+#define PIN_MODE_ALTERNATE(n)       (2U << ((n) * 2))
+#define PIN_MODE_ANALOG(n)          (3U << ((n) * 2))
+#define PIN_ODR_LOW(n)              (0U << (n))
+#define PIN_ODR_HIGH(n)             (1U << (n))
+#define PIN_OTYPE_PUSHPULL(n)       (0U << (n))
+#define PIN_OTYPE_OPENDRAIN(n)      (1U << (n))
+#define PIN_OSPEED_2M(n)            (0U << ((n) * 2))
+#define PIN_OSPEED_25M(n)           (1U << ((n) * 2))
+#define PIN_OSPEED_50M(n)           (2U << ((n) * 2))
+#define PIN_OSPEED_100M(n)          (3U << ((n) * 2))
+#define PIN_PUPDR_FLOATING(n)       (0U << ((n) * 2))
+#define PIN_PUPDR_PULLUP(n)         (1U << ((n) * 2))
+#define PIN_PUPDR_PULLDOWN(n)       (2U << ((n) * 2))
+#define PIN_AFIO_AF(n, v)           ((v##U) << ((n % 8) * 4))
+
+/*
+ * PA0 - PIN0                       (input floating).
+ * PA1 - PIN1                       (input floating).
+ * PA2 - MDIO                       (input floating).
+ * PA3 - ULPI_D0                    (input floating).
+ * PA4 - PIN4                       (input floating).
+ * PA5 - ULPI_CK                    (input floating).
+ * PA6 - PIN6                       (input floating).
+ * PA7 - MII_CRS_DV                 (input floating).
+ * PA8 - PIN8                       (input floating).
+ * PA9 - VBUS_FS                    (input floating).
+ * PA10 - OTG_FS_ID                 (input floating).
+ * PA11 - OTG_FS_DM                 (input floating).
+ * PA12 - OTG_FS_DP                 (input floating).
+ * PA13 - JTMS                      (alternate 0).
+ * PA14 - JTCK                      (alternate 0).
+ * PA15 - JTDI                      (alternate 0).
+ */
+
+#define VAL_GPIOA_MODER             (PIN_MODE_INPUT(GPIOA_PIN0) |           \
+                                     PIN_MODE_INPUT(GPIOA_PIN1) |           \
+                                     PIN_MODE_INPUT(GPIOA_MDIO) |           \
+                                     PIN_MODE_INPUT(GPIOA_ULPI_D0) |        \
+                                     PIN_MODE_INPUT(GPIOA_PIN4) |           \
+                                     PIN_MODE_INPUT(GPIOA_ULPI_CK) |        \
+                                     PIN_MODE_INPUT(GPIOA_PIN6) |           \
+                                     PIN_MODE_INPUT(GPIOA_MII_CRS_DV) |    \
+                                     PIN_MODE_INPUT(GPIOA_PIN8) |           \
+                                     PIN_MODE_INPUT(GPIOA_VBUS_FS) |        \
+                                     PIN_MODE_INPUT(GPIOA_OTG_FS_ID) |      \
+                                     PIN_MODE_INPUT(GPIOA_OTG_FS_DM) |      \
+                                     PIN_MODE_INPUT(GPIOA_OTG_FS_DP) |      \
+                                     PIN_MODE_ALTERNATE(GPIOA_JTMS) |       \
+                                     PIN_MODE_ALTERNATE(GPIOA_JTCK) |       \
+                                     PIN_MODE_ALTERNATE(GPIOA_JTDI))
+#define VAL_GPIOA_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN1) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_MDIO) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_ULPI_D0) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN4) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_ULPI_CK) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN6) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_MII_CRS_DV) |\
+                                     PIN_OTYPE_PUSHPULL(GPIOA_PIN8) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_VBUS_FS) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_ID) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_DM) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_OTG_FS_DP) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_JTMS) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_JTCK) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOA_JTDI))
+#define VAL_GPIOA_OSPEEDR           (PIN_OSPEED_100M(GPIOA_PIN0) |          \
+                                     PIN_OSPEED_100M(GPIOA_PIN1) |          \
+                                     PIN_OSPEED_100M(GPIOA_MDIO) |          \
+                                     PIN_OSPEED_100M(GPIOA_ULPI_D0) |       \
+                                     PIN_OSPEED_100M(GPIOA_PIN4) |          \
+                                     PIN_OSPEED_100M(GPIOA_ULPI_CK) |       \
+                                     PIN_OSPEED_100M(GPIOA_PIN6) |          \
+                                     PIN_OSPEED_100M(GPIOA_MII_CRS_DV) |   \
+                                     PIN_OSPEED_100M(GPIOA_PIN8) |          \
+                                     PIN_OSPEED_100M(GPIOA_VBUS_FS) |       \
+                                     PIN_OSPEED_100M(GPIOA_OTG_FS_ID) |     \
+                                     PIN_OSPEED_100M(GPIOA_OTG_FS_DM) |     \
+                                     PIN_OSPEED_100M(GPIOA_OTG_FS_DP) |     \
+                                     PIN_OSPEED_100M(GPIOA_JTMS) |          \
+                                     PIN_OSPEED_100M(GPIOA_JTCK) |          \
+                                     PIN_OSPEED_100M(GPIOA_JTDI))
+#define VAL_GPIOA_PUPDR             (PIN_PUPDR_FLOATING(GPIOA_PIN0) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_PIN1) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_MDIO) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_ULPI_D0) |    \
+                                     PIN_PUPDR_FLOATING(GPIOA_PIN4) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_ULPI_CK) |    \
+                                     PIN_PUPDR_FLOATING(GPIOA_PIN6) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_MII_CRS_DV) |\
+                                     PIN_PUPDR_FLOATING(GPIOA_PIN8) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_VBUS_FS) |    \
+                                     PIN_PUPDR_FLOATING(GPIOA_OTG_FS_ID) |  \
+                                     PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DM) |  \
+                                     PIN_PUPDR_FLOATING(GPIOA_OTG_FS_DP) |  \
+                                     PIN_PUPDR_FLOATING(GPIOA_JTMS) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_JTCK) |       \
+                                     PIN_PUPDR_FLOATING(GPIOA_JTDI))
+#define VAL_GPIOA_ODR               (PIN_ODR_HIGH(GPIOA_PIN0) |             \
+                                     PIN_ODR_HIGH(GPIOA_PIN1) |             \
+                                     PIN_ODR_HIGH(GPIOA_MDIO) |             \
+                                     PIN_ODR_HIGH(GPIOA_ULPI_D0) |          \
+                                     PIN_ODR_HIGH(GPIOA_PIN4) |             \
+                                     PIN_ODR_HIGH(GPIOA_ULPI_CK) |          \
+                                     PIN_ODR_HIGH(GPIOA_PIN6) |             \
+                                     PIN_ODR_HIGH(GPIOA_MII_CRS_DV) |      \
+                                     PIN_ODR_HIGH(GPIOA_PIN8) |             \
+                                     PIN_ODR_HIGH(GPIOA_VBUS_FS) |          \
+                                     PIN_ODR_HIGH(GPIOA_OTG_FS_ID) |        \
+                                     PIN_ODR_HIGH(GPIOA_OTG_FS_DM) |        \
+                                     PIN_ODR_HIGH(GPIOA_OTG_FS_DP) |        \
+                                     PIN_ODR_HIGH(GPIOA_JTMS) |             \
+                                     PIN_ODR_HIGH(GPIOA_JTCK) |             \
+                                     PIN_ODR_HIGH(GPIOA_JTDI))
+#define VAL_GPIOA_AFRL              (PIN_AFIO_AF(GPIOA_PIN0, 0) |           \
+                                     PIN_AFIO_AF(GPIOA_PIN1, 0) |           \
+                                     PIN_AFIO_AF(GPIOA_MDIO, 0) |           \
+                                     PIN_AFIO_AF(GPIOA_ULPI_D0, 0) |        \
+                                     PIN_AFIO_AF(GPIOA_PIN4, 6) |           \
+                                     PIN_AFIO_AF(GPIOA_ULPI_CK, 0) |        \
+                                     PIN_AFIO_AF(GPIOA_PIN6, 5) |           \
+                                     PIN_AFIO_AF(GPIOA_MII_CRS_DV, 0))
+#define VAL_GPIOA_AFRH              (PIN_AFIO_AF(GPIOA_PIN8, 0) |           \
+                                     PIN_AFIO_AF(GPIOA_VBUS_FS, 0) |        \
+                                     PIN_AFIO_AF(GPIOA_OTG_FS_ID, 0) |      \
+                                     PIN_AFIO_AF(GPIOA_OTG_FS_DM, 0) |      \
+                                     PIN_AFIO_AF(GPIOA_OTG_FS_DP, 0) |      \
+                                     PIN_AFIO_AF(GPIOA_JTMS, 0) |           \
+                                     PIN_AFIO_AF(GPIOA_JTCK, 0) |           \
+                                     PIN_AFIO_AF(GPIOA_JTDI, 0))
+
+/*
+ * PB0 - ULPI_D1                    (input floating).
+ * PB1 - ULPI_D2                    (input floating).
+ * PB2 - PIN2                       (input floating).
+ * PB3 - JTDO                       (alternate 0).
+ * PB4 - NJTRST                     (alternate 0).
+ * PB5 - ULPI_D7                    (input floating).
+ * PB6 - PIN6                       (input floating).
+ * PB7 - PIN7                       (input floating).
+ * PB8 - PIN8                       (input floating).
+ * PB9 - PIN9                       (input floating).
+ * PB10 - ULPI_D3                   (input floating).
+ * PB11 - ULPI_D4                   (input floating).
+ * PB12 - ULPI_D5                   (input floating).
+ * PB13 - ULPI_D6                   (input floating).
+ * PB14 - PIN14                     (input floating).
+ * PB15 - PIN15                     (input floating).
+ */
+
+#define VAL_GPIOB_MODER             (PIN_MODE_INPUT(GPIOB_ULPI_D1) |        \
+                                     PIN_MODE_INPUT(GPIOB_ULPI_D2) |        \
+                                     PIN_MODE_INPUT(GPIOB_PIN2) |           \
+                                     PIN_MODE_ALTERNATE(GPIOB_JTDO) |       \
+                                     PIN_MODE_ALTERNATE(GPIOB_NJTRST) |     \
+                                     PIN_MODE_INPUT(GPIOB_ULPI_D7) |        \
+                                     PIN_MODE_INPUT(GPIOB_PIN6) |           \
+                                     PIN_MODE_INPUT(GPIOB_PIN7) |           \
+                                     PIN_MODE_INPUT(GPIOB_PIN8) |           \
+                                     PIN_MODE_INPUT(GPIOB_PIN9) |           \
+                                     PIN_MODE_INPUT(GPIOB_ULPI_D3) |        \
+                                     PIN_MODE_INPUT(GPIOB_ULPI_D4) |        \
+                                     PIN_MODE_INPUT(GPIOB_ULPI_D5) |        \
+                                     PIN_MODE_INPUT(GPIOB_ULPI_D6) |        \
+                                     PIN_MODE_INPUT(GPIOB_PIN14) |          \
+                                     PIN_MODE_INPUT(GPIOB_PIN15))
+#define VAL_GPIOB_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D1) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D2) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN2) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_JTDO) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_NJTRST) |     \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D7) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN6) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN7) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN8) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN9) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D3) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D4) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D5) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_ULPI_D6) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN14) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOB_PIN15))
+#define VAL_GPIOB_OSPEEDR           (PIN_OSPEED_100M(GPIOB_ULPI_D1) |       \
+                                     PIN_OSPEED_100M(GPIOB_ULPI_D2) |       \
+                                     PIN_OSPEED_100M(GPIOB_PIN2) |          \
+                                     PIN_OSPEED_100M(GPIOB_JTDO) |          \
+                                     PIN_OSPEED_100M(GPIOB_NJTRST) |        \
+                                     PIN_OSPEED_100M(GPIOB_ULPI_D7) |       \
+                                     PIN_OSPEED_100M(GPIOB_PIN6) |          \
+                                     PIN_OSPEED_100M(GPIOB_PIN7) |          \
+                                     PIN_OSPEED_100M(GPIOB_PIN8) |          \
+                                     PIN_OSPEED_100M(GPIOB_PIN9) |          \
+                                     PIN_OSPEED_100M(GPIOB_ULPI_D3) |       \
+                                     PIN_OSPEED_100M(GPIOB_ULPI_D4) |       \
+                                     PIN_OSPEED_100M(GPIOB_ULPI_D5) |       \
+                                     PIN_OSPEED_100M(GPIOB_ULPI_D6) |       \
+                                     PIN_OSPEED_100M(GPIOB_PIN14) |         \
+                                     PIN_OSPEED_100M(GPIOB_PIN15))
+#define VAL_GPIOB_PUPDR             (PIN_PUPDR_FLOATING(GPIOB_ULPI_D1) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_ULPI_D2) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN2) |       \
+                                     PIN_PUPDR_FLOATING(GPIOB_JTDO) |       \
+                                     PIN_PUPDR_FLOATING(GPIOB_NJTRST) |     \
+                                     PIN_PUPDR_FLOATING(GPIOB_ULPI_D7) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN6) |       \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN7) |       \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN8) |       \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN9) |       \
+                                     PIN_PUPDR_FLOATING(GPIOB_ULPI_D3) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_ULPI_D4) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_ULPI_D5) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_ULPI_D6) |    \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN14) |      \
+                                     PIN_PUPDR_FLOATING(GPIOB_PIN15))
+#define VAL_GPIOB_ODR               (PIN_ODR_HIGH(GPIOB_ULPI_D1) |          \
+                                     PIN_ODR_HIGH(GPIOB_ULPI_D2) |          \
+                                     PIN_ODR_HIGH(GPIOB_PIN2) |             \
+                                     PIN_ODR_HIGH(GPIOB_JTDO) |             \
+                                     PIN_ODR_HIGH(GPIOB_NJTRST) |           \
+                                     PIN_ODR_HIGH(GPIOB_ULPI_D7) |          \
+                                     PIN_ODR_HIGH(GPIOB_PIN6) |             \
+                                     PIN_ODR_HIGH(GPIOB_PIN7) |             \
+                                     PIN_ODR_HIGH(GPIOB_PIN8) |             \
+                                     PIN_ODR_HIGH(GPIOB_PIN9) |             \
+                                     PIN_ODR_HIGH(GPIOB_ULPI_D3) |          \
+                                     PIN_ODR_HIGH(GPIOB_ULPI_D4) |          \
+                                     PIN_ODR_HIGH(GPIOB_ULPI_D5) |          \
+                                     PIN_ODR_HIGH(GPIOB_ULPI_D6) |          \
+                                     PIN_ODR_HIGH(GPIOB_PIN14) |            \
+                                     PIN_ODR_HIGH(GPIOB_PIN15))
+#define VAL_GPIOB_AFRL              (PIN_AFIO_AF(GPIOB_ULPI_D1, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_ULPI_D2, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_PIN2, 0) |           \
+                                     PIN_AFIO_AF(GPIOB_JTDO, 0) |           \
+                                     PIN_AFIO_AF(GPIOB_NJTRST, 0) |         \
+                                     PIN_AFIO_AF(GPIOB_ULPI_D7, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_PIN6, 0) |           \
+                                     PIN_AFIO_AF(GPIOB_PIN7, 0))
+#define VAL_GPIOB_AFRH              (PIN_AFIO_AF(GPIOB_PIN8, 0) |           \
+                                     PIN_AFIO_AF(GPIOB_PIN9, 0) |           \
+                                     PIN_AFIO_AF(GPIOB_ULPI_D3, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_ULPI_D4, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_ULPI_D5, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_ULPI_D6, 0) |        \
+                                     PIN_AFIO_AF(GPIOB_PIN14, 0) |          \
+                                     PIN_AFIO_AF(GPIOB_PIN15, 0))
+
+/*
+ * PC0 - ULPI_STP                   (input floating).
+ * PC1 - OTG_FS_POWER_ON            (input floating).
+ * PC2 - PIN2                       (input floating).
+ * PC3 - PIN3                       (input floating).
+ * PC4 - MII_RX_D0                  (input floating).
+ * PC5 - MII_RX_D1                  (input floating).
+ * PC6 - TP_IRQ                     (input floating).
+ * PC7 - PIN7                       (input floating).
+ * PC8 - PIN8                       (input floating).
+ * PC9 - PIN9                       (input floating).
+ * PC10 - USART3_TX                 (input floating).
+ * PC11 - USART3_RX                 (input floating).
+ * PC12 - PIN12                     (input floating).
+ * PC13 - PIN13                     (input floating).
+ * PC14 - OSC32_IN                  (input floating).
+ * PC15 - OSC32_OUT                 (input floating).
+ */
+
+#define VAL_GPIOC_MODER             (PIN_MODE_INPUT(GPIOC_ULPI_STP) |       \
+                                     PIN_MODE_INPUT(GPIOC_OTG_FS_POWER_ON) |\
+                                     PIN_MODE_INPUT(GPIOC_PIN2) |           \
+                                     PIN_MODE_INPUT(GPIOC_PIN3) |           \
+                                     PIN_MODE_INPUT(GPIOC_MII_RX_D0) |     \
+                                     PIN_MODE_INPUT(GPIOC_MII_RX_D1) |     \
+                                     PIN_MODE_INPUT(GPIOC_TP_IRQ) |         \
+                                     PIN_MODE_INPUT(GPIOC_PIN7) |           \
+                                     PIN_MODE_INPUT(GPIOC_PIN8) |           \
+                                     PIN_MODE_INPUT(GPIOC_PIN9) |           \
+                                     PIN_MODE_INPUT(GPIOC_USART3_TX) |      \
+                                     PIN_MODE_INPUT(GPIOC_USART3_RX) |      \
+                                     PIN_MODE_INPUT(GPIOC_PIN12) |          \
+                                     PIN_MODE_INPUT(GPIOC_PIN13) |          \
+                                     PIN_MODE_INPUT(GPIOC_OSC32_IN) |       \
+                                     PIN_MODE_INPUT(GPIOC_OSC32_OUT))
+#define VAL_GPIOC_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOC_ULPI_STP) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_OTG_FS_POWER_ON) |\
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN2) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN3) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_MII_RX_D0) | \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_MII_RX_D1) | \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_TP_IRQ) |     \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN7) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN8) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN9) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_USART3_TX) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_USART3_RX) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN12) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_PIN13) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
+#define VAL_GPIOC_OSPEEDR           (PIN_OSPEED_100M(GPIOC_ULPI_STP) |      \
+                                     PIN_OSPEED_100M(GPIOC_OTG_FS_POWER_ON) |\
+                                     PIN_OSPEED_100M(GPIOC_PIN2) |          \
+                                     PIN_OSPEED_100M(GPIOC_PIN3) |          \
+                                     PIN_OSPEED_100M(GPIOC_MII_RX_D0) |    \
+                                     PIN_OSPEED_100M(GPIOC_MII_RX_D1) |    \
+                                     PIN_OSPEED_100M(GPIOC_TP_IRQ) |        \
+                                     PIN_OSPEED_100M(GPIOC_PIN7) |          \
+                                     PIN_OSPEED_100M(GPIOC_PIN8) |          \
+                                     PIN_OSPEED_100M(GPIOC_PIN9) |          \
+                                     PIN_OSPEED_100M(GPIOC_USART3_TX) |     \
+                                     PIN_OSPEED_100M(GPIOC_USART3_RX) |     \
+                                     PIN_OSPEED_100M(GPIOC_PIN12) |         \
+                                     PIN_OSPEED_100M(GPIOC_PIN13) |         \
+                                     PIN_OSPEED_100M(GPIOC_OSC32_IN) |      \
+                                     PIN_OSPEED_100M(GPIOC_OSC32_OUT))
+#define VAL_GPIOC_PUPDR             (PIN_PUPDR_FLOATING(GPIOC_ULPI_STP) |   \
+                                     PIN_PUPDR_FLOATING(GPIOC_OTG_FS_POWER_ON) |\
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN2) |       \
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN3) |       \
+                                     PIN_PUPDR_FLOATING(GPIOC_MII_RX_D0) | \
+                                     PIN_PUPDR_FLOATING(GPIOC_MII_RX_D1) | \
+                                     PIN_PUPDR_FLOATING(GPIOC_TP_IRQ) |     \
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN7) |       \
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN8) |       \
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN9) |       \
+                                     PIN_PUPDR_FLOATING(GPIOC_USART3_TX) |  \
+                                     PIN_PUPDR_FLOATING(GPIOC_USART3_RX) |  \
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN12) |      \
+                                     PIN_PUPDR_FLOATING(GPIOC_PIN13) |      \
+                                     PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) |   \
+                                     PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
+#define VAL_GPIOC_ODR               (PIN_ODR_HIGH(GPIOC_ULPI_STP) |         \
+                                     PIN_ODR_HIGH(GPIOC_OTG_FS_POWER_ON) |  \
+                                     PIN_ODR_HIGH(GPIOC_PIN2) |             \
+                                     PIN_ODR_HIGH(GPIOC_PIN3) |             \
+                                     PIN_ODR_HIGH(GPIOC_MII_RX_D0) |       \
+                                     PIN_ODR_HIGH(GPIOC_MII_RX_D1) |       \
+                                     PIN_ODR_HIGH(GPIOC_TP_IRQ) |           \
+                                     PIN_ODR_HIGH(GPIOC_PIN7) |             \
+                                     PIN_ODR_HIGH(GPIOC_PIN8) |             \
+                                     PIN_ODR_HIGH(GPIOC_PIN9) |             \
+                                     PIN_ODR_HIGH(GPIOC_USART3_TX) |        \
+                                     PIN_ODR_HIGH(GPIOC_USART3_RX) |        \
+                                     PIN_ODR_HIGH(GPIOC_PIN12) |            \
+                                     PIN_ODR_HIGH(GPIOC_PIN13) |            \
+                                     PIN_ODR_HIGH(GPIOC_OSC32_IN) |         \
+                                     PIN_ODR_HIGH(GPIOC_OSC32_OUT))
+#define VAL_GPIOC_AFRL              (PIN_AFIO_AF(GPIOC_ULPI_STP, 0) |       \
+                                     PIN_AFIO_AF(GPIOC_OTG_FS_POWER_ON, 0) |\
+                                     PIN_AFIO_AF(GPIOC_PIN2, 0) |           \
+                                     PIN_AFIO_AF(GPIOC_PIN3, 0) |           \
+                                     PIN_AFIO_AF(GPIOC_MII_RX_D0, 0) |     \
+                                     PIN_AFIO_AF(GPIOC_MII_RX_D1, 0) |     \
+                                     PIN_AFIO_AF(GPIOC_TP_IRQ, 0) |         \
+                                     PIN_AFIO_AF(GPIOC_PIN7, 0))
+#define VAL_GPIOC_AFRH              (PIN_AFIO_AF(GPIOC_PIN8, 0) |           \
+                                     PIN_AFIO_AF(GPIOC_PIN9, 0) |           \
+                                     PIN_AFIO_AF(GPIOC_USART3_TX, 0) |      \
+                                     PIN_AFIO_AF(GPIOC_USART3_RX, 0) |      \
+                                     PIN_AFIO_AF(GPIOC_PIN12, 0) |          \
+                                     PIN_AFIO_AF(GPIOC_PIN13, 0) |          \
+                                     PIN_AFIO_AF(GPIOC_OSC32_IN, 0) |       \
+                                     PIN_AFIO_AF(GPIOC_OSC32_OUT, 0))
+
+/*
+ * PD0 - FSMC_D2                    (input floating).
+ * PD1 - FSMC_D3                    (input floating).
+ * PD2 - PIN2                       (input floating).
+ * PD3 - PIN3                       (input floating).
+ * PD4 - FSMC_NOE                   (input floating).
+ * PD5 - FSMC_NWE                   (input floating).
+ * PD6 - FSMC_NWAIT                 (input floating).
+ * PD7 - FSMC_NCE2                  (input floating).
+ * PD8 - FSMC_D13                   (input floating).
+ * PD9 - FSMC_D14                   (input floating).
+ * PD10 - FSMC_D15                  (input floating).
+ * PD11 - FSMC_A16                  (input floating).
+ * PD12 - FSMC_A17                  (input floating).
+ * PD13 - PIN13                     (input floating).
+ * PD14 - FSMC_D0                   (input floating).
+ * PD15 - FSMC_D1                   (input floating).
+ */
+
+#define VAL_GPIOD_MODER             (PIN_MODE_INPUT(GPIOD_FSMC_D2) |        \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_D3) |        \
+                                     PIN_MODE_INPUT(GPIOD_PIN2) |           \
+                                     PIN_MODE_INPUT(GPIOD_PIN3) |           \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_NOE) |       \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_NWE) |       \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_NWAIT) |     \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_NCE2) |      \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_D13) |       \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_D14) |       \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_D15) |       \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_A16) |       \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_A17) |       \
+                                     PIN_MODE_INPUT(GPIOD_PIN13) |          \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_D0) |        \
+                                     PIN_MODE_INPUT(GPIOD_FSMC_D1))
+#define VAL_GPIOD_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D2) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D3) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN2) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN3) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_NOE) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_NWE) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_NWAIT) | \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_NCE2) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D13) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D14) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D15) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_A16) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_A17) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_PIN13) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D0) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOD_FSMC_D1))
+#define VAL_GPIOD_OSPEEDR           (PIN_OSPEED_100M(GPIOD_FSMC_D2) |       \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_D3) |       \
+                                     PIN_OSPEED_100M(GPIOD_PIN2) |          \
+                                     PIN_OSPEED_100M(GPIOD_PIN3) |          \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_NOE) |      \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_NWE) |      \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_NWAIT) |    \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_NCE2) |     \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_D13) |      \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_D14) |      \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_D15) |      \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_A16) |      \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_A17) |      \
+                                     PIN_OSPEED_100M(GPIOD_PIN13) |         \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_D0) |       \
+                                     PIN_OSPEED_100M(GPIOD_FSMC_D1))
+#define VAL_GPIOD_PUPDR             (PIN_PUPDR_FLOATING(GPIOD_FSMC_D2) |    \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_D3) |    \
+                                     PIN_PUPDR_FLOATING(GPIOD_PIN2) |       \
+                                     PIN_PUPDR_FLOATING(GPIOD_PIN3) |       \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_NOE) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_NWE) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_NWAIT) | \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_NCE2) |  \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_D13) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_D14) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_D15) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_A16) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_A17) |   \
+                                     PIN_PUPDR_FLOATING(GPIOD_PIN13) |      \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_D0) |    \
+                                     PIN_PUPDR_FLOATING(GPIOD_FSMC_D1))
+#define VAL_GPIOD_ODR               (PIN_ODR_HIGH(GPIOD_FSMC_D2) |          \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_D3) |          \
+                                     PIN_ODR_HIGH(GPIOD_PIN2) |             \
+                                     PIN_ODR_HIGH(GPIOD_PIN3) |             \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_NOE) |         \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_NWE) |         \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_NWAIT) |       \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_NCE2) |        \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_D13) |         \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_D14) |         \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_D15) |         \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_A16) |         \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_A17) |         \
+                                     PIN_ODR_HIGH(GPIOD_PIN13) |            \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_D0) |          \
+                                     PIN_ODR_HIGH(GPIOD_FSMC_D1))
+#define VAL_GPIOD_AFRL              (PIN_AFIO_AF(GPIOD_FSMC_D2, 0) |        \
+                                     PIN_AFIO_AF(GPIOD_FSMC_D3, 0) |        \
+                                     PIN_AFIO_AF(GPIOD_PIN2, 0) |           \
+                                     PIN_AFIO_AF(GPIOD_PIN3, 0) |           \
+                                     PIN_AFIO_AF(GPIOD_FSMC_NOE, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_FSMC_NWE, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_FSMC_NWAIT, 0) |     \
+                                     PIN_AFIO_AF(GPIOD_FSMC_NCE2, 0))
+#define VAL_GPIOD_AFRH              (PIN_AFIO_AF(GPIOD_FSMC_D13, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_FSMC_D14, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_FSMC_D15, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_FSMC_A16, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_FSMC_A17, 0) |       \
+                                     PIN_AFIO_AF(GPIOD_PIN13, 0) |          \
+                                     PIN_AFIO_AF(GPIOD_FSMC_D0, 0) |        \
+                                     PIN_AFIO_AF(GPIOD_FSMC_D1, 0))
+
+/*
+ * PE0 - PIN0                       (input floating).
+ * PE1 - PIN1                       (input floating).
+ * PE2 - JOY_A                      (input floating).
+ * PE3 - JOY_B                      (input floating).
+ * PE4 - JOY_C                      (input floating).
+ * PE5 - JOY_D                      (input floating).
+ * PE6 - JOY_PRESS                  (input floating).
+ * PE7 - FSMC_D4                    (input floating).
+ * PE8 - FSMC_D5                    (input floating).
+ * PE9 - FSMC_D6                    (input floating).
+ * PE10 - FSMC_D7                   (input floating).
+ * PE11 - FSMC_D8                   (input floating).
+ * PE12 - FSMC_D9                   (input floating).
+ * PE13 - FSMC_D10                  (input floating).
+ * PE14 - FSMC_D11                  (input floating).
+ * PE15 - FSMC_D12                  (input floating).
+ */
+
+#define VAL_GPIOE_MODER             (PIN_MODE_INPUT(GPIOE_PIN0) |           \
+                                     PIN_MODE_INPUT(GPIOE_PIN1) |           \
+                                     PIN_MODE_INPUT(GPIOE_JOY_A) |          \
+                                     PIN_MODE_INPUT(GPIOE_JOY_B) |          \
+                                     PIN_MODE_INPUT(GPIOE_JOY_C) |          \
+                                     PIN_MODE_INPUT(GPIOE_JOY_D) |          \
+                                     PIN_MODE_INPUT(GPIOE_JOY_PRESS) |      \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D4) |        \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D5) |        \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D6) |        \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D7) |        \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D8) |        \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D9) |        \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D10) |       \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D11) |       \
+                                     PIN_MODE_INPUT(GPIOE_FSMC_D12))
+#define VAL_GPIOE_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_JOY_A) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_JOY_B) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_JOY_C) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_JOY_D) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_JOY_PRESS) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D4) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D5) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D6) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D7) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D8) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D9) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D10) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D11) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOE_FSMC_D12))
+#define VAL_GPIOE_OSPEEDR           (PIN_OSPEED_100M(GPIOE_PIN0) |          \
+                                     PIN_OSPEED_100M(GPIOE_PIN1) |          \
+                                     PIN_OSPEED_100M(GPIOE_JOY_A) |         \
+                                     PIN_OSPEED_100M(GPIOE_JOY_B) |         \
+                                     PIN_OSPEED_100M(GPIOE_JOY_C) |         \
+                                     PIN_OSPEED_100M(GPIOE_JOY_D) |         \
+                                     PIN_OSPEED_100M(GPIOE_JOY_PRESS) |     \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D4) |       \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D5) |       \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D6) |       \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D7) |       \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D8) |       \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D9) |       \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D10) |      \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D11) |      \
+                                     PIN_OSPEED_100M(GPIOE_FSMC_D12))
+#define VAL_GPIOE_PUPDR             (PIN_PUPDR_FLOATING(GPIOE_PIN0) |       \
+                                     PIN_PUPDR_FLOATING(GPIOE_PIN1) |       \
+                                     PIN_PUPDR_FLOATING(GPIOE_JOY_A) |      \
+                                     PIN_PUPDR_FLOATING(GPIOE_JOY_B) |      \
+                                     PIN_PUPDR_FLOATING(GPIOE_JOY_C) |      \
+                                     PIN_PUPDR_FLOATING(GPIOE_JOY_D) |      \
+                                     PIN_PUPDR_FLOATING(GPIOE_JOY_PRESS) |  \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D4) |    \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D5) |    \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D6) |    \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D7) |    \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D8) |    \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D9) |    \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D10) |   \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D11) |   \
+                                     PIN_PUPDR_FLOATING(GPIOE_FSMC_D12))
+#define VAL_GPIOE_ODR               (PIN_ODR_HIGH(GPIOE_PIN0) |             \
+                                     PIN_ODR_HIGH(GPIOE_PIN1) |             \
+                                     PIN_ODR_HIGH(GPIOE_JOY_A) |            \
+                                     PIN_ODR_HIGH(GPIOE_JOY_B) |            \
+                                     PIN_ODR_HIGH(GPIOE_JOY_C) |            \
+                                     PIN_ODR_HIGH(GPIOE_JOY_D) |            \
+                                     PIN_ODR_HIGH(GPIOE_JOY_PRESS) |        \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D4) |          \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D5) |          \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D6) |          \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D7) |          \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D8) |          \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D9) |          \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D10) |         \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D11) |         \
+                                     PIN_ODR_HIGH(GPIOE_FSMC_D12))
+#define VAL_GPIOE_AFRL              (PIN_AFIO_AF(GPIOE_PIN0, 0) |           \
+                                     PIN_AFIO_AF(GPIOE_PIN1, 0) |           \
+                                     PIN_AFIO_AF(GPIOE_JOY_A, 0) |          \
+                                     PIN_AFIO_AF(GPIOE_JOY_B, 0) |          \
+                                     PIN_AFIO_AF(GPIOE_JOY_C, 0) |          \
+                                     PIN_AFIO_AF(GPIOE_JOY_D, 0) |          \
+                                     PIN_AFIO_AF(GPIOE_JOY_PRESS, 0) |      \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D4, 0))
+#define VAL_GPIOE_AFRH              (PIN_AFIO_AF(GPIOE_FSMC_D5, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D6, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D7, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D8, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D9, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D10, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D11, 0) |        \
+                                     PIN_AFIO_AF(GPIOE_FSMC_D12, 0))
+
+/*
+ * PF0  - PIN0                      (input floating).
+ * PF1  - PIN1                      (input floating).
+ * PF2  - PIN2                      (input floating).
+ * PF3  - PIN3                      (input floating).
+ * PF4  - PIN4                      (input floating).
+ * PF5  - PIN5                      (input floating).
+ * PF6  - PIN6                      (input floating).
+ * PF7  - LCD_PWM                   (input floating).
+ * PF8  - PIN8                      (input floating).
+ * PF9  - PIN9                      (input floating).
+ * PF10 - PIN10                     (input floating).
+ * PF11 - PIN11                     (input floating).
+ * PF12 - PIN12                     (input floating).
+ * PF13 - PIN13                     (input floating).
+ * PF14 - PIN14                     (input floating).
+ * PF15 - PIN15                     (input floating).
+ */
+#define VAL_GPIOF_MODER             (PIN_MODE_INPUT(GPIOF_PIN0) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN1) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN2) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN3) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN4) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN5) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN6) |           \
+                                     PIN_MODE_INPUT(GPIOF_LCD_PWM) |        \
+                                     PIN_MODE_INPUT(GPIOF_PIN8) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN9) |           \
+                                     PIN_MODE_INPUT(GPIOF_PIN10) |          \
+                                     PIN_MODE_INPUT(GPIOF_PIN11) |          \
+                                     PIN_MODE_INPUT(GPIOF_PIN12) |          \
+                                     PIN_MODE_INPUT(GPIOF_PIN13) |          \
+                                     PIN_MODE_INPUT(GPIOF_PIN14) |          \
+                                     PIN_MODE_INPUT(GPIOF_PIN15))
+#define VAL_GPIOF_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN1) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN2) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN3) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN4) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN5) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN6) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_LCD_PWM) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN8) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN9) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN10) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN11) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN12) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN13) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN14) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
+#define VAL_GPIOF_OSPEEDR           (PIN_OSPEED_100M(GPIOF_PIN0) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN1) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN2) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN3) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN4) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN5) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN6) |          \
+                                     PIN_OSPEED_100M(GPIOF_LCD_PWM) |       \
+                                     PIN_OSPEED_100M(GPIOF_PIN8) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN9) |          \
+                                     PIN_OSPEED_100M(GPIOF_PIN10) |         \
+                                     PIN_OSPEED_100M(GPIOF_PIN11) |         \
+                                     PIN_OSPEED_100M(GPIOF_PIN12) |         \
+                                     PIN_OSPEED_100M(GPIOF_PIN13) |         \
+                                     PIN_OSPEED_100M(GPIOF_PIN14) |         \
+                                     PIN_OSPEED_100M(GPIOF_PIN15))
+#define VAL_GPIOF_PUPDR             (PIN_PUPDR_FLOATING(GPIOF_PIN0) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN1) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN2) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN3) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN4) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN5) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN6) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_LCD_PWM) |    \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN8) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN9) |       \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN10) |      \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN11) |      \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN12) |      \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN13) |      \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN14) |      \
+                                     PIN_PUPDR_FLOATING(GPIOF_PIN15))
+#define VAL_GPIOF_ODR               (PIN_ODR_HIGH(GPIOF_PIN0) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN1) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN2) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN3) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN4) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN5) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN6) |             \
+                                     PIN_ODR_HIGH(GPIOF_LCD_PWM) |          \
+                                     PIN_ODR_HIGH(GPIOF_PIN8) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN9) |             \
+                                     PIN_ODR_HIGH(GPIOF_PIN10) |            \
+                                     PIN_ODR_HIGH(GPIOF_PIN11) |            \
+                                     PIN_ODR_HIGH(GPIOF_PIN12) |            \
+                                     PIN_ODR_HIGH(GPIOF_PIN13) |            \
+                                     PIN_ODR_HIGH(GPIOF_PIN14) |            \
+                                     PIN_ODR_HIGH(GPIOF_PIN15))
+#define VAL_GPIOF_AFRL              (PIN_AFIO_AF(GPIOF_PIN0, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN1, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN2, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN3, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN4, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN5, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN6, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_LCD_PWM, 0))
+#define VAL_GPIOF_AFRH              (PIN_AFIO_AF(GPIOF_PIN8, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN9, 0) |           \
+                                     PIN_AFIO_AF(GPIOF_PIN10, 0) |          \
+                                     PIN_AFIO_AF(GPIOF_PIN11, 0) |          \
+                                     PIN_AFIO_AF(GPIOF_PIN12, 0) |          \
+                                     PIN_AFIO_AF(GPIOF_PIN13, 0) |          \
+                                     PIN_AFIO_AF(GPIOF_PIN14, 0) |          \
+                                     PIN_AFIO_AF(GPIOF_PIN15, 0))
+
+/*
+ * PG0  - PIN0                      (input floating).
+ * PG1  - PIN1                      (input floating).
+ * PG2  - PIN2                      (input floating).
+ * PG3  - PIN3                      (input floating).
+ * PG4  - PIN4                      (input floating).
+ * PG5  - FSMC_A15                  (input floating).
+ * PG6  - PIN6                      (input floating).
+ * PG7  - PIN7                      (input floating).
+ * PG8  - PIN8                      (input floating).
+ * PG9  - PIN9                      (input floating).
+ * PG10 - PIN10                     (input floating).
+ * PG11 - MII_TX_EN                 (input floating).
+ * PG12 - PIN12                     (input floating).
+ * PG13 - MII_TX_D0                 (input floating).
+ * PG14 - MII_TX_D1                 (input floating).
+ * PG15 - PIN15                     (input floating).
+ */
+
+#define VAL_GPIOG_MODER             (PIN_MODE_INPUT(GPIOG_PIN0) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN1) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN2) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN3) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN4) |           \
+                                     PIN_MODE_INPUT(GPIOG_FSMC_A15) |       \
+                                     PIN_MODE_INPUT(GPIOG_PIN6) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN7) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN8) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN9) |           \
+                                     PIN_MODE_INPUT(GPIOG_PIN10) |          \
+                                     PIN_MODE_INPUT(GPIOG_MII_TX_EN) |      \
+                                     PIN_MODE_INPUT(GPIOG_PIN12) |          \
+                                     PIN_MODE_INPUT(GPIOG_MII_TX_D0) |      \
+                                     PIN_MODE_INPUT(GPIOG_MII_TX_D1) |      \
+                                     PIN_MODE_INPUT(GPIOG_PIN15))
+#define VAL_GPIOG_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN1) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN2) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN3) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN4) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_FSMC_A15) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN6) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN7) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN8) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN9) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN10) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_MII_TX_EN) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN12) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_MII_TX_D0) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_MII_TX_D1) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOG_PIN15))
+#define VAL_GPIOG_OSPEEDR           (PIN_OSPEED_100M(GPIOG_PIN0) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN1) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN2) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN3) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN4) |          \
+                                     PIN_OSPEED_100M(GPIOG_FSMC_A15) |      \
+                                     PIN_OSPEED_100M(GPIOG_PIN6) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN7) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN8) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN9) |          \
+                                     PIN_OSPEED_100M(GPIOG_PIN10) |         \
+                                     PIN_OSPEED_100M(GPIOG_MII_TX_EN) |     \
+                                     PIN_OSPEED_100M(GPIOG_PIN12) |         \
+                                     PIN_OSPEED_100M(GPIOG_MII_TX_D0) |     \
+                                     PIN_OSPEED_100M(GPIOG_MII_TX_D1) |     \
+                                     PIN_OSPEED_100M(GPIOG_PIN15))
+#define VAL_GPIOG_PUPDR             (PIN_PUPDR_FLOATING(GPIOG_PIN0) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN1) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN2) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN3) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN4) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_FSMC_A15) |   \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN6) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN7) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN8) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN9) |       \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN10) |      \
+                                     PIN_PUPDR_FLOATING(GPIOG_MII_TX_EN) |  \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN12) |      \
+                                     PIN_PUPDR_FLOATING(GPIOG_MII_TX_D0) |  \
+                                     PIN_PUPDR_FLOATING(GPIOG_MII_TX_D1) |  \
+                                     PIN_PUPDR_FLOATING(GPIOG_PIN15))
+#define VAL_GPIOG_ODR               (PIN_ODR_HIGH(GPIOG_PIN0) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN1) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN2) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN3) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN4) |             \
+                                     PIN_ODR_HIGH(GPIOG_FSMC_A15) |         \
+                                     PIN_ODR_HIGH(GPIOG_PIN6) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN7) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN8) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN9) |             \
+                                     PIN_ODR_HIGH(GPIOG_PIN10) |            \
+                                     PIN_ODR_HIGH(GPIOG_MII_TX_EN) |        \
+                                     PIN_ODR_HIGH(GPIOG_PIN12) |            \
+                                     PIN_ODR_HIGH(GPIOG_MII_TX_D0) |        \
+                                     PIN_ODR_HIGH(GPIOG_MII_TX_D1) |        \
+                                     PIN_ODR_HIGH(GPIOG_PIN15))
+#define VAL_GPIOG_AFRL              (PIN_AFIO_AF(GPIOG_PIN0, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN1, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN2, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN3, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN4, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_FSMC_A15, 0) |       \
+                                     PIN_AFIO_AF(GPIOG_PIN6, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN7, 0))
+#define VAL_GPIOG_AFRH              (PIN_AFIO_AF(GPIOG_PIN8, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN9, 0) |           \
+                                     PIN_AFIO_AF(GPIOG_PIN10, 0) |          \
+                                     PIN_AFIO_AF(GPIOG_MII_TX_EN, 0) |      \
+                                     PIN_AFIO_AF(GPIOG_PIN12, 0) |          \
+                                     PIN_AFIO_AF(GPIOG_MII_TX_D0, 0) |      \
+                                     PIN_AFIO_AF(GPIOG_MII_TX_D1, 0) |      \
+                                     PIN_AFIO_AF(GPIOG_PIN15, 0))
+
+/*
+ * PH0  - OSC_IN                    (input floating).
+ * PH1  - OSC_OUT                   (input floating).
+ * PH2  - LED1                      (output pushpull maximum).
+ * PH3  - LED2                      (output pushpull maximum).
+ * PH4  - ULPI_NXT                      (input floating).
+ * PH5  - PIN5                      (input floating).
+ * PH6  - PIN6                      (input floating).
+ * PH7  - PIN7                      (input floating).
+ * PH8  - PIN8                      (input floating).
+ * PH9  - PIN9                      (input floating).
+ * PH10 - PIN10                     (input floating).
+ * PH11 - ULPI_RESET                (input floating).
+ * PH12 - PIN12                     (input floating).
+ * PH13 - PIN13                     (input floating).
+ * PH14 - PIN14                     (input floating).
+ * PH15 - PIN15                     (input floating).
+ */
+
+#define VAL_GPIOH_MODER             (PIN_MODE_INPUT(GPIOH_OSC_IN) |         \
+                                     PIN_MODE_INPUT(GPIOH_OSC_OUT) |        \
+                                     PIN_MODE_OUTPUT(GPIOH_LED1) |          \
+                                     PIN_MODE_OUTPUT(GPIOH_LED2) |          \
+                                     PIN_MODE_INPUT(GPIOH_ULPI_NXT) |       \
+                                     PIN_MODE_INPUT(GPIOH_PIN5) |           \
+                                     PIN_MODE_INPUT(GPIOH_PIN6) |           \
+                                     PIN_MODE_INPUT(GPIOH_PIN7) |           \
+                                     PIN_MODE_INPUT(GPIOH_PIN8) |           \
+                                     PIN_MODE_INPUT(GPIOH_PIN9) |           \
+                                     PIN_MODE_INPUT(GPIOH_PIN10) |          \
+                                     PIN_MODE_INPUT(GPIOH_ULPI_RESET) |     \
+                                     PIN_MODE_INPUT(GPIOH_PIN12) |          \
+                                     PIN_MODE_INPUT(GPIOH_PIN13) |          \
+                                     PIN_MODE_INPUT(GPIOH_PIN14) |          \
+                                     PIN_MODE_INPUT(GPIOH_PIN15))
+#define VAL_GPIOH_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOH_OSC_IN) |     \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_OSC_OUT) |    \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_LED1) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_LED2) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_ULPI_NXT) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN5) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN6) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN7) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN8) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN9) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN10) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_ULPI_RESET) | \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN12) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN13) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN14) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOH_PIN15))
+#define VAL_GPIOH_OSPEEDR           (PIN_OSPEED_100M(GPIOH_OSC_IN) |        \
+                                     PIN_OSPEED_100M(GPIOH_OSC_OUT) |       \
+                                     PIN_OSPEED_100M(GPIOH_LED1) |          \
+                                     PIN_OSPEED_100M(GPIOH_LED2) |          \
+                                     PIN_OSPEED_100M(GPIOH_ULPI_NXT) |      \
+                                     PIN_OSPEED_100M(GPIOH_PIN5) |          \
+                                     PIN_OSPEED_100M(GPIOH_PIN6) |          \
+                                     PIN_OSPEED_100M(GPIOH_PIN7) |          \
+                                     PIN_OSPEED_100M(GPIOH_PIN8) |          \
+                                     PIN_OSPEED_100M(GPIOH_PIN9) |          \
+                                     PIN_OSPEED_100M(GPIOH_PIN10) |         \
+                                     PIN_OSPEED_100M(GPIOH_ULPI_RESET) |    \
+                                     PIN_OSPEED_100M(GPIOH_PIN12) |         \
+                                     PIN_OSPEED_100M(GPIOH_PIN13) |         \
+                                     PIN_OSPEED_100M(GPIOH_PIN14) |         \
+                                     PIN_OSPEED_100M(GPIOH_PIN15))
+#define VAL_GPIOH_PUPDR             (PIN_PUPDR_FLOATING(GPIOH_OSC_IN) |     \
+                                     PIN_PUPDR_FLOATING(GPIOH_OSC_OUT) |    \
+                                     PIN_PUPDR_FLOATING(GPIOH_LED1) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_LED2) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_ULPI_NXT) |   \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN5) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN6) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN7) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN8) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN9) |       \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN10) |      \
+                                     PIN_PUPDR_FLOATING(GPIOH_ULPI_RESET) | \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN12) |      \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN13) |      \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN14) |      \
+                                     PIN_PUPDR_FLOATING(GPIOH_PIN15))
+#define VAL_GPIOH_ODR               (PIN_ODR_HIGH(GPIOH_OSC_IN) |           \
+                                     PIN_ODR_HIGH(GPIOH_OSC_OUT) |          \
+                                     PIN_ODR_LOW(GPIOH_LED1) |              \
+                                     PIN_ODR_LOW(GPIOH_LED2) |              \
+                                     PIN_ODR_HIGH(GPIOH_ULPI_NXT) |         \
+                                     PIN_ODR_HIGH(GPIOH_PIN5) |             \
+                                     PIN_ODR_HIGH(GPIOH_PIN6) |             \
+                                     PIN_ODR_HIGH(GPIOH_PIN7) |             \
+                                     PIN_ODR_HIGH(GPIOH_PIN8) |             \
+                                     PIN_ODR_HIGH(GPIOH_PIN9) |             \
+                                     PIN_ODR_HIGH(GPIOH_PIN10) |            \
+                                     PIN_ODR_HIGH(GPIOH_ULPI_RESET) |       \
+                                     PIN_ODR_HIGH(GPIOH_PIN12) |            \
+                                     PIN_ODR_HIGH(GPIOH_PIN13) |            \
+                                     PIN_ODR_HIGH(GPIOH_PIN14) |            \
+                                     PIN_ODR_HIGH(GPIOH_PIN15))
+#define VAL_GPIOH_AFRL              (PIN_AFIO_AF(GPIOH_OSC_IN, 0) |         \
+                                     PIN_AFIO_AF(GPIOH_OSC_OUT, 0) |        \
+                                     PIN_AFIO_AF(GPIOH_LED1, 0) |           \
+                                     PIN_AFIO_AF(GPIOH_LED2, 0) |           \
+                                     PIN_AFIO_AF(GPIOH_ULPI_NXT, 0) |       \
+                                     PIN_AFIO_AF(GPIOH_PIN5, 0) |           \
+                                     PIN_AFIO_AF(GPIOH_PIN6, 0) |           \
+                                     PIN_AFIO_AF(GPIOH_PIN7, 0))
+#define VAL_GPIOH_AFRH              (PIN_AFIO_AF(GPIOH_PIN8, 0) |           \
+                                     PIN_AFIO_AF(GPIOH_PIN9, 0) |           \
+                                     PIN_AFIO_AF(GPIOH_PIN10, 0) |          \
+                                     PIN_AFIO_AF(GPIOH_ULPI_RESET, 0) |     \
+                                     PIN_AFIO_AF(GPIOH_PIN12, 0) |          \
+                                     PIN_AFIO_AF(GPIOH_PIN13, 0) |          \
+                                     PIN_AFIO_AF(GPIOH_PIN14, 0) |          \
+                                     PIN_AFIO_AF(GPIOH_PIN15, 0))
+
+/*
+ * PI0  - TP_CS                     (input floating).
+ * PI1  - SPI2_SCK                  (input floating).
+ * PI2  - SPI2_MISO                 (input floating).
+ * PI3  - SPI2_MOSI                 (input floating).
+ * PI4  - PIN4                      (input floating).
+ * PI5  - PIN5                      (input floating).
+ * PI6  - PIN6                      (input floating).
+ * PI7  - PIN7                      (input floating).
+ * PI8  - LED3                      (input floating).
+ * PI9  - PIN9                      (input floating).
+ * PI10 - LED4                      (input floating).
+ * PI11 - ULPI_DIR                  (input floating).
+ * PI12 - PIN12                     (input floating).
+ * PI13 - PIN13                     (input floating).
+ * PI14 - PIN14                     (input floating).
+ * PI15 - PIN15                     (input floating).
+ */
+
+#define GPIOI_TP_CS                 0
+#define GPIOI_SPI2_SCK              1
+#define GPIOI_SPI2_MISO             2
+#define GPIOI_SPI2_MOSI             3
+#define GPIOI_PIN4                  4
+#define GPIOI_PIN5                  5
+#define GPIOI_PIN6                  6
+#define GPIOI_PIN7                  7
+#define GPIOI_LED3                  8
+#define GPIOI_PIN9                  9
+#define GPIOI_LED4                  10
+#define GPIOI_ULPI_DIR              11
+#define GPIOI_PIN12                 12
+#define GPIOI_PIN13                 13
+#define GPIOI_PIN14                 14
+#define GPIOI_PIN15                 15
+
+#define VAL_GPIOI_MODER             (PIN_MODE_INPUT(GPIOI_TP_CS) |          \
+                                     PIN_MODE_INPUT(GPIOI_SPI2_SCK) |       \
+                                     PIN_MODE_INPUT(GPIOI_SPI2_MISO) |      \
+                                     PIN_MODE_INPUT(GPIOI_SPI2_MOSI) |      \
+                                     PIN_MODE_INPUT(GPIOI_PIN4) |           \
+                                     PIN_MODE_INPUT(GPIOI_PIN5) |           \
+                                     PIN_MODE_INPUT(GPIOI_PIN6) |           \
+                                     PIN_MODE_INPUT(GPIOI_PIN7) |           \
+                                     PIN_MODE_INPUT(GPIOI_LED3) |           \
+                                     PIN_MODE_INPUT(GPIOI_PIN9) |           \
+                                     PIN_MODE_INPUT(GPIOI_LED4) |           \
+                                     PIN_MODE_INPUT(GPIOI_ULPI_DIR) |       \
+                                     PIN_MODE_INPUT(GPIOI_PIN12) |          \
+                                     PIN_MODE_INPUT(GPIOI_PIN13) |          \
+                                     PIN_MODE_INPUT(GPIOI_PIN14) |          \
+                                     PIN_MODE_INPUT(GPIOI_PIN15))
+#define VAL_GPIOI_OTYPER            (PIN_OTYPE_PUSHPULL(GPIOI_TP_CS) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_SPI2_SCK) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_SPI2_MISO) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_SPI2_MOSI) |  \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN4) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN5) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN6) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN7) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_LED3) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN9) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_LED4) |       \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_ULPI_DIR) |   \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN12) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN13) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN14) |      \
+                                     PIN_OTYPE_PUSHPULL(GPIOI_PIN15))
+#define VAL_GPIOI_OSPEEDR           (PIN_OSPEED_100M(GPIOI_TP_CS) |         \
+                                     PIN_OSPEED_100M(GPIOI_SPI2_SCK) |      \
+                                     PIN_OSPEED_100M(GPIOI_SPI2_MISO) |     \
+                                     PIN_OSPEED_100M(GPIOI_SPI2_MOSI) |     \
+                                     PIN_OSPEED_100M(GPIOI_PIN4) |          \
+                                     PIN_OSPEED_100M(GPIOI_PIN5) |          \
+                                     PIN_OSPEED_100M(GPIOI_PIN6) |          \
+                                     PIN_OSPEED_100M(GPIOI_PIN7) |          \
+                                     PIN_OSPEED_100M(GPIOI_LED3) |          \
+                                     PIN_OSPEED_100M(GPIOI_PIN9) |          \
+                                     PIN_OSPEED_100M(GPIOI_LED4) |          \
+                                     PIN_OSPEED_100M(GPIOI_ULPI_DIR) |      \
+                                     PIN_OSPEED_100M(GPIOI_PIN12) |         \
+                                     PIN_OSPEED_100M(GPIOI_PIN13) |         \
+                                     PIN_OSPEED_100M(GPIOI_PIN14) |         \
+                                     PIN_OSPEED_100M(GPIOI_PIN15))
+#define VAL_GPIOI_PUPDR             (PIN_PUPDR_FLOATING(GPIOI_TP_CS) |      \
+                                     PIN_PUPDR_FLOATING(GPIOI_SPI2_SCK) |   \
+                                     PIN_PUPDR_FLOATING(GPIOI_SPI2_MISO) |  \
+                                     PIN_PUPDR_FLOATING(GPIOI_SPI2_MOSI) |  \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN4) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN5) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN6) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN7) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_LED3) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN9) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_LED4) |       \
+                                     PIN_PUPDR_FLOATING(GPIOI_ULPI_DIR) |   \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN12) |      \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN13) |      \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN14) |      \
+                                     PIN_PUPDR_FLOATING(GPIOI_PIN15))
+#define VAL_GPIOI_ODR               (PIN_ODR_HIGH(GPIOI_TP_CS) |            \
+                                     PIN_ODR_HIGH(GPIOI_SPI2_SCK) |         \
+                                     PIN_ODR_HIGH(GPIOI_SPI2_MISO) |        \
+                                     PIN_ODR_HIGH(GPIOI_SPI2_MOSI) |        \
+                                     PIN_ODR_HIGH(GPIOI_PIN4) |             \
+                                     PIN_ODR_HIGH(GPIOI_PIN5) |             \
+                                     PIN_ODR_HIGH(GPIOI_PIN6) |             \
+                                     PIN_ODR_HIGH(GPIOI_PIN7) |             \
+                                     PIN_ODR_HIGH(GPIOI_LED3) |             \
+                                     PIN_ODR_HIGH(GPIOI_PIN9) |             \
+                                     PIN_ODR_HIGH(GPIOI_LED4) |             \
+                                     PIN_ODR_HIGH(GPIOI_ULPI_DIR) |         \
+                                     PIN_ODR_HIGH(GPIOI_PIN12) |            \
+                                     PIN_ODR_HIGH(GPIOI_PIN13) |            \
+                                     PIN_ODR_HIGH(GPIOI_PIN14) |            \
+                                     PIN_ODR_HIGH(GPIOI_PIN15))
+#define VAL_GPIOI_AFRL              (PIN_AFIO_AF(GPIOI_TP_CS, 0) |          \
+                                     PIN_AFIO_AF(GPIOI_SPI2_SCK, 0) |       \
+                                     PIN_AFIO_AF(GPIOI_SPI2_MISO, 0) |      \
+                                     PIN_AFIO_AF(GPIOI_SPI2_MOSI, 0) |      \
+                                     PIN_AFIO_AF(GPIOI_PIN4, 0) |           \
+                                     PIN_AFIO_AF(GPIOI_PIN5, 0) |           \
+                                     PIN_AFIO_AF(GPIOI_PIN6, 0) |           \
+                                     PIN_AFIO_AF(GPIOI_PIN7, 0))
+#define VAL_GPIOI_AFRH              (PIN_AFIO_AF(GPIOI_LED3, 0) |           \
+                                     PIN_AFIO_AF(GPIOI_PIN9, 0) |           \
+                                     PIN_AFIO_AF(GPIOI_LED4, 0) |           \
+                                     PIN_AFIO_AF(GPIOI_ULPI_DIR, 0) |       \
+                                     PIN_AFIO_AF(GPIOI_PIN12, 0) |          \
+                                     PIN_AFIO_AF(GPIOI_PIN13, 0) |          \
+                                     PIN_AFIO_AF(GPIOI_PIN14, 0) |          \
+                                     PIN_AFIO_AF(GPIOI_PIN15, 0))
+
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+  void boardInit(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+#endif

+ 171 - 0
stm32-chibios/chconf.h

@@ -0,0 +1,171 @@
+#ifndef _CHCONF_H_
+#define _CHCONF_H_
+
+#if !defined(CH_FREQUENCY)
+#define CH_FREQUENCY                    1000
+#endif
+
+#if !defined(CH_TIME_QUANTUM)
+#define CH_TIME_QUANTUM                 20
+#endif
+
+#if !defined(CH_MEMCORE_SIZE)
+#define CH_MEMCORE_SIZE                 0
+#endif
+
+#if !defined(CH_NO_IDLE_THREAD)
+#define CH_NO_IDLE_THREAD               FALSE
+#endif
+
+#if !defined(CH_OPTIMIZE_SPEED)
+#define CH_OPTIMIZE_SPEED               TRUE
+#endif
+
+#if !defined(CH_USE_REGISTRY)
+#define CH_USE_REGISTRY                 TRUE
+#endif
+
+#if !defined(CH_USE_WAITEXIT)
+#define CH_USE_WAITEXIT                 TRUE
+#endif
+
+#if !defined(CH_USE_SEMAPHORES)
+#define CH_USE_SEMAPHORES               TRUE
+#endif
+
+#if !defined(CH_USE_SEMAPHORES_PRIORITY)
+#define CH_USE_SEMAPHORES_PRIORITY      FALSE
+#endif
+
+#if !defined(CH_USE_SEMSW)
+#define CH_USE_SEMSW                    TRUE
+#endif
+
+#if !defined(CH_USE_MUTEXES)
+#define CH_USE_MUTEXES                  TRUE
+#endif
+
+#if !defined(CH_USE_CONDVARS)
+#define CH_USE_CONDVARS                 TRUE
+#endif
+
+
+#if !defined(CH_USE_CONDVARS_TIMEOUT)
+#define CH_USE_CONDVARS_TIMEOUT         TRUE
+#endif
+
+#if !defined(CH_USE_EVENTS)
+#define CH_USE_EVENTS                   TRUE
+#endif
+
+#if !defined(CH_USE_EVENTS_TIMEOUT)
+#define CH_USE_EVENTS_TIMEOUT           TRUE
+#endif
+
+#if !defined(CH_USE_MESSAGES)
+#define CH_USE_MESSAGES                 TRUE
+#endif
+
+#if !defined(CH_USE_MESSAGES_PRIORITY)
+#define CH_USE_MESSAGES_PRIORITY        FALSE
+#endif
+
+#if !defined(CH_USE_MAILBOXES)
+#define CH_USE_MAILBOXES                TRUE
+
+#if !defined(CH_USE_QUEUES)
+#define CH_USE_QUEUES                   TRUE
+#endif
+
+#if !defined(CH_USE_MEMCORE)
+#define CH_USE_MEMCORE                  TRUE
+#endif
+
+#if !defined(CH_USE_HEAP)
+#define CH_USE_HEAP                     TRUE
+#endif
+
+#if !defined(CH_USE_MALLOC_HEAP)
+#define CH_USE_MALLOC_HEAP              FALSE
+#endif
+
+#if !defined(CH_USE_MEMPOOLS)
+#define CH_USE_MEMPOOLS                 TRUE
+#endif
+
+#if !defined(CH_USE_DYNAMIC)
+#define CH_USE_DYNAMIC                  TRUE
+#endif
+
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK       FALSE
+#endif
+
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS            FALSE
+#endif
+
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS           FALSE
+#endif
+
+#if !defined(CH_DBG_ENABLE_TRACE)
+#define CH_DBG_ENABLE_TRACE             FALSE
+#endif
+
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK       FALSE
+#endif
+
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS             FALSE
+#endif
+
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING        TRUE
+#endif
+
+#if !defined(THREAD_EXT_FIELDS)
+#define THREAD_EXT_FIELDS                                                   \
+  /* Add threads custom fields here.*/
+#endif
+
+#if !defined(THREAD_EXT_INIT_HOOK)
+#define THREAD_EXT_INIT_HOOK(tp) {                                          \
+  /* Add threads initialization code here.*/                                \
+}
+#endif
+
+#if !defined(THREAD_EXT_EXIT_HOOK)
+#define THREAD_EXT_EXIT_HOOK(tp) {                                          \
+  /* Add threads finalization code here.*/                                  \
+}
+#endif
+
+#if !defined(THREAD_CONTEXT_SWITCH_HOOK)
+#define THREAD_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \
+  /* System halt code here.*/                                               \
+}
+#endif
+
+#if !defined(IDLE_LOOP_HOOK)
+#define IDLE_LOOP_HOOK() {                                                  \
+  /* Idle loop code here.*/                                                 \
+}
+#endif
+
+#if !defined(SYSTEM_TICK_EVENT_HOOK)
+#define SYSTEM_TICK_EVENT_HOOK() {                                          \
+  /* System tick event code here.*/                                         \
+}
+#endif
+
+#if !defined(SYSTEM_HALT_HOOK)
+#define SYSTEM_HALT_HOOK() {                                                \
+  /* System halt code here.*/                                               \
+}
+#endif
+
+#define CORTEX_USE_FPU                  FALSE
+
+#endif

+ 141 - 0
stm32-chibios/halconf.h

@@ -0,0 +1,141 @@
+#ifndef _HALCONF_H_
+#define _HALCONF_H_
+
+#include "mcuconf.h"
+
+#if !defined(HAL_USE_TM)
+#define HAL_USE_TM                  FALSE
+#endif
+
+#if !defined(HAL_USE_PAL)
+#define HAL_USE_PAL                 TRUE
+#endif
+
+#if !defined(HAL_USE_ADC)
+#define HAL_USE_ADC                 FALSE
+#endif
+
+#if !defined(HAL_USE_CAN)
+#define HAL_USE_CAN                 FALSE
+#endif
+
+#if !defined(HAL_USE_EXT)
+#define HAL_USE_EXT                 FALSE
+#endif
+
+#if !defined(HAL_USE_GPT)
+#define HAL_USE_GPT                 FALSE
+#endif
+
+#if !defined(HAL_USE_I2C)
+#define HAL_USE_I2C                 FALSE
+#endif
+
+#if !defined(HAL_USE_ICU)
+#define HAL_USE_ICU                 FALSE
+#endif
+
+#if !defined(HAL_USE_MAC)
+#define HAL_USE_MAC                 FALSE
+#endif
+
+#if !defined(HAL_USE_MMC_SPI)
+#define HAL_USE_MMC_SPI             FALSE
+#endif
+
+#if !defined(HAL_USE_PWM)
+#define HAL_USE_PWM                 FALSE
+#endif
+
+#if !defined(HAL_USE_RTC)
+#define HAL_USE_RTC                 FALSE
+#endif
+
+#if !defined(HAL_USE_SDC)
+#define HAL_USE_SDC                 FALSE
+#endif
+
+#if !defined(HAL_USE_SERIAL)
+#define HAL_USE_SERIAL              TRUE
+#endif
+
+#if !defined(HAL_USE_SERIAL_USB)
+#define HAL_USE_SERIAL_USB          FALSE
+#endif
+
+#if !defined(HAL_USE_SPI)
+#define HAL_USE_SPI                 FALSE
+#endif
+
+#if !defined(HAL_USE_UART)
+#define HAL_USE_UART                FALSE
+#endif
+
+#if !defined(HAL_USE_USB)
+#define HAL_USE_USB                 FALSE
+#endif
+
+
+#if !defined(ADC_USE_WAIT)
+#define ADC_USE_WAIT                TRUE
+#endif
+
+#if !defined(ADC_USE_MUTUAL_EXCLUSION)
+#define ADC_USE_MUTUAL_EXCLUSION    TRUE
+#endif
+
+
+#if !defined(CAN_USE_SLEEP_MODE)
+#define CAN_USE_SLEEP_MODE          TRUE
+#endif
+
+
+#if !defined(I2C_USE_MUTUAL_EXCLUSION)
+#define I2C_USE_MUTUAL_EXCLUSION    TRUE
+#endif
+
+
+#if !defined(MAC_USE_ZERO_COPY)
+#define MAC_USE_ZERO_COPY           FALSE
+#endif
+
+#if !defined(MAC_USE_EVENTS)
+#define MAC_USE_EVENTS              TRUE
+#endif
+
+#if !defined(MMC_NICE_WAITING)
+#define MMC_NICE_WAITING            TRUE
+#endif
+
+
+#if !defined(SDC_INIT_RETRY)
+#define SDC_INIT_RETRY              100
+#endif
+
+#if !defined(SDC_MMC_SUPPORT)
+#define SDC_MMC_SUPPORT             FALSE
+#endif
+
+#if !defined(SDC_NICE_WAITING)
+#define SDC_NICE_WAITING            TRUE
+#endif
+
+
+#if !defined(SERIAL_DEFAULT_BITRATE)
+#define SERIAL_DEFAULT_BITRATE      115200
+#endif
+
+#if !defined(SERIAL_BUFFERS_SIZE)
+#define SERIAL_BUFFERS_SIZE         16
+#endif
+
+
+#if !defined(SPI_USE_WAIT)
+#define SPI_USE_WAIT                TRUE
+#endif
+
+#if !defined(SPI_USE_MUTUAL_EXCLUSION)
+#define SPI_USE_MUTUAL_EXCLUSION    TRUE
+#endif
+
+#endif

+ 50 - 0
stm32-chibios/main.c

@@ -0,0 +1,50 @@
+#include "ch.h"
+#include "hal.h"
+
+static WORKING_AREA(blinkyThreadArea, 128);
+
+static msg_t blinky(void *arg)
+{
+    (void)arg;
+    chRegSetThreadName("blinky");
+    for(;;)
+    {
+        palSetPad(GPIOH, GPIOH_LED1);
+        chThdSleepMilliseconds(500);
+
+        palClearPad(GPIOH, GPIOH_LED1);
+        chThdSleepMilliseconds(500);
+    }
+}
+
+
+static msg_t hello(void *arg)
+{
+    (void)arg;
+    chRegSetThreadName("hello");
+    while (TRUE)
+    {
+        palSetPad(GPIOH, GPIOH_LED1);
+        chThdSleepMilliseconds(500);
+
+        palClearPad(GPIOH, GPIOH_LED1);
+        chThdSleepMilliseconds(500);
+    }
+}
+
+int main(void) 
+{
+    halInit();
+    chSysInit();
+
+    sdStart(&SD3, NULL);
+    palSetPadMode(GPIOC, GPIOC_USART3_TX, PAL_MODE_ALTERNATE(7));
+    palSetPadMode(GPIOC, GPIOC_USART3_RX, PAL_MODE_ALTERNATE(7));
+
+    chThdCreateStatic(blinkyThreadArea, sizeof(blinkyThreadArea), NORMALPRIO, blinky, NULL);
+    for(;;)
+    {
+        chSequentialStreamWrite((BaseSequentialStream*)&SD3, "Hello, World!\r\n", sizeof("Hello, World!\r\n"));
+        chThdSleepMilliseconds(1000);
+    }
+}

+ 258 - 0
stm32-chibios/mcuconf.h

@@ -0,0 +1,258 @@
+#define STM32F4xx_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT                       FALSE
+#define STM32_HSI_ENABLED                   TRUE
+#define STM32_LSI_ENABLED                   TRUE
+#define STM32_HSE_ENABLED                   TRUE
+#define STM32_LSE_ENABLED                   FALSE
+#define STM32_CLOCK48_REQUIRED              TRUE
+#define STM32_SW                            STM32_SW_PLL
+#define STM32_PLLSRC                        STM32_PLLSRC_HSE
+#define STM32_PLLM_VALUE                    8
+#define STM32_PLLN_VALUE                    336
+#define STM32_PLLP_VALUE                    2
+#define STM32_PLLQ_VALUE                    7
+#define STM32_HPRE                          STM32_HPRE_DIV1
+#define STM32_PPRE1                         STM32_PPRE1_DIV4
+#define STM32_PPRE2                         STM32_PPRE2_DIV2
+#define STM32_RTCSEL                        STM32_RTCSEL_LSI
+#define STM32_RTCPRE_VALUE                  8
+#define STM32_MCO1SEL                       STM32_MCO1SEL_HSI
+#define STM32_MCO1PRE                       STM32_MCO1PRE_DIV1
+#define STM32_MCO2SEL                       STM32_MCO2SEL_SYSCLK
+#define STM32_MCO2PRE                       STM32_MCO2PRE_DIV5
+#define STM32_I2SSRC                        STM32_I2SSRC_CKIN
+#define STM32_PLLI2SN_VALUE                 192
+#define STM32_PLLI2SR_VALUE                 5
+#define STM32_PVD_ENABLE                    FALSE
+#define STM32_PLS                           STM32_PLS_LEV0
+#define STM32_BKPRAM_ENABLE                 FALSE
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_ADCPRE                    ADC_CCR_ADCPRE_DIV4
+#define STM32_ADC_USE_ADC1                  FALSE
+#define STM32_ADC_USE_ADC2                  FALSE
+#define STM32_ADC_USE_ADC3                  FALSE
+#define STM32_ADC_ADC1_DMA_STREAM           STM32_DMA_STREAM_ID(2, 4)
+#define STM32_ADC_ADC2_DMA_STREAM           STM32_DMA_STREAM_ID(2, 2)
+#define STM32_ADC_ADC3_DMA_STREAM           STM32_DMA_STREAM_ID(2, 1)
+#define STM32_ADC_ADC1_DMA_PRIORITY         2
+#define STM32_ADC_ADC2_DMA_PRIORITY         2
+#define STM32_ADC_ADC3_DMA_PRIORITY         2
+#define STM32_ADC_IRQ_PRIORITY              6
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY     6
+#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY     6
+#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY     6
+
+/*
+ * CAN driver system settings.
+ */
+#define STM32_CAN_USE_CAN1                  FALSE
+#define STM32_CAN_USE_CAN2                  FALSE
+#define STM32_CAN_CAN1_IRQ_PRIORITY         11
+#define STM32_CAN_CAN2_IRQ_PRIORITY         11
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI1_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI2_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI3_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI4_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6
+#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6
+#define STM32_EXT_EXTI16_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI17_IRQ_PRIORITY       15
+#define STM32_EXT_EXTI18_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI19_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI20_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI21_IRQ_PRIORITY       15
+#define STM32_EXT_EXTI22_IRQ_PRIORITY       15
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1                  FALSE
+#define STM32_GPT_USE_TIM2                  FALSE
+#define STM32_GPT_USE_TIM3                  FALSE
+#define STM32_GPT_USE_TIM4                  FALSE
+#define STM32_GPT_USE_TIM5                  FALSE
+#define STM32_GPT_USE_TIM6                  FALSE
+#define STM32_GPT_USE_TIM7                  FALSE
+#define STM32_GPT_USE_TIM8                  FALSE
+#define STM32_GPT_USE_TIM9                  FALSE
+#define STM32_GPT_USE_TIM11                 FALSE
+#define STM32_GPT_USE_TIM12                 FALSE
+#define STM32_GPT_USE_TIM14                 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY         7
+#define STM32_GPT_TIM2_IRQ_PRIORITY         7
+#define STM32_GPT_TIM3_IRQ_PRIORITY         7
+#define STM32_GPT_TIM4_IRQ_PRIORITY         7
+#define STM32_GPT_TIM5_IRQ_PRIORITY         7
+#define STM32_GPT_TIM6_IRQ_PRIORITY         7
+#define STM32_GPT_TIM7_IRQ_PRIORITY         7
+#define STM32_GPT_TIM8_IRQ_PRIORITY         7
+#define STM32_GPT_TIM9_IRQ_PRIORITY         7
+#define STM32_GPT_TIM11_IRQ_PRIORITY        7
+#define STM32_GPT_TIM12_IRQ_PRIORITY        7
+#define STM32_GPT_TIM14_IRQ_PRIORITY        7
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1                  FALSE
+#define STM32_I2C_USE_I2C2                  FALSE
+#define STM32_I2C_USE_I2C3                  FALSE
+#define STM32_I2C_I2C1_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 0)
+#define STM32_I2C_I2C1_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_I2C2_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 2)
+#define STM32_I2C_I2C2_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C3_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 2)
+#define STM32_I2C_I2C3_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 4)
+#define STM32_I2C_I2C1_IRQ_PRIORITY         5
+#define STM32_I2C_I2C2_IRQ_PRIORITY         5
+#define STM32_I2C_I2C3_IRQ_PRIORITY         5
+#define STM32_I2C_I2C1_DMA_PRIORITY         3
+#define STM32_I2C_I2C2_DMA_PRIORITY         3
+#define STM32_I2C_I2C3_DMA_PRIORITY         3
+#define STM32_I2C_I2C1_DMA_ERROR_HOOK()     chSysHalt()
+#define STM32_I2C_I2C2_DMA_ERROR_HOOK()     chSysHalt()
+#define STM32_I2C_I2C3_DMA_ERROR_HOOK()     chSysHalt()
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1                  FALSE
+#define STM32_ICU_USE_TIM2                  FALSE
+#define STM32_ICU_USE_TIM3                  FALSE
+#define STM32_ICU_USE_TIM4                  FALSE
+#define STM32_ICU_USE_TIM5                  FALSE
+#define STM32_ICU_USE_TIM8                  FALSE
+#define STM32_ICU_USE_TIM9                  FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY         7
+#define STM32_ICU_TIM2_IRQ_PRIORITY         7
+#define STM32_ICU_TIM3_IRQ_PRIORITY         7
+#define STM32_ICU_TIM4_IRQ_PRIORITY         7
+#define STM32_ICU_TIM5_IRQ_PRIORITY         7
+#define STM32_ICU_TIM8_IRQ_PRIORITY         7
+#define STM32_ICU_TIM9_IRQ_PRIORITY         7
+
+/*
+ * MAC driver system settings.
+ */
+#define STM32_MAC_TRANSMIT_BUFFERS          2
+#define STM32_MAC_RECEIVE_BUFFERS           4
+#define STM32_MAC_BUFFERS_SIZE              1522
+#define STM32_MAC_PHY_TIMEOUT               100
+#define STM32_MAC_ETH1_CHANGE_PHY_STATE     TRUE
+#define STM32_MAC_ETH1_IRQ_PRIORITY         13
+#define STM32_MAC_IP_CHECKSUM_OFFLOAD       0
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED              FALSE
+#define STM32_PWM_USE_TIM1                  FALSE
+#define STM32_PWM_USE_TIM2                  FALSE
+#define STM32_PWM_USE_TIM3                  FALSE
+#define STM32_PWM_USE_TIM4                  FALSE
+#define STM32_PWM_USE_TIM5                  FALSE
+#define STM32_PWM_USE_TIM8                  FALSE
+#define STM32_PWM_USE_TIM9                  FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY         7
+#define STM32_PWM_TIM2_IRQ_PRIORITY         7
+#define STM32_PWM_TIM3_IRQ_PRIORITY         7
+#define STM32_PWM_TIM4_IRQ_PRIORITY         7
+#define STM32_PWM_TIM5_IRQ_PRIORITY         7
+#define STM32_PWM_TIM8_IRQ_PRIORITY         7
+#define STM32_PWM_TIM9_IRQ_PRIORITY         7
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1             FALSE
+#define STM32_SERIAL_USE_USART2             FALSE
+#define STM32_SERIAL_USE_USART3             TRUE
+#define STM32_SERIAL_USE_UART4              FALSE
+#define STM32_SERIAL_USE_UART5              FALSE
+#define STM32_SERIAL_USE_USART6             FALSE
+#define STM32_SERIAL_USART1_PRIORITY        12
+#define STM32_SERIAL_USART2_PRIORITY        12
+#define STM32_SERIAL_USART3_PRIORITY        12
+#define STM32_SERIAL_UART4_PRIORITY         12
+#define STM32_SERIAL_UART5_PRIORITY         12
+#define STM32_SERIAL_USART6_PRIORITY        12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1                  FALSE
+#define STM32_SPI_USE_SPI2                  TRUE
+#define STM32_SPI_USE_SPI3                  FALSE
+#define STM32_SPI_SPI1_RX_DMA_STREAM        STM32_DMA_STREAM_ID(2, 0)
+#define STM32_SPI_SPI1_TX_DMA_STREAM        STM32_DMA_STREAM_ID(2, 3)
+#define STM32_SPI_SPI2_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 3)
+#define STM32_SPI_SPI2_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI3_RX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 0)
+#define STM32_SPI_SPI3_TX_DMA_STREAM        STM32_DMA_STREAM_ID(1, 7)
+#define STM32_SPI_SPI1_DMA_PRIORITY         1
+#define STM32_SPI_SPI2_DMA_PRIORITY         1
+#define STM32_SPI_SPI3_DMA_PRIORITY         1
+#define STM32_SPI_SPI1_IRQ_PRIORITY         10
+#define STM32_SPI_SPI2_IRQ_PRIORITY         10
+#define STM32_SPI_SPI3_IRQ_PRIORITY         10
+#define STM32_SPI_DMA_ERROR_HOOK(spip)      chSysHalt()
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1               FALSE
+#define STM32_UART_USE_USART2               FALSE
+#define STM32_UART_USE_USART3               FALSE
+#define STM32_UART_USE_UART4                FALSE
+#define STM32_UART_USE_UART5                FALSE
+#define STM32_UART_USE_USART6               FALSE
+#define STM32_UART_USART1_RX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 5)
+#define STM32_UART_USART1_TX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 7)
+#define STM32_UART_USART2_RX_DMA_STREAM     STM32_DMA_STREAM_ID(1, 5)
+#define STM32_UART_USART2_TX_DMA_STREAM     STM32_DMA_STREAM_ID(1, 6)
+#define STM32_UART_USART3_RX_DMA_STREAM     STM32_DMA_STREAM_ID(1, 1)
+#define STM32_UART_USART3_TX_DMA_STREAM     STM32_DMA_STREAM_ID(1, 3)
+#define STM32_UART_UART4_RX_DMA_STREAM      STM32_DMA_STREAM_ID(1, 2)
+#define STM32_UART_UART4_TX_DMA_STREAM      STM32_DMA_STREAM_ID(1, 4)
+#define STM32_UART_UART5_RX_DMA_STREAM      STM32_DMA_STREAM_ID(1, 0)
+#define STM32_UART_UART5_TX_DMA_STREAM      STM32_DMA_STREAM_ID(1, 7)
+#define STM32_UART_USART6_RX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 2)
+#define STM32_UART_USART6_TX_DMA_STREAM     STM32_DMA_STREAM_ID(2, 7)
+#define STM32_UART_USART1_IRQ_PRIORITY      12
+#define STM32_UART_USART2_IRQ_PRIORITY      12
+#define STM32_UART_USART3_IRQ_PRIORITY      12
+#define STM32_UART_UART4_IRQ_PRIORITY       12
+#define STM32_UART_UART5_IRQ_PRIORITY       12
+#define STM32_UART_USART6_IRQ_PRIORITY      12
+#define STM32_UART_USART1_DMA_PRIORITY      0
+#define STM32_UART_USART2_DMA_PRIORITY      0
+#define STM32_UART_USART3_DMA_PRIORITY      0
+#define STM32_UART_UART4_DMA_PRIORITY       0
+#define STM32_UART_UART5_DMA_PRIORITY       0
+#define STM32_UART_USART6_DMA_PRIORITY      0
+#define STM32_UART_DMA_ERROR_HOOK(uartp)    chSysHalt()
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_OTG1                  FALSE
+#define STM32_USB_USE_OTG2                  FALSE
+#define STM32_USB_OTG1_IRQ_PRIORITY         14
+#define STM32_USB_OTG2_IRQ_PRIORITY         14
+#define STM32_USB_OTG1_RX_FIFO_SIZE         512
+#define STM32_USB_OTG2_RX_FIFO_SIZE         1024
+#define STM32_USB_OTG_THREAD_PRIO           LOWPRIO
+#define STM32_USB_OTG_THREAD_STACK_SIZE     128
+#define STM32_USB_OTGFIFO_FILL_BASEPRI      0